fix ticket #631: temp leak when deleting slices
[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         self.free_subexpr_temps(code)
2609
2610     def generate_slice_guard_code(self, code, target_size):
2611         if not self.base.type.is_array:
2612             return
2613         slice_size = self.base.type.size
2614         start = stop = None
2615         if self.stop:
2616             stop = self.stop.result()
2617             try:
2618                 stop = int(stop)
2619                 if stop < 0:
2620                     slice_size = self.base.type.size + stop
2621                 else:
2622                     slice_size = stop
2623                 stop = None
2624             except ValueError:
2625                 pass
2626         if self.start:
2627             start = self.start.result()
2628             try:
2629                 start = int(start)
2630                 if start < 0:
2631                     start = self.base.type.size + start
2632                 slice_size -= start
2633                 start = None
2634             except ValueError:
2635                 pass
2636         check = None
2637         if slice_size < 0:
2638             if target_size > 0:
2639                 error(self.pos, "Assignment to empty slice.")
2640         elif start is None and stop is None:
2641             # we know the exact slice length
2642             if target_size != slice_size:
2643                 error(self.pos, "Assignment to slice of wrong length, expected %d, got %d" % (
2644                         slice_size, target_size))
2645         elif start is not None:
2646             if stop is None:
2647                 stop = slice_size
2648             check = "(%s)-(%s)" % (stop, start)
2649         else: # stop is not None:
2650             check = stop
2651         if check:
2652             code.putln("if (unlikely((%s) != %d)) {" % (check, target_size))
2653             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));' % (
2654                         target_size, check))
2655             code.putln(code.error_goto(self.pos))
2656             code.putln("}")
2657
2658     def start_code(self):
2659         if self.start:
2660             return self.start.result()
2661         else:
2662             return "0"
2663
2664     def stop_code(self):
2665         if self.stop:
2666             return self.stop.result()
2667         elif self.base.type.is_array:
2668             return self.base.type.size
2669         else:
2670             return "PY_SSIZE_T_MAX"
2671
2672     def calculate_result_code(self):
2673         # self.result() is not used, but this method must exist
2674         return "<unused>"
2675
2676
2677 class SliceNode(ExprNode):
2678     #  start:stop:step in subscript list
2679     #
2680     #  start     ExprNode
2681     #  stop      ExprNode
2682     #  step      ExprNode
2683
2684     type = py_object_type
2685     is_temp = 1
2686
2687     def calculate_constant_result(self):
2688         self.constant_result = self.base.constant_result[
2689             self.start.constant_result : \
2690                 self.stop.constant_result : \
2691                 self.step.constant_result]
2692
2693     def compile_time_value(self, denv):
2694         start = self.start.compile_time_value(denv)
2695         if self.stop is None:
2696             stop = None
2697         else:
2698             stop = self.stop.compile_time_value(denv)
2699         if self.step is None:
2700             step = None
2701         else:
2702             step = self.step.compile_time_value(denv)
2703         try:
2704             return slice(start, stop, step)
2705         except Exception, e:
2706             self.compile_time_value_error(e)
2707
2708     subexprs = ['start', 'stop', 'step']
2709
2710     def analyse_types(self, env):
2711         self.start.analyse_types(env)
2712         self.stop.analyse_types(env)
2713         self.step.analyse_types(env)
2714         self.start = self.start.coerce_to_pyobject(env)
2715         self.stop = self.stop.coerce_to_pyobject(env)
2716         self.step = self.step.coerce_to_pyobject(env)
2717
2718     gil_message = "Constructing Python slice object"
2719
2720     def generate_result_code(self, code):
2721         code.putln(
2722             "%s = PySlice_New(%s, %s, %s); %s" % (
2723                 self.result(),
2724                 self.start.py_result(),
2725                 self.stop.py_result(),
2726                 self.step.py_result(),
2727                 code.error_goto_if_null(self.result(), self.pos)))
2728         code.put_gotref(self.py_result())
2729
2730
2731 class CallNode(ExprNode):
2732
2733     # allow overriding the default 'may_be_none' behaviour
2734     may_return_none = None
2735
2736     def may_be_none(self):
2737         if self.may_return_none is not None:
2738             return self.may_return_none
2739         return ExprNode.may_be_none(self)
2740
2741     def analyse_as_type_constructor(self, env):
2742         type = self.function.analyse_as_type(env)
2743         if type and type.is_struct_or_union:
2744             args, kwds = self.explicit_args_kwds()
2745             items = []
2746             for arg, member in zip(args, type.scope.var_entries):
2747                 items.append(DictItemNode(pos=arg.pos, key=StringNode(pos=arg.pos, value=member.name), value=arg))
2748             if kwds:
2749                 items += kwds.key_value_pairs
2750             self.key_value_pairs = items
2751             self.__class__ = DictNode
2752             self.analyse_types(env)
2753             self.coerce_to(type, env)
2754             return True
2755         elif type and type.is_cpp_class:
2756             for arg in self.args:
2757                 arg.analyse_types(env)
2758             constructor = type.scope.lookup("<init>")
2759             self.function = RawCNameExprNode(self.function.pos, constructor.type)
2760             self.function.entry = constructor
2761             self.function.set_cname(type.declaration_code(""))
2762             self.analyse_c_function_call(env)
2763             return True
2764
2765     def is_lvalue(self):
2766         return self.type.is_reference
2767
2768     def nogil_check(self, env):
2769         func_type = self.function_type()
2770         if func_type.is_pyobject:
2771             self.gil_error()
2772         elif not getattr(func_type, 'nogil', False):
2773             self.gil_error()
2774
2775     gil_message = "Calling gil-requiring function"
2776
2777
2778 class SimpleCallNode(CallNode):
2779     #  Function call without keyword, * or ** args.
2780     #
2781     #  function       ExprNode
2782     #  args           [ExprNode]
2783     #  arg_tuple      ExprNode or None     used internally
2784     #  self           ExprNode or None     used internally
2785     #  coerced_self   ExprNode or None     used internally
2786     #  wrapper_call   bool                 used internally
2787     #  has_optional_args   bool            used internally
2788     #  nogil          bool                 used internally
2789
2790     subexprs = ['self', 'coerced_self', 'function', 'args', 'arg_tuple']
2791
2792     self = None
2793     coerced_self = None
2794     arg_tuple = None
2795     wrapper_call = False
2796     has_optional_args = False
2797     nogil = False
2798     analysed = False
2799
2800     def compile_time_value(self, denv):
2801         function = self.function.compile_time_value(denv)
2802         args = [arg.compile_time_value(denv) for arg in self.args]
2803         try:
2804             return function(*args)
2805         except Exception, e:
2806             self.compile_time_value_error(e)
2807
2808     def type_dependencies(self, env):
2809         # TODO: Update when Danilo's C++ code merged in to handle the
2810         # the case of function overloading.
2811         return self.function.type_dependencies(env)
2812
2813     def infer_type(self, env):
2814         function = self.function
2815         func_type = function.infer_type(env)
2816         if isinstance(self.function, NewExprNode):
2817             return PyrexTypes.CPtrType(self.function.class_type)
2818         if func_type.is_ptr:
2819             func_type = func_type.base_type
2820         if func_type.is_cfunction:
2821             return func_type.return_type
2822         elif func_type is type_type:
2823             if function.is_name and function.entry and function.entry.type:
2824                 result_type = function.entry.type
2825                 if result_type.is_extension_type:
2826                     return result_type
2827                 elif result_type.is_builtin_type:
2828                     if function.entry.name == 'float':
2829                         return PyrexTypes.c_double_type
2830                     elif function.entry.name in Builtin.types_that_construct_their_instance:
2831                         return result_type
2832         return py_object_type
2833
2834     def analyse_as_type(self, env):
2835         attr = self.function.as_cython_attribute()
2836         if attr == 'pointer':
2837             if len(self.args) != 1:
2838                 error(self.args.pos, "only one type allowed.")
2839             else:
2840                 type = self.args[0].analyse_as_type(env)
2841                 if not type:
2842                     error(self.args[0].pos, "Unknown type")
2843                 else:
2844                     return PyrexTypes.CPtrType(type)
2845
2846     def explicit_args_kwds(self):
2847         return self.args, None
2848
2849     def analyse_types(self, env):
2850         if self.analyse_as_type_constructor(env):
2851             return
2852         if self.analysed:
2853             return
2854         self.analysed = True
2855         function = self.function
2856         function.is_called = 1
2857         self.function.analyse_types(env)
2858         if function.is_attribute and function.entry and function.entry.is_cmethod:
2859             # Take ownership of the object from which the attribute
2860             # was obtained, because we need to pass it as 'self'.
2861             self.self = function.obj
2862             function.obj = CloneNode(self.self)
2863         func_type = self.function_type()
2864         if func_type.is_pyobject:
2865             self.arg_tuple = TupleNode(self.pos, args = self.args)
2866             self.arg_tuple.analyse_types(env)
2867             self.args = None
2868             if func_type is Builtin.type_type and function.is_name and \
2869                    function.entry and \
2870                    function.entry.is_builtin and \
2871                    function.entry.name in Builtin.types_that_construct_their_instance:
2872                 # calling a builtin type that returns a specific object type
2873                 if function.entry.name == 'float':
2874                     # the following will come true later on in a transform
2875                     self.type = PyrexTypes.c_double_type
2876                     self.result_ctype = PyrexTypes.c_double_type
2877                 else:
2878                     self.type = Builtin.builtin_types[function.entry.name]
2879                     self.result_ctype = py_object_type
2880                 self.may_return_none = False
2881             elif function.is_name and function.type_entry:
2882                 # We are calling an extension type constructor.  As
2883                 # long as we do not support __new__(), the result type
2884                 # is clear
2885                 self.type = function.type_entry.type
2886                 self.result_ctype = py_object_type
2887                 self.may_return_none = False
2888             else:
2889                 self.type = py_object_type
2890             self.is_temp = 1
2891         else:
2892             for arg in self.args:
2893                 arg.analyse_types(env)
2894             if self.self and func_type.args:
2895                 # Coerce 'self' to the type expected by the method.
2896                 self_arg = func_type.args[0]
2897                 if self_arg.not_none: # C methods must do the None test for self at *call* time
2898                     self.self = self.self.as_none_safe_node(
2899                         "'NoneType' object has no attribute '%s'" % self.function.entry.name,
2900                         'PyExc_AttributeError')
2901                 expected_type = self_arg.type
2902                 self.coerced_self = CloneNode(self.self).coerce_to(
2903                     expected_type, env)
2904                 # Insert coerced 'self' argument into argument list.
2905                 self.args.insert(0, self.coerced_self)
2906             self.analyse_c_function_call(env)
2907
2908     def function_type(self):
2909         # Return the type of the function being called, coercing a function
2910         # pointer to a function if necessary.
2911         func_type = self.function.type
2912         if func_type.is_ptr:
2913             func_type = func_type.base_type
2914         return func_type
2915
2916     def analyse_c_function_call(self, env):
2917         if self.function.type is error_type:
2918             self.type = error_type
2919             return
2920         if self.function.type.is_cpp_class:
2921             overloaded_entry = self.function.type.scope.lookup("operator()")
2922             if overloaded_entry is None:
2923                 self.type = PyrexTypes.error_type
2924                 self.result_code = "<error>"
2925                 return
2926         elif hasattr(self.function, 'entry'):
2927             overloaded_entry = self.function.entry
2928         else:
2929             overloaded_entry = None
2930         if overloaded_entry:
2931             entry = PyrexTypes.best_match(self.args, overloaded_entry.all_alternatives(), self.pos)
2932             if not entry:
2933                 self.type = PyrexTypes.error_type
2934                 self.result_code = "<error>"
2935                 return
2936             self.function.entry = entry
2937             self.function.type = entry.type
2938             func_type = self.function_type()
2939         else:
2940             func_type = self.function_type()
2941             if not func_type.is_cfunction:
2942                 error(self.pos, "Calling non-function type '%s'" % func_type)
2943                 self.type = PyrexTypes.error_type
2944                 self.result_code = "<error>"
2945                 return
2946         # Check no. of args
2947         max_nargs = len(func_type.args)
2948         expected_nargs = max_nargs - func_type.optional_arg_count
2949         actual_nargs = len(self.args)
2950         if func_type.optional_arg_count and expected_nargs != actual_nargs:
2951             self.has_optional_args = 1
2952             self.is_temp = 1
2953         # Coerce arguments
2954         for i in range(min(max_nargs, actual_nargs)):
2955             formal_type = func_type.args[i].type
2956             self.args[i] = self.args[i].coerce_to(formal_type, env)
2957         for i in range(max_nargs, actual_nargs):
2958             if self.args[i].type.is_pyobject:
2959                 error(self.args[i].pos,
2960                     "Python object cannot be passed as a varargs parameter")
2961         # Calc result type and code fragment
2962         if isinstance(self.function, NewExprNode):
2963             self.type = PyrexTypes.CPtrType(self.function.class_type)
2964         else:
2965             self.type = func_type.return_type
2966         if self.type.is_pyobject:
2967             self.result_ctype = py_object_type
2968             self.is_temp = 1
2969         elif func_type.exception_value is not None \
2970                  or func_type.exception_check:
2971             self.is_temp = 1
2972         # Called in 'nogil' context?
2973         self.nogil = env.nogil
2974         if (self.nogil and
2975             func_type.exception_check and
2976             func_type.exception_check != '+'):
2977             env.use_utility_code(pyerr_occurred_withgil_utility_code)
2978         # C++ exception handler
2979         if func_type.exception_check == '+':
2980             if func_type.exception_value is None:
2981                 env.use_utility_code(cpp_exception_utility_code)
2982
2983     def calculate_result_code(self):
2984         return self.c_call_code()
2985
2986     def c_call_code(self):
2987         func_type = self.function_type()
2988         if self.type is PyrexTypes.error_type or not func_type.is_cfunction:
2989             return "<error>"
2990         formal_args = func_type.args
2991         arg_list_code = []
2992         args = list(zip(formal_args, self.args))
2993         max_nargs = len(func_type.args)
2994         expected_nargs = max_nargs - func_type.optional_arg_count
2995         actual_nargs = len(self.args)
2996         for formal_arg, actual_arg in args[:expected_nargs]:
2997                 arg_code = actual_arg.result_as(formal_arg.type)
2998                 arg_list_code.append(arg_code)
2999
3000         if func_type.is_overridable:
3001             arg_list_code.append(str(int(self.wrapper_call or self.function.entry.is_unbound_cmethod)))
3002
3003         if func_type.optional_arg_count:
3004             if expected_nargs == actual_nargs:
3005                 optional_args = 'NULL'
3006             else:
3007                 optional_args = "&%s" % self.opt_arg_struct
3008             arg_list_code.append(optional_args)
3009
3010         for actual_arg in self.args[len(formal_args):]:
3011             arg_list_code.append(actual_arg.result())
3012         result = "%s(%s)" % (self.function.result(),
3013             ', '.join(arg_list_code))
3014         return result
3015
3016     def generate_result_code(self, code):
3017         func_type = self.function_type()
3018         if func_type.is_pyobject:
3019             arg_code = self.arg_tuple.py_result()
3020             code.putln(
3021                 "%s = PyObject_Call(%s, %s, NULL); %s" % (
3022                     self.result(),
3023                     self.function.py_result(),
3024                     arg_code,
3025                     code.error_goto_if_null(self.result(), self.pos)))
3026             code.put_gotref(self.py_result())
3027         elif func_type.is_cfunction:
3028             if self.has_optional_args:
3029                 actual_nargs = len(self.args)
3030                 expected_nargs = len(func_type.args) - func_type.optional_arg_count
3031                 self.opt_arg_struct = code.funcstate.allocate_temp(
3032                     func_type.op_arg_struct.base_type, manage_ref=True)
3033                 code.putln("%s.%s = %s;" % (
3034                         self.opt_arg_struct,
3035                         Naming.pyrex_prefix + "n",
3036                         len(self.args) - expected_nargs))
3037                 args = list(zip(func_type.args, self.args))
3038                 for formal_arg, actual_arg in args[expected_nargs:actual_nargs]:
3039                     code.putln("%s.%s = %s;" % (
3040                             self.opt_arg_struct,
3041                             func_type.opt_arg_cname(formal_arg.name),
3042                             actual_arg.result_as(formal_arg.type)))
3043             exc_checks = []
3044             if self.type.is_pyobject and self.is_temp:
3045                 exc_checks.append("!%s" % self.result())
3046             else:
3047                 exc_val = func_type.exception_value
3048                 exc_check = func_type.exception_check
3049                 if exc_val is not None:
3050                     exc_checks.append("%s == %s" % (self.result(), exc_val))
3051                 if exc_check:
3052                     if self.nogil:
3053                         exc_checks.append("__Pyx_ErrOccurredWithGIL()")
3054                     else:
3055                         exc_checks.append("PyErr_Occurred()")
3056             if self.is_temp or exc_checks:
3057                 rhs = self.c_call_code()
3058                 if self.result():
3059                     lhs = "%s = " % self.result()
3060                     if self.is_temp and self.type.is_pyobject:
3061                         #return_type = self.type # func_type.return_type
3062                         #print "SimpleCallNode.generate_result_code: casting", rhs, \
3063                         #    "from", return_type, "to pyobject" ###
3064                         rhs = typecast(py_object_type, self.type, rhs)
3065                 else:
3066                     lhs = ""
3067                 if func_type.exception_check == '+':
3068                     if func_type.exception_value is None:
3069                         raise_py_exception = "__Pyx_CppExn2PyErr()"
3070                     elif func_type.exception_value.type.is_pyobject:
3071                         raise_py_exception = ' try { throw; } catch(const std::exception& exn) { PyErr_SetString(%s, exn.what()); } catch(...) { PyErr_SetNone(%s); }' % (
3072                             func_type.exception_value.entry.cname,
3073                             func_type.exception_value.entry.cname)
3074                     else:
3075                         raise_py_exception = '%s(); if (!PyErr_Occurred()) PyErr_SetString(PyExc_RuntimeError , "Error converting c++ exception.")' % func_type.exception_value.entry.cname
3076                     if self.nogil:
3077                         raise_py_exception = 'Py_BLOCK_THREADS; %s; Py_UNBLOCK_THREADS' % raise_py_exception
3078                     code.putln(
3079                     "try {%s%s;} catch(...) {%s; %s}" % (
3080                         lhs,
3081                         rhs,
3082                         raise_py_exception,
3083                         code.error_goto(self.pos)))
3084                 else:
3085                     if exc_checks:
3086                         goto_error = code.error_goto_if(" && ".join(exc_checks), self.pos)
3087                     else:
3088                         goto_error = ""
3089                     code.putln("%s%s; %s" % (lhs, rhs, goto_error))
3090                 if self.type.is_pyobject and self.result():
3091                     code.put_gotref(self.py_result())
3092             if self.has_optional_args:
3093                 code.funcstate.release_temp(self.opt_arg_struct)
3094
3095
3096 class PythonCapiFunctionNode(ExprNode):
3097     subexprs = []
3098     def __init__(self, pos, py_name, cname, func_type, utility_code = None):
3099         self.pos = pos
3100         self.name = py_name
3101         self.cname = cname
3102         self.type = func_type
3103         self.utility_code = utility_code
3104
3105     def analyse_types(self, env):
3106         pass
3107
3108     def generate_result_code(self, code):
3109         if self.utility_code:
3110             code.globalstate.use_utility_code(self.utility_code)
3111
3112     def calculate_result_code(self):
3113         return self.cname
3114
3115 class PythonCapiCallNode(SimpleCallNode):
3116     # Python C-API Function call (only created in transforms)
3117
3118     # By default, we assume that the call never returns None, as this
3119     # is true for most C-API functions in CPython.  If this does not
3120     # apply to a call, set the following to True (or None to inherit
3121     # the default behaviour).
3122     may_return_none = False
3123
3124     def __init__(self, pos, function_name, func_type,
3125                  utility_code = None, py_name=None, **kwargs):
3126         self.type = func_type.return_type
3127         self.result_ctype = self.type
3128         self.function = PythonCapiFunctionNode(
3129             pos, py_name, function_name, func_type,
3130             utility_code = utility_code)
3131         # call this last so that we can override the constructed
3132         # attributes above with explicit keyword arguments if required
3133         SimpleCallNode.__init__(self, pos, **kwargs)
3134
3135
3136 class GeneralCallNode(CallNode):
3137     #  General Python function call, including keyword,
3138     #  * and ** arguments.
3139     #
3140     #  function         ExprNode
3141     #  positional_args  ExprNode          Tuple of positional arguments
3142     #  keyword_args     ExprNode or None  Dict of keyword arguments
3143     #  starstar_arg     ExprNode or None  Dict of extra keyword args
3144
3145     type = py_object_type
3146
3147     subexprs = ['function', 'positional_args', 'keyword_args', 'starstar_arg']
3148
3149     nogil_check = Node.gil_error
3150
3151     def compile_time_value(self, denv):
3152         function = self.function.compile_time_value(denv)
3153         positional_args = self.positional_args.compile_time_value(denv)
3154         keyword_args = self.keyword_args.compile_time_value(denv)
3155         starstar_arg = self.starstar_arg.compile_time_value(denv)
3156         try:
3157             keyword_args.update(starstar_arg)
3158             return function(*positional_args, **keyword_args)
3159         except Exception, e:
3160             self.compile_time_value_error(e)
3161
3162     def explicit_args_kwds(self):
3163         if self.starstar_arg or not isinstance(self.positional_args, TupleNode):
3164             raise CompileError(self.pos,
3165                 'Compile-time keyword arguments must be explicit.')
3166         return self.positional_args.args, self.keyword_args
3167
3168     def analyse_types(self, env):
3169         if self.analyse_as_type_constructor(env):
3170             return
3171         self.function.analyse_types(env)
3172         self.positional_args.analyse_types(env)
3173         if self.keyword_args:
3174             self.keyword_args.analyse_types(env)
3175         if self.starstar_arg:
3176             self.starstar_arg.analyse_types(env)
3177         if not self.function.type.is_pyobject:
3178             if self.function.type.is_error:
3179                 self.type = error_type
3180                 return
3181             if hasattr(self.function, 'entry') and not self.function.entry.as_variable:
3182                 error(self.pos, "Keyword and starred arguments not allowed in cdef functions.")
3183             else:
3184                 self.function = self.function.coerce_to_pyobject(env)
3185         self.positional_args = \
3186             self.positional_args.coerce_to_pyobject(env)
3187         if self.starstar_arg:
3188             self.starstar_arg = \
3189                 self.starstar_arg.coerce_to_pyobject(env)
3190         function = self.function
3191         if function.is_name and function.type_entry:
3192             # We are calling an extension type constructor.  As long
3193             # as we do not support __new__(), the result type is clear
3194             self.type = function.type_entry.type
3195             self.result_ctype = py_object_type
3196             self.may_return_none = False
3197         else:
3198             self.type = py_object_type
3199         self.is_temp = 1
3200
3201     def generate_result_code(self, code):
3202         if self.type.is_error: return
3203         kwargs_call_function = "PyEval_CallObjectWithKeywords"
3204         if self.keyword_args and self.starstar_arg:
3205             code.put_error_if_neg(self.pos,
3206                 "PyDict_Update(%s, %s)" % (
3207                     self.keyword_args.py_result(),
3208                     self.starstar_arg.py_result()))
3209             keyword_code = self.keyword_args.py_result()
3210         elif self.keyword_args:
3211             keyword_code = self.keyword_args.py_result()
3212         elif self.starstar_arg:
3213             keyword_code = self.starstar_arg.py_result()
3214             if self.starstar_arg.type is not Builtin.dict_type:
3215                 # CPython supports calling functions with non-dicts, so do we
3216                 code.globalstate.use_utility_code(kwargs_call_utility_code)
3217                 kwargs_call_function = "__Pyx_PyEval_CallObjectWithKeywords"
3218         else:
3219             keyword_code = None
3220         if not keyword_code:
3221             call_code = "PyObject_Call(%s, %s, NULL)" % (
3222                 self.function.py_result(),
3223                 self.positional_args.py_result())
3224         else:
3225             call_code = "%s(%s, %s, %s)" % (
3226                 kwargs_call_function,
3227                 self.function.py_result(),
3228                 self.positional_args.py_result(),
3229                 keyword_code)
3230         code.putln(
3231             "%s = %s; %s" % (
3232                 self.result(),
3233                 call_code,
3234                 code.error_goto_if_null(self.result(), self.pos)))
3235         code.put_gotref(self.py_result())
3236
3237
3238 class AsTupleNode(ExprNode):
3239     #  Convert argument to tuple. Used for normalising
3240     #  the * argument of a function call.
3241     #
3242     #  arg    ExprNode
3243
3244     subexprs = ['arg']
3245
3246     def calculate_constant_result(self):
3247         self.constant_result = tuple(self.base.constant_result)
3248
3249     def compile_time_value(self, denv):
3250         arg = self.arg.compile_time_value(denv)
3251         try:
3252             return tuple(arg)
3253         except Exception, e:
3254             self.compile_time_value_error(e)
3255
3256     def analyse_types(self, env):
3257         self.arg.analyse_types(env)
3258         self.arg = self.arg.coerce_to_pyobject(env)
3259         self.type = tuple_type
3260         self.is_temp = 1
3261
3262     def may_be_none(self):
3263         return False
3264
3265     nogil_check = Node.gil_error
3266     gil_message = "Constructing Python tuple"
3267
3268     def generate_result_code(self, code):
3269         code.putln(
3270             "%s = PySequence_Tuple(%s); %s" % (
3271                 self.result(),
3272                 self.arg.py_result(),
3273                 code.error_goto_if_null(self.result(), self.pos)))
3274         code.put_gotref(self.py_result())
3275
3276
3277 class AttributeNode(ExprNode):
3278     #  obj.attribute
3279     #
3280     #  obj          ExprNode
3281     #  attribute    string
3282     #  needs_none_check boolean        Used if obj is an extension type.
3283     #                                  If set to True, it is known that the type is not None.
3284     #
3285     #  Used internally:
3286     #
3287     #  is_py_attr           boolean   Is a Python getattr operation
3288     #  member               string    C name of struct member
3289     #  is_called            boolean   Function call is being done on result
3290     #  entry                Entry     Symbol table entry of attribute
3291
3292     is_attribute = 1
3293     subexprs = ['obj']
3294
3295     type = PyrexTypes.error_type
3296     entry = None
3297     is_called = 0
3298     needs_none_check = True
3299
3300     def as_cython_attribute(self):
3301         if isinstance(self.obj, NameNode) and self.obj.is_cython_module:
3302             return self.attribute
3303         cy = self.obj.as_cython_attribute()
3304         if cy:
3305             return "%s.%s" % (cy, self.attribute)
3306
3307     def coerce_to(self, dst_type, env):
3308         #  If coercing to a generic pyobject and this is a cpdef function
3309         #  we can create the corresponding attribute
3310         if dst_type is py_object_type:
3311             entry = self.entry
3312             if entry and entry.is_cfunction and entry.as_variable:
3313                 # must be a cpdef function
3314                 self.is_temp = 1
3315                 self.entry = entry.as_variable
3316                 self.analyse_as_python_attribute(env)
3317                 return self
3318         return ExprNode.coerce_to(self, dst_type, env)
3319
3320     def calculate_constant_result(self):
3321         attr = self.attribute
3322         if attr.startswith("__") and attr.endswith("__"):
3323             return
3324         self.constant_result = getattr(self.obj.constant_result, attr)
3325
3326     def compile_time_value(self, denv):
3327         attr = self.attribute
3328         if attr.startswith("__") and attr.endswith("__"):
3329             error(self.pos,
3330                   "Invalid attribute name '%s' in compile-time expression" % attr)
3331             return None
3332         obj = self.obj.compile_time_value(denv)
3333         try:
3334             return getattr(obj, attr)
3335         except Exception, e:
3336             self.compile_time_value_error(e)
3337
3338     def type_dependencies(self, env):
3339         return self.obj.type_dependencies(env)
3340
3341     def infer_type(self, env):
3342         if self.analyse_as_cimported_attribute(env, 0):
3343             return self.entry.type
3344         elif self.analyse_as_unbound_cmethod(env):
3345             return self.entry.type
3346         else:
3347             self.analyse_attribute(env, obj_type = self.obj.infer_type(env))
3348             return self.type
3349
3350     def analyse_target_declaration(self, env):
3351         pass
3352
3353     def analyse_target_types(self, env):
3354         self.analyse_types(env, target = 1)
3355
3356     def analyse_types(self, env, target = 0):
3357         if self.analyse_as_cimported_attribute(env, target):
3358             return
3359         if not target and self.analyse_as_unbound_cmethod(env):
3360             return
3361         self.analyse_as_ordinary_attribute(env, target)
3362
3363     def analyse_as_cimported_attribute(self, env, target):
3364         # Try to interpret this as a reference to an imported
3365         # C const, type, var or function. If successful, mutates
3366         # this node into a NameNode and returns 1, otherwise
3367         # returns 0.
3368         module_scope = self.obj.analyse_as_module(env)
3369         if module_scope:
3370             entry = module_scope.lookup_here(self.attribute)
3371             if entry and (
3372                 entry.is_cglobal or entry.is_cfunction
3373                 or entry.is_type or entry.is_const):
3374                     self.mutate_into_name_node(env, entry, target)
3375                     return 1
3376         return 0
3377
3378     def analyse_as_unbound_cmethod(self, env):
3379         # Try to interpret this as a reference to an unbound
3380         # C method of an extension type. If successful, mutates
3381         # this node into a NameNode and returns 1, otherwise
3382         # returns 0.
3383         type = self.obj.analyse_as_extension_type(env)
3384         if type:
3385             entry = type.scope.lookup_here(self.attribute)
3386             if entry and entry.is_cmethod:
3387                 # Create a temporary entry describing the C method
3388                 # as an ordinary function.
3389                 ubcm_entry = Symtab.Entry(entry.name,
3390                     "%s->%s" % (type.vtabptr_cname, entry.cname),
3391                     entry.type)
3392                 ubcm_entry.is_cfunction = 1
3393                 ubcm_entry.func_cname = entry.func_cname
3394                 ubcm_entry.is_unbound_cmethod = 1
3395                 self.mutate_into_name_node(env, ubcm_entry, None)
3396                 return 1
3397         return 0
3398
3399     def analyse_as_type(self, env):
3400         module_scope = self.obj.analyse_as_module(env)
3401         if module_scope:
3402             return module_scope.lookup_type(self.attribute)
3403         if not isinstance(self.obj, (UnicodeNode, StringNode, BytesNode)):
3404             base_type = self.obj.analyse_as_type(env)
3405             if base_type and hasattr(base_type, 'scope') and base_type.scope is not None:
3406                 return base_type.scope.lookup_type(self.attribute)
3407         return None
3408
3409     def analyse_as_extension_type(self, env):
3410         # Try to interpret this as a reference to an extension type
3411         # in a cimported module. Returns the extension type, or None.
3412         module_scope = self.obj.analyse_as_module(env)
3413         if module_scope:
3414             entry = module_scope.lookup_here(self.attribute)
3415             if entry and entry.is_type and entry.type.is_extension_type:
3416                 return entry.type
3417         return None
3418
3419     def analyse_as_module(self, env):
3420         # Try to interpret this as a reference to a cimported module
3421         # in another cimported module. Returns the module scope, or None.
3422         module_scope = self.obj.analyse_as_module(env)
3423         if module_scope:
3424             entry = module_scope.lookup_here(self.attribute)
3425             if entry and entry.as_module:
3426                 return entry.as_module
3427         return None
3428
3429     def mutate_into_name_node(self, env, entry, target):
3430         # Mutate this node into a NameNode and complete the
3431         # analyse_types phase.
3432         self.__class__ = NameNode
3433         self.name = self.attribute
3434         self.entry = entry
3435         del self.obj
3436         del self.attribute
3437         if target:
3438             NameNode.analyse_target_types(self, env)
3439         else:
3440             NameNode.analyse_rvalue_entry(self, env)
3441
3442     def analyse_as_ordinary_attribute(self, env, target):
3443         self.obj.analyse_types(env)
3444         self.analyse_attribute(env)
3445         if self.entry and self.entry.is_cmethod and not self.is_called:
3446 #            error(self.pos, "C method can only be called")
3447             pass
3448         ## Reference to C array turns into pointer to first element.
3449         #while self.type.is_array:
3450         #    self.type = self.type.element_ptr_type()
3451         if self.is_py_attr:
3452             if not target:
3453                 self.is_temp = 1
3454                 self.result_ctype = py_object_type
3455         elif target and self.obj.type.is_builtin_type:
3456             error(self.pos, "Assignment to an immutable object field")
3457
3458     def analyse_attribute(self, env, obj_type = None):
3459         # Look up attribute and set self.type and self.member.
3460         self.is_py_attr = 0
3461         self.member = self.attribute
3462         if obj_type is None:
3463             if self.obj.type.is_string:
3464                 self.obj = self.obj.coerce_to_pyobject(env)
3465             obj_type = self.obj.type
3466         else:
3467             if obj_type.is_string:
3468                 obj_type = py_object_type
3469         if obj_type.is_ptr or obj_type.is_array:
3470             obj_type = obj_type.base_type
3471             self.op = "->"
3472         elif obj_type.is_extension_type or obj_type.is_builtin_type:
3473             self.op = "->"
3474         else:
3475             self.op = "."
3476         if obj_type.has_attributes:
3477             entry = None
3478             if obj_type.attributes_known():
3479                 entry = obj_type.scope.lookup_here(self.attribute)
3480                 if entry and entry.is_member:
3481                     entry = None
3482             else:
3483                 error(self.pos,
3484                     "Cannot select attribute of incomplete type '%s'"
3485                     % obj_type)
3486                 self.type = PyrexTypes.error_type
3487                 return
3488             self.entry = entry
3489             if entry:
3490                 if obj_type.is_extension_type and entry.name == "__weakref__":
3491                     error(self.pos, "Illegal use of special attribute __weakref__")
3492                 # methods need the normal attribute lookup
3493                 # because they do not have struct entries
3494                 if entry.is_variable or entry.is_cmethod:
3495                     self.type = entry.type
3496                     self.member = entry.cname
3497                     return
3498                 else:
3499                     # If it's not a variable or C method, it must be a Python
3500                     # method of an extension type, so we treat it like a Python
3501                     # attribute.
3502                     pass
3503         # If we get here, the base object is not a struct/union/extension
3504         # type, or it is an extension type and the attribute is either not
3505         # declared or is declared as a Python method. Treat it as a Python
3506         # attribute reference.
3507         self.analyse_as_python_attribute(env, obj_type)
3508
3509     def analyse_as_python_attribute(self, env, obj_type = None):
3510         if obj_type is None:
3511             obj_type = self.obj.type
3512         self.member = self.attribute
3513         self.type = py_object_type
3514         self.is_py_attr = 1
3515         if not obj_type.is_pyobject and not obj_type.is_error:
3516             if obj_type.can_coerce_to_pyobject(env):
3517                 self.obj = self.obj.coerce_to_pyobject(env)
3518             else:
3519                 error(self.pos,
3520                       "Object of type '%s' has no attribute '%s'" %
3521                       (obj_type, self.attribute))
3522
3523     def nogil_check(self, env):
3524         if self.is_py_attr:
3525             self.gil_error()
3526
3527     gil_message = "Accessing Python attribute"
3528
3529     def is_simple(self):
3530         if self.obj:
3531             return self.result_in_temp() or self.obj.is_simple()
3532         else:
3533             return NameNode.is_simple(self)
3534
3535     def is_lvalue(self):
3536         if self.obj:
3537             return 1
3538         else:
3539             return NameNode.is_lvalue(self)
3540
3541     def is_ephemeral(self):
3542         if self.obj:
3543             return self.obj.is_ephemeral()
3544         else:
3545             return NameNode.is_ephemeral(self)
3546
3547     def calculate_result_code(self):
3548         #print "AttributeNode.calculate_result_code:", self.member ###
3549         #print "...obj node =", self.obj, "code", self.obj.result() ###
3550         #print "...obj type", self.obj.type, "ctype", self.obj.ctype() ###
3551         obj = self.obj
3552         obj_code = obj.result_as(obj.type)
3553         #print "...obj_code =", obj_code ###
3554         if self.entry and self.entry.is_cmethod:
3555             if obj.type.is_extension_type:
3556                 return "((struct %s *)%s%s%s)->%s" % (
3557                     obj.type.vtabstruct_cname, obj_code, self.op,
3558                     obj.type.vtabslot_cname, self.member)
3559             else:
3560                 return self.member
3561         elif obj.type.is_complex:
3562             return "__Pyx_C%s(%s)" % (self.member.upper(), obj_code)
3563         else:
3564             if obj.type.is_builtin_type and self.entry and self.entry.is_variable:
3565                 # accessing a field of a builtin type, need to cast better than result_as() does
3566                 obj_code = obj.type.cast_code(obj.result(), to_object_struct = True)
3567             return "%s%s%s" % (obj_code, self.op, self.member)
3568
3569     def generate_result_code(self, code):
3570         interned_attr_cname = code.intern_identifier(self.attribute)
3571         if self.is_py_attr:
3572             code.putln(
3573                 '%s = PyObject_GetAttr(%s, %s); %s' % (
3574                     self.result(),
3575                     self.obj.py_result(),
3576                     interned_attr_cname,
3577                     code.error_goto_if_null(self.result(), self.pos)))
3578             code.put_gotref(self.py_result())
3579         else:
3580             # result_code contains what is needed, but we may need to insert
3581             # a check and raise an exception
3582             if (self.obj.type.is_extension_type
3583                   and self.needs_none_check
3584                   and code.globalstate.directives['nonecheck']):
3585                 self.put_nonecheck(code)
3586
3587     def generate_assignment_code(self, rhs, code):
3588         interned_attr_cname = code.intern_identifier(self.attribute)
3589         self.obj.generate_evaluation_code(code)
3590         if self.is_py_attr:
3591             code.put_error_if_neg(self.pos,
3592                 'PyObject_SetAttr(%s, %s, %s)' % (
3593                     self.obj.py_result(),
3594                     interned_attr_cname,
3595                     rhs.py_result()))
3596             rhs.generate_disposal_code(code)
3597             rhs.free_temps(code)
3598         elif self.obj.type.is_complex:
3599             code.putln("__Pyx_SET_C%s(%s, %s);" % (
3600                 self.member.upper(),
3601                 self.obj.result_as(self.obj.type),
3602                 rhs.result_as(self.ctype())))
3603         else:
3604             if (self.obj.type.is_extension_type
3605                   and self.needs_none_check
3606                   and code.globalstate.directives['nonecheck']):
3607                 self.put_nonecheck(code)
3608
3609             select_code = self.result()
3610             if self.type.is_pyobject and self.use_managed_ref:
3611                 rhs.make_owned_reference(code)
3612                 code.put_giveref(rhs.py_result())
3613                 code.put_gotref(select_code)
3614                 code.put_decref(select_code, self.ctype())
3615             code.putln(
3616                 "%s = %s;" % (
3617                     select_code,
3618                     rhs.result_as(self.ctype())))
3619                     #rhs.result()))
3620             rhs.generate_post_assignment_code(code)
3621             rhs.free_temps(code)
3622         self.obj.generate_disposal_code(code)
3623         self.obj.free_temps(code)
3624
3625     def generate_deletion_code(self, code):
3626         interned_attr_cname = code.intern_identifier(self.attribute)
3627         self.obj.generate_evaluation_code(code)
3628         if self.is_py_attr or (isinstance(self.entry.scope, Symtab.PropertyScope)
3629                                and u'__del__' in self.entry.scope.entries):
3630             code.put_error_if_neg(self.pos,
3631                 'PyObject_DelAttr(%s, %s)' % (
3632                     self.obj.py_result(),
3633                     interned_attr_cname))
3634         else:
3635             error(self.pos, "Cannot delete C attribute of extension type")
3636         self.obj.generate_disposal_code(code)
3637         self.obj.free_temps(code)
3638
3639     def annotate(self, code):
3640         if self.is_py_attr:
3641             code.annotate(self.pos, AnnotationItem('py_attr', 'python attribute', size=len(self.attribute)))
3642         else:
3643             code.annotate(self.pos, AnnotationItem('c_attr', 'c attribute', size=len(self.attribute)))
3644
3645     def put_nonecheck(self, code):
3646         code.globalstate.use_utility_code(raise_noneattr_error_utility_code)
3647         code.putln("if (%s) {" % code.unlikely("%s == Py_None") % self.obj.result_as(PyrexTypes.py_object_type))
3648         code.putln("__Pyx_RaiseNoneAttributeError(\"%s\");" % self.attribute)
3649         code.putln(code.error_goto(self.pos))
3650         code.putln("}")
3651
3652
3653 #-------------------------------------------------------------------
3654 #
3655 #  Constructor nodes
3656 #
3657 #-------------------------------------------------------------------
3658
3659 class StarredTargetNode(ExprNode):
3660     #  A starred expression like "*a"
3661     #
3662     #  This is only allowed in sequence assignment targets such as
3663     #
3664     #      a, *b = (1,2,3,4)    =>     a = 1 ; b = [2,3,4]
3665     #
3666     #  and will be removed during type analysis (or generate an error
3667     #  if it's found at unexpected places).
3668     #
3669     #  target          ExprNode
3670
3671     subexprs = ['target']
3672     is_starred = 1
3673     type = py_object_type
3674     is_temp = 1
3675
3676     def __init__(self, pos, target):
3677         self.pos = pos
3678         self.target = target
3679
3680     def analyse_declarations(self, env):
3681         error(self.pos, "can use starred expression only as assignment target")
3682         self.target.analyse_declarations(env)
3683
3684     def analyse_types(self, env):
3685         error(self.pos, "can use starred expression only as assignment target")
3686         self.target.analyse_types(env)
3687         self.type = self.target.type
3688
3689     def analyse_target_declaration(self, env):
3690         self.target.analyse_target_declaration(env)
3691
3692     def analyse_target_types(self, env):
3693         self.target.analyse_target_types(env)
3694         self.type = self.target.type
3695
3696     def calculate_result_code(self):
3697         return ""
3698
3699     def generate_result_code(self, code):
3700         pass
3701
3702
3703 class SequenceNode(ExprNode):
3704     #  Base class for list and tuple constructor nodes.
3705     #  Contains common code for performing sequence unpacking.
3706     #
3707     #  args                    [ExprNode]
3708     #  iterator                ExprNode
3709     #  unpacked_items          [ExprNode] or None
3710     #  coerced_unpacked_items  [ExprNode] or None
3711
3712     subexprs = ['args']
3713
3714     is_sequence_constructor = 1
3715     unpacked_items = None
3716
3717     def compile_time_value_list(self, denv):
3718         return [arg.compile_time_value(denv) for arg in self.args]
3719
3720     def replace_starred_target_node(self):
3721         # replace a starred node in the targets by the contained expression
3722         self.starred_assignment = False
3723         args = []
3724         for arg in self.args:
3725             if arg.is_starred:
3726                 if self.starred_assignment:
3727                     error(arg.pos, "more than 1 starred expression in assignment")
3728                 self.starred_assignment = True
3729                 arg = arg.target
3730                 arg.is_starred = True
3731             args.append(arg)
3732         self.args = args
3733
3734     def analyse_target_declaration(self, env):
3735         self.replace_starred_target_node()
3736         for arg in self.args:
3737             arg.analyse_target_declaration(env)
3738
3739     def analyse_types(self, env, skip_children=False):
3740         for i in range(len(self.args)):
3741             arg = self.args[i]
3742             if not skip_children: arg.analyse_types(env)
3743             self.args[i] = arg.coerce_to_pyobject(env)
3744         self.is_temp = 1
3745         # not setting self.type here, subtypes do this
3746
3747     def may_be_none(self):
3748         return False
3749
3750     def analyse_target_types(self, env):
3751         self.iterator = PyTempNode(self.pos, env)
3752         self.unpacked_items = []
3753         self.coerced_unpacked_items = []
3754         for arg in self.args:
3755             arg.analyse_target_types(env)
3756             if arg.is_starred:
3757                 if not arg.type.assignable_from(Builtin.list_type):
3758                     error(arg.pos,
3759                           "starred target must have Python object (list) type")
3760                 if arg.type is py_object_type:
3761                     arg.type = Builtin.list_type
3762             unpacked_item = PyTempNode(self.pos, env)
3763             coerced_unpacked_item = unpacked_item.coerce_to(arg.type, env)
3764             self.unpacked_items.append(unpacked_item)
3765             self.coerced_unpacked_items.append(coerced_unpacked_item)
3766         self.type = py_object_type
3767
3768     def generate_result_code(self, code):
3769         self.generate_operation_code(code)
3770
3771     def generate_assignment_code(self, rhs, code):
3772         if self.starred_assignment:
3773             self.generate_starred_assignment_code(rhs, code)
3774         else:
3775             self.generate_parallel_assignment_code(rhs, code)
3776
3777         for item in self.unpacked_items:
3778             item.release(code)
3779         rhs.free_temps(code)
3780
3781     def generate_parallel_assignment_code(self, rhs, code):
3782         # Need to work around the fact that generate_evaluation_code
3783         # allocates the temps in a rather hacky way -- the assignment
3784         # is evaluated twice, within each if-block.
3785
3786         if rhs.type is tuple_type:
3787             tuple_check = "likely(%s != Py_None)"
3788         else:
3789             tuple_check = "PyTuple_CheckExact(%s)"
3790         code.putln(
3791             "if (%s && likely(PyTuple_GET_SIZE(%s) == %s)) {" % (
3792                 tuple_check % rhs.py_result(),
3793                 rhs.py_result(),
3794                 len(self.args)))
3795         code.putln("PyObject* tuple = %s;" % rhs.py_result())
3796         for item in self.unpacked_items:
3797             item.allocate(code)
3798         for i in range(len(self.args)):
3799             item = self.unpacked_items[i]
3800             code.put(
3801                 "%s = PyTuple_GET_ITEM(tuple, %s); " % (
3802                     item.result(),
3803                     i))
3804             code.put_incref(item.result(), item.ctype())
3805             value_node = self.coerced_unpacked_items[i]
3806             value_node.generate_evaluation_code(code)
3807         rhs.generate_disposal_code(code)
3808
3809         for i in range(len(self.args)):
3810             self.args[i].generate_assignment_code(
3811                 self.coerced_unpacked_items[i], code)
3812
3813         code.putln("} else {")
3814
3815         if rhs.type is tuple_type:
3816             code.globalstate.use_utility_code(tuple_unpacking_error_code)
3817             code.putln("__Pyx_UnpackTupleError(%s, %s);" % (
3818                         rhs.py_result(), len(self.args)))
3819             code.putln(code.error_goto(self.pos))
3820         else:
3821             code.globalstate.use_utility_code(unpacking_utility_code)
3822
3823             self.iterator.allocate(code)
3824             code.putln(
3825                 "%s = PyObject_GetIter(%s); %s" % (
3826                     self.iterator.result(),
3827                     rhs.py_result(),
3828                     code.error_goto_if_null(self.iterator.result(), self.pos)))
3829             code.put_gotref(self.iterator.py_result())
3830             rhs.generate_disposal_code(code)
3831             for i in range(len(self.args)):
3832                 item = self.unpacked_items[i]
3833                 unpack_code = "__Pyx_UnpackItem(%s, %d)" % (
3834                     self.iterator.py_result(), i)
3835                 code.putln(
3836                     "%s = %s; %s" % (
3837                         item.result(),
3838                         typecast(item.ctype(), py_object_type, unpack_code),
3839                         code.error_goto_if_null(item.result(), self.pos)))
3840                 code.put_gotref(item.py_result())
3841                 value_node = self.coerced_unpacked_items[i]
3842                 value_node.generate_evaluation_code(code)
3843             code.put_error_if_neg(self.pos, "__Pyx_EndUnpack(%s, %d)" % (
3844                 self.iterator.py_result(),
3845                 len(self.args)))
3846             if debug_disposal_code:
3847                 print("UnpackNode.generate_assignment_code:")
3848                 print("...generating disposal code for %s" % self.iterator)
3849             self.iterator.generate_disposal_code(code)
3850             self.iterator.free_temps(code)
3851             self.iterator.release(code)
3852
3853             for i in range(len(self.args)):
3854                 self.args[i].generate_assignment_code(
3855                     self.coerced_unpacked_items[i], code)
3856
3857         code.putln("}")
3858
3859     def generate_starred_assignment_code(self, rhs, code):
3860         code.globalstate.use_utility_code(unpacking_utility_code)
3861
3862         for i, arg in enumerate(self.args):
3863             if arg.is_starred:
3864                 starred_target = self.unpacked_items[i]
3865                 fixed_args_left  = self.args[:i]
3866                 fixed_args_right = self.args[i+1:]
3867                 break
3868
3869         self.iterator.allocate(code)
3870         code.putln(
3871             "%s = PyObject_GetIter(%s); %s" % (
3872                 self.iterator.result(),
3873                 rhs.py_result(),
3874                 code.error_goto_if_null(self.iterator.result(), self.pos)))
3875         code.put_gotref(self.iterator.py_result())
3876         rhs.generate_disposal_code(code)
3877
3878         for item in self.unpacked_items:
3879             item.allocate(code)
3880         for i in range(len(fixed_args_left)):
3881             item = self.unpacked_items[i]
3882             unpack_code = "__Pyx_UnpackItem(%s, %d)" % (
3883                 self.iterator.py_result(), i)
3884             code.putln(
3885                 "%s = %s; %s" % (
3886                     item.result(),
3887                     typecast(item.ctype(), py_object_type, unpack_code),
3888                     code.error_goto_if_null(item.result(), self.pos)))
3889             code.put_gotref(item.py_result())
3890             value_node = self.coerced_unpacked_items[i]
3891             value_node.generate_evaluation_code(code)
3892
3893         target_list = starred_target.result()
3894         code.putln("%s = PySequence_List(%s); %s" % (
3895             target_list, self.iterator.py_result(),
3896             code.error_goto_if_null(target_list, self.pos)))
3897         code.put_gotref(target_list)
3898         if fixed_args_right:
3899             code.globalstate.use_utility_code(raise_need_more_values_to_unpack)
3900             unpacked_right_args = self.unpacked_items[-len(fixed_args_right):]
3901             code.putln("if (unlikely(PyList_GET_SIZE(%s) < %d)) {" % (
3902                 (target_list, len(unpacked_right_args))))
3903             code.put("__Pyx_RaiseNeedMoreValuesError(%d+PyList_GET_SIZE(%s)); %s" % (
3904                      len(fixed_args_left), target_list,
3905                      code.error_goto(self.pos)))
3906             code.putln('}')
3907             for i, (arg, coerced_arg) in enumerate(zip(unpacked_right_args[::-1],
3908                                                        self.coerced_unpacked_items[::-1])):
3909                 code.putln(
3910                     "%s = PyList_GET_ITEM(%s, PyList_GET_SIZE(%s)-1); " % (
3911                         arg.py_result(),
3912                         target_list, target_list))
3913                 # resize the list the hard way
3914                 code.putln("((PyVarObject*)%s)->ob_size--;" % target_list)
3915                 code.put_gotref(arg.py_result())
3916                 coerced_arg.generate_evaluation_code(code)
3917
3918         self.iterator.generate_disposal_code(code)
3919         self.iterator.free_temps(code)
3920         self.iterator.release(code)
3921
3922         for i in range(len(self.args)):
3923             self.args[i].generate_assignment_code(
3924                 self.coerced_unpacked_items[i], code)
3925
3926     def annotate(self, code):
3927         for arg in self.args:
3928             arg.annotate(code)
3929         if self.unpacked_items:
3930             for arg in self.unpacked_items:
3931                 arg.annotate(code)
3932             for arg in self.coerced_unpacked_items:
3933                 arg.annotate(code)
3934
3935
3936 class TupleNode(SequenceNode):
3937     #  Tuple constructor.
3938
3939     type = tuple_type
3940
3941     gil_message = "Constructing Python tuple"
3942
3943     def analyse_types(self, env, skip_children=False):
3944         if len(self.args) == 0:
3945             self.is_temp = 0
3946             self.is_literal = 1
3947         else:
3948             SequenceNode.analyse_types(self, env, skip_children)
3949             for child in self.args:
3950                 if not child.is_literal:
3951                     break
3952             else:
3953                 self.is_temp = 0
3954                 self.is_literal = 1
3955
3956     def calculate_result_code(self):
3957         if len(self.args) > 0:
3958             return self.result_code
3959         else:
3960             return Naming.empty_tuple
3961
3962     def calculate_constant_result(self):
3963         self.constant_result = tuple([
3964                 arg.constant_result for arg in self.args])
3965
3966     def compile_time_value(self, denv):
3967         values = self.compile_time_value_list(denv)
3968         try:
3969             return tuple(values)
3970         except Exception, e:
3971             self.compile_time_value_error(e)
3972
3973     def generate_operation_code(self, code):
3974         if len(self.args) == 0:
3975             # result_code is Naming.empty_tuple
3976             return
3977         if self.is_literal:
3978             # non-empty cached tuple => result is global constant,
3979             # creation code goes into separate code writer
3980             self.result_code = code.get_py_const(py_object_type, 'tuple_', cleanup_level=2)
3981             code = code.get_cached_constants_writer()
3982             code.mark_pos(self.pos)
3983
3984         code.putln(
3985             "%s = PyTuple_New(%s); %s" % (
3986                 self.result(),
3987                 len(self.args),
3988                 code.error_goto_if_null(self.result(), self.pos)))
3989         code.put_gotref(self.py_result())
3990         for i in range(len(self.args)):
3991             arg = self.args[i]
3992             if not arg.result_in_temp():
3993                 code.put_incref(arg.result(), arg.ctype())
3994             code.putln(
3995                 "PyTuple_SET_ITEM(%s, %s, %s);" % (
3996                     self.result(),
3997                     i,
3998                     arg.py_result()))
3999             code.put_giveref(arg.py_result())
4000         if self.is_literal:
4001             code.put_giveref(self.py_result())
4002
4003     def generate_subexpr_disposal_code(self, code):
4004         # We call generate_post_assignment_code here instead
4005         # of generate_disposal_code, because values were stored
4006         # in the tuple using a reference-stealing operation.
4007         for arg in self.args:
4008             arg.generate_post_assignment_code(code)
4009             # Should NOT call free_temps -- this is invoked by the default
4010             # generate_evaluation_code which will do that.
4011
4012
4013 class ListNode(SequenceNode):
4014     #  List constructor.
4015
4016     # obj_conversion_errors    [PyrexError]   used internally
4017     # orignial_args            [ExprNode]     used internally
4018
4019     obj_conversion_errors = []
4020     type = list_type
4021
4022     gil_message = "Constructing Python list"
4023
4024     def type_dependencies(self, env):
4025         return ()
4026
4027     def infer_type(self, env):
4028         # TOOD: Infer non-object list arrays.
4029         return list_type
4030
4031     def analyse_expressions(self, env):
4032         SequenceNode.analyse_expressions(self, env)
4033         self.coerce_to_pyobject(env)
4034
4035     def analyse_types(self, env):
4036         hold_errors()
4037         self.original_args = list(self.args)
4038         SequenceNode.analyse_types(self, env)
4039         self.obj_conversion_errors = held_errors()
4040         release_errors(ignore=True)
4041
4042     def coerce_to(self, dst_type, env):
4043         if dst_type.is_pyobject:
4044             for err in self.obj_conversion_errors:
4045                 report_error(err)
4046             self.obj_conversion_errors = []
4047             if not self.type.subtype_of(dst_type):
4048                 error(self.pos, "Cannot coerce list to type '%s'" % dst_type)
4049         elif dst_type.is_ptr and dst_type.base_type is not PyrexTypes.c_void_type:
4050             base_type = dst_type.base_type
4051             self.type = PyrexTypes.CArrayType(base_type, len(self.args))
4052             for i in range(len(self.original_args)):
4053                 arg = self.args[i]
4054                 if isinstance(arg, CoerceToPyTypeNode):
4055                     arg = arg.arg
4056                 self.args[i] = arg.coerce_to(base_type, env)
4057         elif dst_type.is_struct:
4058             if len(self.args) > len(dst_type.scope.var_entries):
4059                 error(self.pos, "Too may members for '%s'" % dst_type)
4060             else:
4061                 if len(self.args) < len(dst_type.scope.var_entries):
4062                     warning(self.pos, "Too few members for '%s'" % dst_type, 1)
4063                 for i, (arg, member) in enumerate(zip(self.original_args, dst_type.scope.var_entries)):
4064                     if isinstance(arg, CoerceToPyTypeNode):
4065                         arg = arg.arg
4066                     self.args[i] = arg.coerce_to(member.type, env)
4067             self.type = dst_type
4068         else:
4069             self.type = error_type
4070             error(self.pos, "Cannot coerce list to type '%s'" % dst_type)
4071         return self
4072
4073     def release_temp(self, env):
4074         if self.type.is_array:
4075             # To be valid C++, we must allocate the memory on the stack
4076             # manually and be sure not to reuse it for something else.
4077             pass
4078         else:
4079             SequenceNode.release_temp(self, env)
4080
4081     def calculate_constant_result(self):
4082         self.constant_result = [
4083             arg.constant_result for arg in self.args]
4084
4085     def compile_time_value(self, denv):
4086         return self.compile_time_value_list(denv)
4087
4088     def generate_operation_code(self, code):
4089         if self.type.is_pyobject:
4090             for err in self.obj_conversion_errors:
4091                 report_error(err)
4092             code.putln("%s = PyList_New(%s); %s" %
4093                 (self.result(),
4094                 len(self.args),
4095                 code.error_goto_if_null(self.result(), self.pos)))
4096             code.put_gotref(self.py_result())
4097             for i in range(len(self.args)):
4098                 arg = self.args[i]
4099                 #if not arg.is_temp:
4100                 if not arg.result_in_temp():
4101                     code.put_incref(arg.result(), arg.ctype())
4102                 code.putln("PyList_SET_ITEM(%s, %s, %s);" %
4103                     (self.result(),
4104                     i,
4105                     arg.py_result()))
4106                 code.put_giveref(arg.py_result())
4107         elif self.type.is_array:
4108             for i, arg in enumerate(self.args):
4109                 code.putln("%s[%s] = %s;" % (
4110                                 self.result(),
4111                                 i,
4112                                 arg.result()))
4113         elif self.type.is_struct:
4114             for arg, member in zip(self.args, self.type.scope.var_entries):
4115                 code.putln("%s.%s = %s;" % (
4116                         self.result(),
4117                         member.cname,
4118                         arg.result()))
4119         else:
4120             raise InternalError("List type never specified")
4121
4122     def generate_subexpr_disposal_code(self, code):
4123         # We call generate_post_assignment_code here instead
4124         # of generate_disposal_code, because values were stored
4125         # in the list using a reference-stealing operation.
4126         for arg in self.args:
4127             arg.generate_post_assignment_code(code)
4128             # Should NOT call free_temps -- this is invoked by the default
4129             # generate_evaluation_code which will do that.
4130
4131
4132 class ScopedExprNode(ExprNode):
4133     # Abstract base class for ExprNodes that have their own local
4134     # scope, such as generator expressions.
4135     #
4136     # expr_scope    Scope  the inner scope of the expression
4137
4138     subexprs = []
4139     expr_scope = None
4140
4141     # does this node really have a local scope, e.g. does it leak loop
4142     # variables or not?  non-leaking Py3 behaviour is default, except
4143     # for list comprehensions where the behaviour differs in Py2 and
4144     # Py3 (set in Parsing.py based on parser context)
4145     has_local_scope = True
4146
4147     def init_scope(self, outer_scope, expr_scope=None):
4148         if expr_scope is not None:
4149             self.expr_scope = expr_scope
4150         elif self.has_local_scope:
4151             self.expr_scope = Symtab.GeneratorExpressionScope(outer_scope)
4152         else:
4153             self.expr_scope = None
4154
4155     def analyse_declarations(self, env):
4156         self.init_scope(env)
4157
4158     def analyse_scoped_declarations(self, env):
4159         # this is called with the expr_scope as env
4160         pass
4161
4162     def analyse_types(self, env):
4163         # no recursion here, the children will be analysed separately below
4164         pass
4165
4166     def analyse_scoped_expressions(self, env):
4167         # this is called with the expr_scope as env
4168         pass
4169
4170     def generate_evaluation_code(self, code):
4171         # set up local variables and free their references on exit
4172         generate_inner_evaluation_code = super(ScopedExprNode, self).generate_evaluation_code
4173         if not self.has_local_scope or not self.expr_scope.var_entries:
4174             # no local variables => delegate, done
4175             generate_inner_evaluation_code(code)
4176             return
4177
4178         code.putln('{ /* enter inner scope */')
4179         py_entries = []
4180         for entry in self.expr_scope.var_entries:
4181             if not entry.in_closure:
4182                 code.put_var_declaration(entry)
4183                 if entry.type.is_pyobject and entry.used:
4184                     py_entries.append(entry)
4185         if not py_entries:
4186             # no local Python references => no cleanup required
4187             generate_inner_evaluation_code(code)
4188             code.putln('} /* exit inner scope */')
4189             return
4190         for entry in py_entries:
4191             code.put_init_var_to_py_none(entry)
4192
4193         # must free all local Python references at each exit point
4194         old_loop_labels = tuple(code.new_loop_labels())
4195         old_error_label = code.new_error_label()
4196
4197         generate_inner_evaluation_code(code)
4198
4199         # normal (non-error) exit
4200         for entry in py_entries:
4201             code.put_var_decref(entry)
4202
4203         # error/loop body exit points
4204         exit_scope = code.new_label('exit_scope')
4205         code.put_goto(exit_scope)
4206         for label, old_label in ([(code.error_label, old_error_label)] +
4207                                  list(zip(code.get_loop_labels(), old_loop_labels))):
4208             if code.label_used(label):
4209                 code.put_label(label)
4210                 for entry in py_entries:
4211                     code.put_var_decref(entry)
4212                 code.put_goto(old_label)
4213         code.put_label(exit_scope)
4214         code.putln('} /* exit inner scope */')
4215
4216         code.set_loop_labels(old_loop_labels)
4217         code.error_label = old_error_label
4218
4219
4220 class ComprehensionNode(ScopedExprNode):
4221     subexprs = ["target"]
4222     child_attrs = ["loop", "append"]
4223
4224     def infer_type(self, env):
4225         return self.target.infer_type(env)
4226
4227     def analyse_declarations(self, env):
4228         self.append.target = self # this is used in the PyList_Append of the inner loop
4229         self.init_scope(env)
4230
4231     def analyse_scoped_declarations(self, env):
4232         self.loop.analyse_declarations(env)
4233
4234     def analyse_types(self, env):
4235         self.target.analyse_expressions(env)
4236         self.type = self.target.type
4237         if not self.has_local_scope:
4238             self.loop.analyse_expressions(env)
4239
4240     def analyse_scoped_expressions(self, env):
4241         if self.has_local_scope:
4242             self.loop.analyse_expressions(env)
4243
4244     def may_be_none(self):
4245         return False
4246
4247     def calculate_result_code(self):
4248         return self.target.result()
4249
4250     def generate_result_code(self, code):
4251         self.generate_operation_code(code)
4252
4253     def generate_operation_code(self, code):
4254         self.loop.generate_execution_code(code)
4255
4256     def annotate(self, code):
4257         self.loop.annotate(code)
4258
4259
4260 class ComprehensionAppendNode(Node):
4261     # Need to be careful to avoid infinite recursion:
4262     # target must not be in child_attrs/subexprs
4263
4264     child_attrs = ['expr']
4265
4266     type = PyrexTypes.c_int_type
4267
4268     def analyse_expressions(self, env):
4269         self.expr.analyse_expressions(env)
4270         if not self.expr.type.is_pyobject:
4271             self.expr = self.expr.coerce_to_pyobject(env)
4272
4273     def generate_execution_code(self, code):
4274         if self.target.type is list_type:
4275             function = "PyList_Append"
4276         elif self.target.type is set_type:
4277             function = "PySet_Add"
4278         else:
4279             raise InternalError(
4280                 "Invalid type for comprehension node: %s" % self.target.type)
4281
4282         self.expr.generate_evaluation_code(code)
4283         code.putln(code.error_goto_if("%s(%s, (PyObject*)%s)" % (
4284             function,
4285             self.target.result(),
4286             self.expr.result()
4287             ), self.pos))
4288         self.expr.generate_disposal_code(code)
4289         self.expr.free_temps(code)
4290
4291     def generate_function_definitions(self, env, code):
4292         self.expr.generate_function_definitions(env, code)
4293
4294     def annotate(self, code):
4295         self.expr.annotate(code)
4296
4297 class DictComprehensionAppendNode(ComprehensionAppendNode):
4298     child_attrs = ['key_expr', 'value_expr']
4299
4300     def analyse_expressions(self, env):
4301         self.key_expr.analyse_expressions(env)
4302         if not self.key_expr.type.is_pyobject:
4303             self.key_expr = self.key_expr.coerce_to_pyobject(env)
4304         self.value_expr.analyse_expressions(env)
4305         if not self.value_expr.type.is_pyobject:
4306             self.value_expr = self.value_expr.coerce_to_pyobject(env)
4307
4308     def generate_execution_code(self, code):
4309         self.key_expr.generate_evaluation_code(code)
4310         self.value_expr.generate_evaluation_code(code)
4311         code.putln(code.error_goto_if("PyDict_SetItem(%s, (PyObject*)%s, (PyObject*)%s)" % (
4312             self.target.result(),
4313             self.key_expr.result(),
4314             self.value_expr.result()
4315             ), self.pos))
4316         self.key_expr.generate_disposal_code(code)
4317         self.key_expr.free_temps(code)
4318         self.value_expr.generate_disposal_code(code)
4319         self.value_expr.free_temps(code)
4320
4321     def generate_function_definitions(self, env, code):
4322         self.key_expr.generate_function_definitions(env, code)
4323         self.value_expr.generate_function_definitions(env, code)
4324
4325     def annotate(self, code):
4326         self.key_expr.annotate(code)
4327         self.value_expr.annotate(code)
4328
4329
4330 class GeneratorExpressionNode(ScopedExprNode):
4331     # A generator expression, e.g.  (i for i in range(10))
4332     #
4333     # Result is a generator.
4334     #
4335     # loop      ForStatNode   the for-loop, containing a YieldExprNode
4336
4337     child_attrs = ["loop"]
4338
4339     type = py_object_type
4340
4341     def analyse_scoped_declarations(self, env):
4342         self.loop.analyse_declarations(env)
4343
4344     def analyse_types(self, env):
4345         if not self.has_local_scope:
4346             self.loop.analyse_expressions(env)
4347         self.is_temp = True
4348
4349     def analyse_scoped_expressions(self, env):
4350         if self.has_local_scope:
4351             self.loop.analyse_expressions(env)
4352
4353     def may_be_none(self):
4354         return False
4355
4356     def annotate(self, code):
4357         self.loop.annotate(code)
4358
4359
4360 class InlinedGeneratorExpressionNode(GeneratorExpressionNode):
4361     # An inlined generator expression for which the result is
4362     # calculated inside of the loop.  This will only be created by
4363     # transforms when replacing builtin calls on generator
4364     # expressions.
4365     #
4366     # loop           ForStatNode      the for-loop, not containing any YieldExprNodes
4367     # result_node    ResultRefNode    the reference to the result value temp
4368     # orig_func      String           the name of the builtin function this node replaces
4369
4370     child_attrs = ["loop"]
4371     loop_analysed = False
4372
4373     def infer_type(self, env):
4374         return self.result_node.infer_type(env)
4375
4376     def analyse_types(self, env):
4377         if not self.has_local_scope:
4378             self.loop_analysed = True
4379             self.loop.analyse_expressions(env)
4380         self.type = self.result_node.type
4381         self.is_temp = True
4382
4383     def analyse_scoped_expressions(self, env):
4384         self.loop_analysed = True
4385         GeneratorExpressionNode.analyse_scoped_expressions(self, env)
4386
4387     def coerce_to(self, dst_type, env):
4388         if self.orig_func == 'sum' and dst_type.is_numeric and not self.loop_analysed:
4389             # We can optimise by dropping the aggregation variable and
4390             # the add operations into C.  This can only be done safely
4391             # before analysing the loop body, after that, the result
4392             # reference type will have infected expressions and
4393             # assignments.
4394             self.result_node.type = self.type = dst_type
4395             return self
4396         return GeneratorExpressionNode.coerce_to(self, dst_type, env)
4397
4398     def generate_result_code(self, code):
4399         self.result_node.result_code = self.result()
4400         self.loop.generate_execution_code(code)
4401
4402
4403 class SetNode(ExprNode):
4404     #  Set constructor.
4405
4406     type = set_type
4407
4408     subexprs = ['args']
4409
4410     gil_message = "Constructing Python set"
4411
4412     def analyse_types(self, env):
4413         for i in range(len(self.args)):
4414             arg = self.args[i]
4415             arg.analyse_types(env)
4416             self.args[i] = arg.coerce_to_pyobject(env)
4417         self.type = set_type
4418         self.is_temp = 1
4419
4420     def may_be_none(self):
4421         return False
4422
4423     def calculate_constant_result(self):
4424         self.constant_result = set([
4425                 arg.constant_result for arg in self.args])
4426
4427     def compile_time_value(self, denv):
4428         values = [arg.compile_time_value(denv) for arg in self.args]
4429         try:
4430             return set(values)
4431         except Exception, e:
4432             self.compile_time_value_error(e)
4433
4434     def generate_evaluation_code(self, code):
4435         code.globalstate.use_utility_code(Builtin.py23_set_utility_code)
4436         self.allocate_temp_result(code)
4437         code.putln(
4438             "%s = PySet_New(0); %s" % (
4439                 self.result(),
4440                 code.error_goto_if_null(self.result(), self.pos)))
4441         code.put_gotref(self.py_result())
4442         for arg in self.args:
4443             arg.generate_evaluation_code(code)
4444             code.putln(
4445                 code.error_goto_if_neg(
4446                     "PySet_Add(%s, %s)" % (self.result(), arg.py_result()),
4447                     self.pos))
4448             arg.generate_disposal_code(code)
4449             arg.free_temps(code)
4450
4451
4452 class DictNode(ExprNode):
4453     #  Dictionary constructor.
4454     #
4455     #  key_value_pairs  [DictItemNode]
4456     #
4457     # obj_conversion_errors    [PyrexError]   used internally
4458
4459     subexprs = ['key_value_pairs']
4460     is_temp = 1
4461     type = dict_type
4462
4463     obj_conversion_errors = []
4464
4465     def calculate_constant_result(self):
4466         self.constant_result = dict([
4467                 item.constant_result for item in self.key_value_pairs])
4468
4469     def compile_time_value(self, denv):
4470         pairs = [(item.key.compile_time_value(denv), item.value.compile_time_value(denv))
4471             for item in self.key_value_pairs]
4472         try:
4473             return dict(pairs)
4474         except Exception, e:
4475             self.compile_time_value_error(e)
4476
4477     def type_dependencies(self, env):
4478         return ()
4479
4480     def infer_type(self, env):
4481         # TOOD: Infer struct constructors.
4482         return dict_type
4483
4484     def analyse_types(self, env):
4485         hold_errors()
4486         for item in self.key_value_pairs:
4487             item.analyse_types(env)
4488         self.obj_conversion_errors = held_errors()
4489         release_errors(ignore=True)
4490
4491     def may_be_none(self):
4492         return False
4493
4494     def coerce_to(self, dst_type, env):
4495         if dst_type.is_pyobject:
4496             self.release_errors()
4497             if not self.type.subtype_of(dst_type):
4498                 error(self.pos, "Cannot interpret dict as type '%s'" % dst_type)
4499         elif dst_type.is_struct_or_union:
4500             self.type = dst_type
4501             if not dst_type.is_struct and len(self.key_value_pairs) != 1:
4502                 error(self.pos, "Exactly one field must be specified to convert to union '%s'" % dst_type)
4503             elif dst_type.is_struct and len(self.key_value_pairs) < len(dst_type.scope.var_entries):
4504                 warning(self.pos, "Not all members given for struct '%s'" % dst_type, 1)
4505             for item in self.key_value_pairs:
4506                 if isinstance(item.key, CoerceToPyTypeNode):
4507                     item.key = item.key.arg
4508                 if not isinstance(item.key, (UnicodeNode, StringNode, BytesNode)):
4509                     error(item.key.pos, "Invalid struct field identifier")
4510                     item.key = StringNode(item.key.pos, value="<error>")
4511                 else:
4512                     key = str(item.key.value) # converts string literals to unicode in Py3
4513                     member = dst_type.scope.lookup_here(key)
4514                     if not member:
4515                         error(item.key.pos, "struct '%s' has no field '%s'" % (dst_type, key))
4516                     else:
4517                         value = item.value
4518                         if isinstance(value, CoerceToPyTypeNode):
4519                             value = value.arg
4520                         item.value = value.coerce_to(member.type, env)
4521         else:
4522             self.type = error_type
4523             error(self.pos, "Cannot interpret dict as type '%s'" % dst_type)
4524         return self
4525
4526     def release_errors(self):
4527         for err in self.obj_conversion_errors:
4528             report_error(err)
4529         self.obj_conversion_errors = []
4530
4531     gil_message = "Constructing Python dict"
4532
4533     def generate_evaluation_code(self, code):
4534         #  Custom method used here because key-value
4535         #  pairs are evaluated and used one at a time.
4536         code.mark_pos(self.pos)
4537         self.allocate_temp_result(code)
4538         if self.type.is_pyobject:
4539             self.release_errors()
4540             code.putln(
4541                 "%s = PyDict_New(); %s" % (
4542                     self.result(),
4543                     code.error_goto_if_null(self.result(), self.pos)))
4544             code.put_gotref(self.py_result())
4545         for item in self.key_value_pairs:
4546             item.generate_evaluation_code(code)
4547             if self.type.is_pyobject:
4548                 code.put_error_if_neg(self.pos,
4549                     "PyDict_SetItem(%s, %s, %s)" % (
4550                         self.result(),
4551                         item.key.py_result(),
4552                         item.value.py_result()))
4553             else:
4554                 code.putln("%s.%s = %s;" % (
4555                         self.result(),
4556                         item.key.value,
4557                         item.value.result()))
4558             item.generate_disposal_code(code)
4559             item.free_temps(code)
4560
4561     def annotate(self, code):
4562         for item in self.key_value_pairs:
4563             item.annotate(code)
4564
4565 class DictItemNode(ExprNode):
4566     # Represents a single item in a DictNode
4567     #
4568     # key          ExprNode
4569     # value        ExprNode
4570     subexprs = ['key', 'value']
4571
4572     nogil_check = None # Parent DictNode takes care of it
4573
4574     def calculate_constant_result(self):
4575         self.constant_result = (
4576             self.key.constant_result, self.value.constant_result)
4577
4578     def analyse_types(self, env):
4579         self.key.analyse_types(env)
4580         self.value.analyse_types(env)
4581         self.key = self.key.coerce_to_pyobject(env)
4582         self.value = self.value.coerce_to_pyobject(env)
4583
4584     def generate_evaluation_code(self, code):
4585         self.key.generate_evaluation_code(code)
4586         self.value.generate_evaluation_code(code)
4587
4588     def generate_disposal_code(self, code):
4589         self.key.generate_disposal_code(code)
4590         self.value.generate_disposal_code(code)
4591
4592     def free_temps(self, code):
4593         self.key.free_temps(code)
4594         self.value.free_temps(code)
4595
4596     def __iter__(self):
4597         return iter([self.key, self.value])
4598
4599 class ModuleNameMixin(object):
4600     def set_mod_name(self, env):
4601         self.module_name = env.global_scope().qualified_name
4602
4603     def get_py_mod_name(self, code):
4604         return code.get_py_string_const(
4605                  self.module_name, identifier=True)
4606
4607 class ClassNode(ExprNode, ModuleNameMixin):
4608     #  Helper class used in the implementation of Python
4609     #  class definitions. Constructs a class object given
4610     #  a name, tuple of bases and class dictionary.
4611     #
4612     #  name         EncodedString      Name of the class
4613     #  bases        ExprNode           Base class tuple
4614     #  dict         ExprNode           Class dict (not owned by this node)
4615     #  doc          ExprNode or None   Doc string
4616     #  module_name  EncodedString      Name of defining module
4617
4618     subexprs = ['bases', 'doc']
4619
4620     def analyse_types(self, env):
4621         self.bases.analyse_types(env)
4622         if self.doc:
4623             self.doc.analyse_types(env)
4624             self.doc = self.doc.coerce_to_pyobject(env)
4625         self.type = py_object_type
4626         self.is_temp = 1
4627         env.use_utility_code(create_class_utility_code);
4628         #TODO(craig,haoyu) This should be moved to a better place
4629         self.set_mod_name(env)
4630
4631     def may_be_none(self):
4632         return True
4633
4634     gil_message = "Constructing Python class"
4635
4636     def generate_result_code(self, code):
4637         cname = code.intern_identifier(self.name)
4638
4639         if self.doc:
4640             code.put_error_if_neg(self.pos,
4641                 'PyDict_SetItemString(%s, "__doc__", %s)' % (
4642                     self.dict.py_result(),
4643                     self.doc.py_result()))
4644         py_mod_name = self.get_py_mod_name(code)
4645         code.putln(
4646             '%s = __Pyx_CreateClass(%s, %s, %s, %s); %s' % (
4647                 self.result(),
4648                 self.bases.py_result(),
4649                 self.dict.py_result(),
4650                 cname,
4651                 py_mod_name,
4652                 code.error_goto_if_null(self.result(), self.pos)))
4653         code.put_gotref(self.py_result())
4654
4655
4656 class Py3ClassNode(ExprNode):
4657     #  Helper class used in the implementation of Python3+
4658     #  class definitions. Constructs a class object given
4659     #  a name, tuple of bases and class dictionary.
4660     #
4661     #  name         EncodedString      Name of the class
4662     #  dict         ExprNode           Class dict (not owned by this node)
4663     #  module_name  EncodedString      Name of defining module
4664
4665     subexprs = []
4666
4667     def analyse_types(self, env):
4668         self.type = py_object_type
4669         self.is_temp = 1
4670
4671     def may_be_none(self):
4672         return True
4673
4674     gil_message = "Constructing Python class"
4675
4676     def generate_result_code(self, code):
4677         code.globalstate.use_utility_code(create_py3class_utility_code)
4678         cname = code.intern_identifier(self.name)
4679         code.putln(
4680             '%s = __Pyx_Py3ClassCreate(%s, %s, %s, %s, %s); %s' % (
4681                 self.result(),
4682                 self.metaclass.result(),
4683                 cname,
4684                 self.bases.py_result(),
4685                 self.dict.py_result(),
4686                 self.mkw.py_result(),
4687                 code.error_goto_if_null(self.result(), self.pos)))
4688         code.put_gotref(self.py_result())
4689
4690 class KeywordArgsNode(ExprNode):
4691     # Helper class for keyword arguments
4692     #
4693     # keyword_args ExprNode or None     Keyword arguments
4694     # starstar_arg ExprNode or None     Extra arguments
4695
4696     subexprs = ['keyword_args', 'starstar_arg']
4697
4698     def analyse_types(self, env):
4699         if self.keyword_args:
4700             self.keyword_args.analyse_types(env)
4701         if self.starstar_arg:
4702             self.starstar_arg.analyse_types(env)
4703             # make sure we have a Python object as **kwargs mapping
4704             self.starstar_arg = \
4705                 self.starstar_arg.coerce_to_pyobject(env)
4706         self.type = py_object_type
4707         self.is_temp = 1
4708
4709     gil_message = "Constructing Keyword Args"
4710
4711     def generate_result_code(self, code):
4712         if self.keyword_args and self.starstar_arg:
4713             code.put_error_if_neg(self.pos,
4714                 "PyDict_Update(%s, %s)" % (
4715                     self.keyword_args.py_result(),
4716                     self.starstar_arg.py_result()))
4717         if self.keyword_args:
4718             code.putln("%s = %s;" % (self.result(), self.keyword_args.result()))
4719             code.put_incref(self.keyword_args.result(), self.keyword_args.ctype())
4720         elif self.starstar_arg:
4721             code.putln(
4722                 "%s = PyDict_Copy(%s); %s" % (
4723                     self.result(),
4724                     self.starstar_arg.py_result(),
4725                     code.error_goto_if_null(self.result(), self.pos)))
4726             code.put_gotref(self.py_result())
4727         else:
4728             code.putln(
4729                 "%s = PyDict_New(); %s" % (
4730                     self.result(),
4731                     code.error_goto_if_null(self.result(), self.pos)))
4732             code.put_gotref(self.py_result())
4733
4734 class PyClassMetaclassNode(ExprNode):
4735     # Helper class holds Python3 metaclass object
4736     #
4737     #  bases        ExprNode           Base class tuple (not owned by this node)
4738     #  mkw          ExprNode           Class keyword arguments (not owned by this node)
4739
4740     subexprs = []
4741
4742     def analyse_types(self, env):
4743         self.type = py_object_type
4744         self.is_temp = True
4745
4746     def may_be_none(self):
4747         return True
4748
4749     def generate_result_code(self, code):
4750         code.putln(
4751             "%s = __Pyx_Py3MetaclassGet(%s, %s); %s" % (
4752                 self.result(),
4753                 self.bases.result(),
4754                 self.mkw.result(),
4755                 code.error_goto_if_null(self.result(), self.pos)))
4756         code.put_gotref(self.py_result())
4757
4758 class PyClassNamespaceNode(ExprNode, ModuleNameMixin):
4759     # Helper class holds Python3 namespace object
4760     #
4761     # All this are not owned by this node
4762     #  metaclass    ExprNode           Metaclass object
4763     #  bases        ExprNode           Base class tuple
4764     #  mkw          ExprNode           Class keyword arguments
4765     #  doc          ExprNode or None   Doc string (owned)
4766
4767     subexprs = ['doc']
4768
4769     def analyse_types(self, env):
4770         self.bases.analyse_types(env)
4771         if self.doc:
4772             self.doc.analyse_types(env)
4773             self.doc = self.doc.coerce_to_pyobject(env)
4774         self.type = py_object_type
4775         self.is_temp = 1
4776         #TODO(craig,haoyu) This should be moved to a better place
4777         self.set_mod_name(env)
4778
4779     def may_be_none(self):
4780         return True
4781
4782     def generate_result_code(self, code):
4783         cname = code.intern_identifier(self.name)
4784         py_mod_name = self.get_py_mod_name(code)
4785         if self.doc:
4786             doc_code = self.doc.result()
4787         else:
4788             doc_code = '(PyObject *) NULL'
4789         code.putln(
4790             "%s = __Pyx_Py3MetaclassPrepare(%s, %s, %s, %s, %s, %s); %s" % (
4791                 self.result(),
4792                 self.metaclass.result(),
4793                 self.bases.result(),
4794                 cname,
4795                 self.mkw.result(),
4796                 py_mod_name,
4797                 doc_code,
4798                 code.error_goto_if_null(self.result(), self.pos)))
4799         code.put_gotref(self.py_result())
4800
4801 class BoundMethodNode(ExprNode):
4802     #  Helper class used in the implementation of Python
4803     #  class definitions. Constructs an bound method
4804     #  object from a class and a function.
4805     #
4806     #  function      ExprNode   Function object
4807     #  self_object   ExprNode   self object
4808
4809     subexprs = ['function']
4810
4811     def analyse_types(self, env):
4812         self.function.analyse_types(env)
4813         self.type = py_object_type
4814         self.is_temp = 1
4815
4816     gil_message = "Constructing an bound method"
4817
4818     def generate_result_code(self, code):
4819         code.putln(
4820             "%s = PyMethod_New(%s, %s, (PyObject*)%s->ob_type); %s" % (
4821                 self.result(),
4822                 self.function.py_result(),
4823                 self.self_object.py_result(),
4824                 self.self_object.py_result(),
4825                 code.error_goto_if_null(self.result(), self.pos)))
4826         code.put_gotref(self.py_result())
4827
4828 class UnboundMethodNode(ExprNode):
4829     #  Helper class used in the implementation of Python
4830     #  class definitions. Constructs an unbound method
4831     #  object from a class and a function.
4832     #
4833     #  function      ExprNode   Function object
4834
4835     type = py_object_type
4836     is_temp = 1
4837
4838     subexprs = ['function']
4839
4840     def analyse_types(self, env):
4841         self.function.analyse_types(env)
4842
4843     def may_be_none(self):
4844         return False
4845
4846     gil_message = "Constructing an unbound method"
4847
4848     def generate_result_code(self, code):
4849         class_cname = code.pyclass_stack[-1].classobj.result()
4850         code.putln(
4851             "%s = PyMethod_New(%s, 0, %s); %s" % (
4852                 self.result(),
4853                 self.function.py_result(),
4854                 class_cname,
4855                 code.error_goto_if_null(self.result(), self.pos)))
4856         code.put_gotref(self.py_result())
4857
4858
4859 class PyCFunctionNode(ExprNode, ModuleNameMixin):
4860     #  Helper class used in the implementation of Python
4861     #  class definitions. Constructs a PyCFunction object
4862     #  from a PyMethodDef struct.
4863     #
4864     #  pymethdef_cname   string             PyMethodDef structure
4865     #  self_object       ExprNode or None
4866     #  binding           bool
4867     #  module_name       EncodedString      Name of defining module
4868
4869     subexprs = []
4870     self_object = None
4871     binding = False
4872
4873     type = py_object_type
4874     is_temp = 1
4875
4876     def analyse_types(self, env):
4877         if self.binding:
4878             env.use_utility_code(binding_cfunc_utility_code)
4879
4880         #TODO(craig,haoyu) This should be moved to a better place
4881         self.set_mod_name(env)
4882
4883     def may_be_none(self):
4884         return False
4885
4886     gil_message = "Constructing Python function"
4887
4888     def self_result_code(self):
4889         if self.self_object is None:
4890             self_result = "NULL"
4891         else:
4892             self_result = self.self_object.py_result()
4893         return self_result
4894
4895     def generate_result_code(self, code):
4896         if self.binding:
4897             constructor = "%s_NewEx" % Naming.binding_cfunc
4898         else:
4899             constructor = "PyCFunction_NewEx"
4900         py_mod_name = self.get_py_mod_name(code)
4901         code.putln(
4902             '%s = %s(&%s, %s, %s); %s' % (
4903                 self.result(),
4904                 constructor,
4905                 self.pymethdef_cname,
4906                 self.self_result_code(),
4907                 py_mod_name,
4908                 code.error_goto_if_null(self.result(), self.pos)))
4909         code.put_gotref(self.py_result())
4910
4911 class InnerFunctionNode(PyCFunctionNode):
4912     # Special PyCFunctionNode that depends on a closure class
4913     #
4914
4915     binding = True
4916     needs_self_code = True
4917
4918     def self_result_code(self):
4919         if self.needs_self_code:
4920             return "((PyObject*)%s)" % (Naming.cur_scope_cname)
4921         return "NULL"
4922
4923 class LambdaNode(InnerFunctionNode):
4924     # Lambda expression node (only used as a function reference)
4925     #
4926     # args          [CArgDeclNode]         formal arguments
4927     # star_arg      PyArgDeclNode or None  * argument
4928     # starstar_arg  PyArgDeclNode or None  ** argument
4929     # lambda_name   string                 a module-globally unique lambda name
4930     # result_expr   ExprNode
4931     # def_node      DefNode                the underlying function 'def' node
4932
4933     child_attrs = ['def_node']
4934
4935     def_node = None
4936     name = StringEncoding.EncodedString('<lambda>')
4937
4938     def analyse_declarations(self, env):
4939         self.def_node.analyse_declarations(env)
4940         self.pymethdef_cname = self.def_node.entry.pymethdef_cname
4941         env.add_lambda_def(self.def_node)
4942
4943 class YieldExprNode(ExprNode):
4944     # Yield expression node
4945     #
4946     # arg         ExprNode   the value to return from the generator
4947     # label_name  string     name of the C label used for this yield
4948
4949     subexprs = ['arg']
4950     type = py_object_type
4951
4952     def analyse_types(self, env):
4953         self.is_temp = 1
4954         if self.arg is not None:
4955             self.arg.analyse_types(env)
4956             if not self.arg.type.is_pyobject:
4957                 self.arg = self.arg.coerce_to_pyobject(env)
4958         error(self.pos, "Generators are not supported")
4959
4960     def generate_result_code(self, code):
4961         self.label_name = code.new_label('resume_from_yield')
4962         code.use_label(self.label_name)
4963         code.putln("/* FIXME: save temporary variables */")
4964         code.putln("/* FIXME: return from function, yielding value */")
4965         code.put_label(self.label_name)
4966         code.putln("/* FIXME: restore temporary variables and  */")
4967         code.putln("/* FIXME: extract sent value from closure */")
4968
4969
4970 #-------------------------------------------------------------------
4971 #
4972 #  Unary operator nodes
4973 #
4974 #-------------------------------------------------------------------
4975
4976 compile_time_unary_operators = {
4977     'not': operator.not_,
4978     '~': operator.inv,
4979     '-': operator.neg,
4980     '+': operator.pos,
4981 }
4982
4983 class UnopNode(ExprNode):
4984     #  operator     string
4985     #  operand      ExprNode
4986     #
4987     #  Processing during analyse_expressions phase:
4988     #
4989     #    analyse_c_operation
4990     #      Called when the operand is not a pyobject.
4991     #      - Check operand type and coerce if needed.
4992     #      - Determine result type and result code fragment.
4993     #      - Allocate temporary for result if needed.
4994
4995     subexprs = ['operand']
4996     infix = True
4997
4998     def calculate_constant_result(self):
4999         func = compile_time_unary_operators[self.operator]
5000         self.constant_result = func(self.operand.constant_result)
5001
5002     def compile_time_value(self, denv):
5003         func = compile_time_unary_operators.get(self.operator)
5004         if not func:
5005             error(self.pos,
5006                 "Unary '%s' not supported in compile-time expression"
5007                     % self.operator)
5008         operand = self.operand.compile_time_value(denv)
5009         try:
5010             return func(operand)
5011         except Exception, e:
5012             self.compile_time_value_error(e)
5013
5014     def infer_type(self, env):
5015         operand_type = self.operand.infer_type(env)
5016         if operand_type.is_pyobject:
5017             return py_object_type
5018         else:
5019             return operand_type
5020
5021     def analyse_types(self, env):
5022         self.operand.analyse_types(env)
5023         if self.is_py_operation():
5024             self.coerce_operand_to_pyobject(env)
5025             self.type = py_object_type
5026             self.is_temp = 1
5027         elif self.is_cpp_operation():
5028             self.analyse_cpp_operation(env)
5029         else:
5030             self.analyse_c_operation(env)
5031
5032     def check_const(self):
5033         return self.operand.check_const()
5034
5035     def is_py_operation(self):
5036         return self.operand.type.is_pyobject
5037
5038     def nogil_check(self, env):
5039         if self.is_py_operation():
5040             self.gil_error()
5041
5042     def is_cpp_operation(self):
5043         type = self.operand.type
5044         return type.is_cpp_class
5045
5046     def coerce_operand_to_pyobject(self, env):
5047         self.operand = self.operand.coerce_to_pyobject(env)
5048
5049     def generate_result_code(self, code):
5050         if self.operand.type.is_pyobject:
5051             self.generate_py_operation_code(code)
5052
5053     def generate_py_operation_code(self, code):
5054         function = self.py_operation_function()
5055         code.putln(
5056             "%s = %s(%s); %s" % (
5057                 self.result(),
5058                 function,
5059                 self.operand.py_result(),
5060                 code.error_goto_if_null(self.result(), self.pos)))
5061         code.put_gotref(self.py_result())
5062
5063     def type_error(self):
5064         if not self.operand.type.is_error:
5065             error(self.pos, "Invalid operand type for '%s' (%s)" %
5066                 (self.operator, self.operand.type))
5067         self.type = PyrexTypes.error_type
5068
5069     def analyse_cpp_operation(self, env):
5070         type = self.operand.type
5071         if type.is_ptr:
5072             type = type.base_type
5073         function = type.scope.lookup("operator%s" % self.operator)
5074         if not function:
5075             error(self.pos, "'%s' operator not defined for %s"
5076                 % (self.operator, type))
5077             self.type_error()
5078             return
5079         func_type = function.type
5080         if func_type.is_ptr:
5081             func_type = func_type.base_type
5082         self.type = func_type.return_type
5083
5084
5085 class NotNode(ExprNode):
5086     #  'not' operator
5087     #
5088     #  operand   ExprNode
5089
5090     type = PyrexTypes.c_bint_type
5091
5092     subexprs = ['operand']
5093
5094     def calculate_constant_result(self):
5095         self.constant_result = not self.operand.constant_result
5096
5097     def compile_time_value(self, denv):
5098         operand = self.operand.compile_time_value(denv)
5099         try:
5100             return not operand
5101         except Exception, e:
5102             self.compile_time_value_error(e)
5103
5104     def infer_type(self, env):
5105         return PyrexTypes.c_bint_type
5106
5107     def analyse_types(self, env):
5108         self.operand.analyse_types(env)
5109         self.operand = self.operand.coerce_to_boolean(env)
5110
5111     def calculate_result_code(self):
5112         return "(!%s)" % self.operand.result()
5113
5114     def generate_result_code(self, code):
5115         pass
5116
5117
5118 class UnaryPlusNode(UnopNode):
5119     #  unary '+' operator
5120
5121     operator = '+'
5122
5123     def analyse_c_operation(self, env):
5124         self.type = self.operand.type
5125
5126     def py_operation_function(self):
5127         return "PyNumber_Positive"
5128
5129     def calculate_result_code(self):
5130         if self.is_cpp_operation():
5131             return "(+%s)" % self.operand.result()
5132         else:
5133             return self.operand.result()
5134
5135
5136 class UnaryMinusNode(UnopNode):
5137     #  unary '-' operator
5138
5139     operator = '-'
5140
5141     def analyse_c_operation(self, env):
5142         if self.operand.type.is_numeric:
5143             self.type = self.operand.type
5144         else:
5145             self.type_error()
5146         if self.type.is_complex:
5147             self.infix = False
5148
5149     def py_operation_function(self):
5150         return "PyNumber_Negative"
5151
5152     def calculate_result_code(self):
5153         if self.infix:
5154             return "(-%s)" % self.operand.result()
5155         else:
5156             return "%s(%s)" % (self.operand.type.unary_op('-'), self.operand.result())
5157
5158     def get_constant_c_result_code(self):
5159         value = self.operand.get_constant_c_result_code()
5160         if value:
5161             return "(-%s)" % (value)
5162
5163 class TildeNode(UnopNode):
5164     #  unary '~' operator
5165
5166     def analyse_c_operation(self, env):
5167         if self.operand.type.is_int:
5168             self.type = self.operand.type
5169         else:
5170             self.type_error()
5171
5172     def py_operation_function(self):
5173         return "PyNumber_Invert"
5174
5175     def calculate_result_code(self):
5176         return "(~%s)" % self.operand.result()
5177
5178
5179 class CUnopNode(UnopNode):
5180
5181     def is_py_operation(self):
5182         return False
5183
5184 class DereferenceNode(CUnopNode):
5185     #  unary * operator
5186
5187     operator = '*'
5188
5189     def analyse_c_operation(self, env):
5190         if self.operand.type.is_ptr:
5191             self.type = self.operand.type.base_type
5192         else:
5193             self.type_error()
5194
5195     def calculate_result_code(self):
5196         return "(*%s)" % self.operand.result()
5197
5198
5199 class DecrementIncrementNode(CUnopNode):
5200     #  unary ++/-- operator
5201
5202     def analyse_c_operation(self, env):
5203         if self.operand.type.is_ptr or self.operand.type.is_numeric:
5204             self.type = self.operand.type
5205         else:
5206             self.type_error()
5207
5208     def calculate_result_code(self):
5209         if self.is_prefix:
5210             return "(%s%s)" % (self.operator, self.operand.result())
5211         else:
5212             return "(%s%s)" % (self.operand.result(), self.operator)
5213
5214 def inc_dec_constructor(is_prefix, operator):
5215     return lambda pos, **kwds: DecrementIncrementNode(pos, is_prefix=is_prefix, operator=operator, **kwds)
5216
5217
5218 class AmpersandNode(ExprNode):
5219     #  The C address-of operator.
5220     #
5221     #  operand  ExprNode
5222
5223     subexprs = ['operand']
5224
5225     def infer_type(self, env):
5226         return PyrexTypes.c_ptr_type(self.operand.infer_type(env))
5227
5228     def analyse_types(self, env):
5229         self.operand.analyse_types(env)
5230         argtype = self.operand.type
5231         if not (argtype.is_cfunction or self.operand.is_lvalue()):
5232             self.error("Taking address of non-lvalue")
5233             return
5234         if argtype.is_pyobject:
5235             self.error("Cannot take address of Python variable")
5236             return
5237         self.type = PyrexTypes.c_ptr_type(argtype)
5238
5239     def check_const(self):
5240         return self.operand.check_const_addr()
5241
5242     def error(self, mess):
5243         error(self.pos, mess)
5244         self.type = PyrexTypes.error_type
5245         self.result_code = "<error>"
5246
5247     def calculate_result_code(self):
5248         return "(&%s)" % self.operand.result()
5249
5250     def generate_result_code(self, code):
5251         pass
5252
5253
5254 unop_node_classes = {
5255     "+":  UnaryPlusNode,
5256     "-":  UnaryMinusNode,
5257     "~":  TildeNode,
5258 }
5259
5260 def unop_node(pos, operator, operand):
5261     # Construct unnop node of appropriate class for
5262     # given operator.
5263     if isinstance(operand, IntNode) and operator == '-':
5264         return IntNode(pos = operand.pos, value = str(-Utils.str_to_number(operand.value)))
5265     elif isinstance(operand, UnopNode) and operand.operator == operator:
5266         warning(pos, "Python has no increment/decrement operator: %s%sx = %s(%sx) = x" % ((operator,)*4), 5)
5267     return unop_node_classes[operator](pos,
5268         operator = operator,
5269         operand = operand)
5270
5271
5272 class TypecastNode(ExprNode):
5273     #  C type cast
5274     #
5275     #  operand      ExprNode
5276     #  base_type    CBaseTypeNode
5277     #  declarator   CDeclaratorNode
5278     #
5279     #  If used from a transform, one can if wanted specify the attribute
5280     #  "type" directly and leave base_type and declarator to None
5281
5282     subexprs = ['operand']
5283     base_type = declarator = type = None
5284
5285     def type_dependencies(self, env):
5286         return ()
5287
5288     def infer_type(self, env):
5289         if self.type is None:
5290             base_type = self.base_type.analyse(env)
5291             _, self.type = self.declarator.analyse(base_type, env)
5292         return self.type
5293
5294     def analyse_types(self, env):
5295         if self.type is None:
5296             base_type = self.base_type.analyse(env)
5297             _, self.type = self.declarator.analyse(base_type, env)
5298         if self.type.is_cfunction:
5299             error(self.pos,
5300                 "Cannot cast to a function type")
5301             self.type = PyrexTypes.error_type
5302         self.operand.analyse_types(env)
5303         to_py = self.type.is_pyobject
5304         from_py = self.operand.type.is_pyobject
5305         if from_py and not to_py and self.operand.is_ephemeral() and not self.type.is_numeric:
5306             error(self.pos, "Casting temporary Python object to non-numeric non-Python type")
5307         if to_py and not from_py:
5308             if self.type is bytes_type and self.operand.type.is_int:
5309                 # FIXME: the type cast node isn't needed in this case
5310                 # and can be dropped once analyse_types() can return a
5311                 # different node
5312                 self.operand = CoerceIntToBytesNode(self.operand, env)
5313             elif self.operand.type.can_coerce_to_pyobject(env):
5314                 self.result_ctype = py_object_type
5315                 self.operand = self.operand.coerce_to_pyobject(env)
5316             else:
5317                 if self.operand.type.is_ptr:
5318                     if not (self.operand.type.base_type.is_void or self.operand.type.base_type.is_struct):
5319                         error(self.pos, "Python objects cannot be cast from pointers of primitive types")
5320                 else:
5321                     # Should this be an error?
5322                     warning(self.pos, "No conversion from %s to %s, python object pointer used." % (self.operand.type, self.type))
5323                 self.operand = self.operand.coerce_to_simple(env)
5324         elif from_py and not to_py:
5325             if self.type.create_from_py_utility_code(env):
5326                 self.operand = self.operand.coerce_to(self.type, env)
5327             elif self.type.is_ptr:
5328                 if not (self.type.base_type.is_void or self.type.base_type.is_struct):
5329                     error(self.pos, "Python objects cannot be cast to pointers of primitive types")
5330             else:
5331                 warning(self.pos, "No conversion from %s to %s, python object pointer used." % (self.type, self.operand.type))
5332         elif from_py and to_py:
5333             if self.typecheck and self.type.is_extension_type:
5334                 self.operand = PyTypeTestNode(self.operand, self.type, env, notnone=True)
5335         elif self.type.is_complex and self.operand.type.is_complex:
5336             self.operand = self.operand.coerce_to_simple(env)
5337
5338     def nogil_check(self, env):
5339         if self.type and self.type.is_pyobject and self.is_temp:
5340             self.gil_error()
5341
5342     def check_const(self):
5343         return self.operand.check_const()
5344
5345     def calculate_constant_result(self):
5346         # we usually do not know the result of a type cast at code
5347         # generation time
5348         pass
5349
5350     def calculate_result_code(self):
5351         if self.type.is_complex:
5352             operand_result = self.operand.result()
5353             if self.operand.type.is_complex:
5354                 real_part = self.type.real_type.cast_code("__Pyx_CREAL(%s)" % operand_result)
5355                 imag_part = self.type.real_type.cast_code("__Pyx_CIMAG(%s)" % operand_result)
5356             else:
5357                 real_part = self.type.real_type.cast_code(operand_result)
5358                 imag_part = "0"
5359             return "%s(%s, %s)" % (
5360                     self.type.from_parts,
5361                     real_part,
5362                     imag_part)
5363         else:
5364             return self.type.cast_code(self.operand.result())
5365
5366     def get_constant_c_result_code(self):
5367         operand_result = self.operand.get_constant_c_result_code()
5368         if operand_result:
5369             return self.type.cast_code(operand_result)
5370
5371     def result_as(self, type):
5372         if self.type.is_pyobject and not self.is_temp:
5373             #  Optimise away some unnecessary casting
5374             return self.operand.result_as(type)
5375         else:
5376             return ExprNode.result_as(self, type)
5377
5378     def generate_result_code(self, code):
5379         if self.is_temp:
5380             code.putln(
5381                 "%s = (PyObject *)%s;" % (
5382                     self.result(),
5383                     self.operand.result()))
5384             code.put_incref(self.result(), self.ctype())
5385
5386
5387 class SizeofNode(ExprNode):
5388     #  Abstract base class for sizeof(x) expression nodes.
5389
5390     type = PyrexTypes.c_size_t_type
5391
5392     def check_const(self):
5393         return True
5394
5395     def generate_result_code(self, code):
5396         pass
5397
5398
5399 class SizeofTypeNode(SizeofNode):
5400     #  C sizeof function applied to a type
5401     #
5402     #  base_type   CBaseTypeNode
5403     #  declarator  CDeclaratorNode
5404
5405     subexprs = []
5406     arg_type = None
5407
5408     def analyse_types(self, env):
5409         # we may have incorrectly interpreted a dotted name as a type rather than an attribute
5410         # this could be better handled by more uniformly treating types as runtime-available objects
5411         if 0 and self.base_type.module_path:
5412             path = self.base_type.module_path
5413             obj = env.lookup(path[0])
5414             if obj.as_module is None:
5415                 operand = NameNode(pos=self.pos, name=path[0])
5416                 for attr in path[1:]:
5417                     operand = AttributeNode(pos=self.pos, obj=operand, attribute=attr)
5418                 operand = AttributeNode(pos=self.pos, obj=operand, attribute=self.base_type.name)
5419                 self.operand = operand
5420                 self.__class__ = SizeofVarNode
5421                 self.analyse_types(env)
5422                 return
5423         if self.arg_type is None:
5424             base_type = self.base_type.analyse(env)
5425             _, arg_type = self.declarator.analyse(base_type, env)
5426             self.arg_type = arg_type
5427         self.check_type()
5428
5429     def check_type(self):
5430         arg_type = self.arg_type
5431         if arg_type.is_pyobject and not arg_type.is_extension_type:
5432             error(self.pos, "Cannot take sizeof Python object")
5433         elif arg_type.is_void:
5434             error(self.pos, "Cannot take sizeof void")
5435         elif not arg_type.is_complete():
5436             error(self.pos, "Cannot take sizeof incomplete type '%s'" % arg_type)
5437
5438     def calculate_result_code(self):
5439         if self.arg_type.is_extension_type:
5440             # the size of the pointer is boring
5441             # we want the size of the actual struct
5442             arg_code = self.arg_type.declaration_code("", deref=1)
5443         else:
5444             arg_code = self.arg_type.declaration_code("")
5445         return "(sizeof(%s))" % arg_code
5446
5447
5448 class SizeofVarNode(SizeofNode):
5449     #  C sizeof function applied to a variable
5450     #
5451     #  operand   ExprNode
5452
5453     subexprs = ['operand']
5454
5455     def analyse_types(self, env):
5456         # We may actually be looking at a type rather than a variable...
5457         # If we are, traditional analysis would fail...
5458         operand_as_type = self.operand.analyse_as_type(env)
5459         if operand_as_type:
5460             self.arg_type = operand_as_type
5461             self.__class__ = SizeofTypeNode
5462             self.check_type()
5463         else:
5464             self.operand.analyse_types(env)
5465
5466     def calculate_result_code(self):
5467         return "(sizeof(%s))" % self.operand.result()
5468
5469     def generate_result_code(self, code):
5470         pass
5471
5472 class TypeofNode(ExprNode):
5473     #  Compile-time type of an expression, as a string.
5474     #
5475     #  operand   ExprNode
5476     #  literal   StringNode # internal
5477
5478     literal = None
5479     type = py_object_type
5480
5481     subexprs = ['literal'] # 'operand' will be ignored after type analysis!
5482
5483     def analyse_types(self, env):
5484         self.operand.analyse_types(env)
5485         self.literal = StringNode(
5486             self.pos, value=StringEncoding.EncodedString(str(self.operand.type)))
5487         self.literal.analyse_types(env)
5488         self.literal = self.literal.coerce_to_pyobject(env)
5489
5490     def may_be_none(self):
5491         return False
5492
5493     def generate_evaluation_code(self, code):
5494         self.literal.generate_evaluation_code(code)
5495
5496     def calculate_result_code(self):
5497         return self.literal.calculate_result_code()
5498
5499 #-------------------------------------------------------------------
5500 #
5501 #  Binary operator nodes
5502 #
5503 #-------------------------------------------------------------------
5504
5505 def _not_in(x, seq):
5506     return x not in seq
5507
5508 compile_time_binary_operators = {
5509     '<': operator.lt,
5510     '<=': operator.le,
5511     '==': operator.eq,
5512     '!=': operator.ne,
5513     '>=': operator.ge,
5514     '>': operator.gt,
5515     'is': operator.is_,
5516     'is_not': operator.is_not,
5517     '+': operator.add,
5518     '&': operator.and_,
5519     '/': operator.truediv,
5520     '//': operator.floordiv,
5521     '<<': operator.lshift,
5522     '%': operator.mod,
5523     '*': operator.mul,
5524     '|': operator.or_,
5525     '**': operator.pow,
5526     '>>': operator.rshift,
5527     '-': operator.sub,
5528     '^': operator.xor,
5529     'in': operator.contains,
5530     'not_in': _not_in,
5531 }
5532
5533 def get_compile_time_binop(node):
5534     func = compile_time_binary_operators.get(node.operator)
5535     if not func:
5536         error(node.pos,
5537             "Binary '%s' not supported in compile-time expression"
5538                 % node.operator)
5539     return func
5540
5541 class BinopNode(ExprNode):
5542     #  operator     string
5543     #  operand1     ExprNode
5544     #  operand2     ExprNode
5545     #
5546     #  Processing during analyse_expressions phase:
5547     #
5548     #    analyse_c_operation
5549     #      Called when neither operand is a pyobject.
5550     #      - Check operand types and coerce if needed.
5551     #      - Determine result type and result code fragment.
5552     #      - Allocate temporary for result if needed.
5553
5554     subexprs = ['operand1', 'operand2']
5555     inplace = False
5556
5557     def calculate_constant_result(self):
5558         func = compile_time_binary_operators[self.operator]
5559         self.constant_result = func(
5560             self.operand1.constant_result,
5561             self.operand2.constant_result)
5562
5563     def compile_time_value(self, denv):
5564         func = get_compile_time_binop(self)
5565         operand1 = self.operand1.compile_time_value(denv)
5566         operand2 = self.operand2.compile_time_value(denv)
5567         try:
5568             return func(operand1, operand2)
5569         except Exception, e:
5570             self.compile_time_value_error(e)
5571
5572     def infer_type(self, env):
5573         return self.result_type(self.operand1.infer_type(env),
5574                                 self.operand2.infer_type(env))
5575
5576     def analyse_types(self, env):
5577         self.operand1.analyse_types(env)
5578         self.operand2.analyse_types(env)
5579         self.analyse_operation(env)
5580
5581     def analyse_operation(self, env):
5582         if self.is_py_operation():
5583             self.coerce_operands_to_pyobjects(env)
5584             self.type = self.result_type(self.operand1.type,
5585                                          self.operand2.type)
5586             assert self.type.is_pyobject
5587             self.is_temp = 1
5588         elif self.is_cpp_operation():
5589             self.analyse_cpp_operation(env)
5590         else:
5591             self.analyse_c_operation(env)
5592
5593     def is_py_operation(self):
5594         return self.is_py_operation_types(self.operand1.type, self.operand2.type)
5595
5596     def is_py_operation_types(self, type1, type2):
5597         return type1.is_pyobject or type2.is_pyobject
5598
5599     def is_cpp_operation(self):
5600         return (self.operand1.type.is_cpp_class
5601             or self.operand2.type.is_cpp_class)
5602
5603     def analyse_cpp_operation(self, env):
5604         type1 = self.operand1.type
5605         type2 = self.operand2.type
5606         entry = env.lookup_operator(self.operator, [self.operand1, self.operand2])
5607         if not entry:
5608             self.type_error()
5609             return
5610         func_type = entry.type
5611         if func_type.is_ptr:
5612             func_type = func_type.base_type
5613         if len(func_type.args) == 1:
5614             self.operand2 = self.operand2.coerce_to(func_type.args[0].type, env)
5615         else:
5616             self.operand1 = self.operand1.coerce_to(func_type.args[0].type, env)
5617             self.operand2 = self.operand2.coerce_to(func_type.args[1].type, env)
5618         self.type = func_type.return_type
5619
5620     def result_type(self, type1, type2):
5621         if self.is_py_operation_types(type1, type2):
5622             if type2.is_string:
5623                 type2 = Builtin.bytes_type
5624             if type1.is_string:
5625                 type1 = Builtin.bytes_type
5626             elif self.operator == '%' \
5627                      and type1 in (Builtin.str_type, Builtin.unicode_type):
5628                 # note that  b'%s' % b'abc'  doesn't work in Py3
5629                 return type1
5630             if type1.is_builtin_type:
5631                 if type1 is type2:
5632                     if self.operator in '**%+|&^':
5633                         # FIXME: at least these operators should be safe - others?
5634                         return type1
5635                 elif self.operator == '*':
5636                     if type1 in (Builtin.bytes_type, Builtin.str_type, Builtin.unicode_type):
5637                         return type1
5638                     # multiplication of containers/numbers with an
5639                     # integer value always (?) returns the same type
5640                     if type2.is_int:
5641                         return type1
5642             elif type2.is_builtin_type and type1.is_int and self.operator == '*':
5643                 # multiplication of containers/numbers with an
5644                 # integer value always (?) returns the same type
5645                 return type2
5646             return py_object_type
5647         else:
5648             return self.compute_c_result_type(type1, type2)
5649
5650     def nogil_check(self, env):
5651         if self.is_py_operation():
5652             self.gil_error()
5653
5654     def coerce_operands_to_pyobjects(self, env):
5655         self.operand1 = self.operand1.coerce_to_pyobject(env)
5656         self.operand2 = self.operand2.coerce_to_pyobject(env)
5657
5658     def check_const(self):
5659         return self.operand1.check_const() and self.operand2.check_const()
5660
5661     def generate_result_code(self, code):
5662         #print "BinopNode.generate_result_code:", self.operand1, self.operand2 ###
5663         if self.operand1.type.is_pyobject:
5664             function = self.py_operation_function()
5665             if self.operator == '**':
5666                 extra_args = ", Py_None"
5667             else:
5668                 extra_args = ""
5669             code.putln(
5670                 "%s = %s(%s, %s%s); %s" % (
5671                     self.result(),
5672                     function,
5673                     self.operand1.py_result(),
5674                     self.operand2.py_result(),
5675                     extra_args,
5676                     code.error_goto_if_null(self.result(), self.pos)))
5677             code.put_gotref(self.py_result())
5678
5679     def type_error(self):
5680         if not (self.operand1.type.is_error
5681                 or self.operand2.type.is_error):
5682             error(self.pos, "Invalid operand types for '%s' (%s; %s)" %
5683                 (self.operator, self.operand1.type,
5684                     self.operand2.type))
5685         self.type = PyrexTypes.error_type
5686
5687
5688 class CBinopNode(BinopNode):
5689
5690     def analyse_types(self, env):
5691         BinopNode.analyse_types(self, env)
5692         if self.is_py_operation():
5693             self.type = PyrexTypes.error_type
5694
5695     def py_operation_function():
5696         return ""
5697
5698     def calculate_result_code(self):
5699         return "(%s %s %s)" % (
5700             self.operand1.result(),
5701             self.operator,
5702             self.operand2.result())
5703
5704
5705 def c_binop_constructor(operator):
5706     def make_binop_node(pos, **operands):
5707         return CBinopNode(pos, operator=operator, **operands)
5708     return make_binop_node
5709
5710 class NumBinopNode(BinopNode):
5711     #  Binary operation taking numeric arguments.
5712
5713     infix = True
5714
5715     def analyse_c_operation(self, env):
5716         type1 = self.operand1.type
5717         type2 = self.operand2.type
5718         self.type = self.compute_c_result_type(type1, type2)
5719         if not self.type:
5720             self.type_error()
5721             return
5722         if self.type.is_complex:
5723             self.infix = False
5724         if not self.infix or (type1.is_numeric and type2.is_numeric):
5725             self.operand1 = self.operand1.coerce_to(self.type, env)
5726             self.operand2 = self.operand2.coerce_to(self.type, env)
5727
5728     def compute_c_result_type(self, type1, type2):
5729         if self.c_types_okay(type1, type2):
5730             widest_type = PyrexTypes.widest_numeric_type(type1, type2)
5731             if widest_type is PyrexTypes.c_bint_type:
5732                 if self.operator not in '|^&':
5733                     # False + False == 0 # not False!
5734                     widest_type = PyrexTypes.c_int_type
5735             return widest_type
5736         else:
5737             return None
5738
5739     def get_constant_c_result_code(self):
5740         value1 = self.operand1.get_constant_c_result_code()
5741         value2 = self.operand2.get_constant_c_result_code()
5742         if value1 and value2:
5743             return "(%s %s %s)" % (value1, self.operator, value2)
5744         else:
5745             return None
5746
5747     def c_types_okay(self, type1, type2):
5748         #print "NumBinopNode.c_types_okay:", type1, type2 ###
5749         return (type1.is_numeric  or type1.is_enum) \
5750             and (type2.is_numeric  or type2.is_enum)
5751
5752     def calculate_result_code(self):
5753         if self.infix:
5754             return "(%s %s %s)" % (
5755                 self.operand1.result(),
5756                 self.operator,
5757                 self.operand2.result())
5758         else:
5759             func = self.type.binary_op(self.operator)
5760             if func is None:
5761                 error(self.pos, "binary operator %s not supported for %s" % (self.operator, self.type))
5762             return "%s(%s, %s)" % (
5763                 func,
5764                 self.operand1.result(),
5765                 self.operand2.result())
5766
5767     def is_py_operation_types(self, type1, type2):
5768         return (type1 is PyrexTypes.c_py_unicode_type or
5769                 type2 is PyrexTypes.c_py_unicode_type or
5770                 BinopNode.is_py_operation_types(self, type1, type2))
5771
5772     def py_operation_function(self):
5773         fuction = self.py_functions[self.operator]
5774         if self.inplace:
5775             fuction = fuction.replace('PyNumber_', 'PyNumber_InPlace')
5776         return fuction
5777
5778     py_functions = {
5779         "|":        "PyNumber_Or",
5780         "^":        "PyNumber_Xor",
5781         "&":        "PyNumber_And",
5782         "<<":       "PyNumber_Lshift",
5783         ">>":       "PyNumber_Rshift",
5784         "+":        "PyNumber_Add",
5785         "-":        "PyNumber_Subtract",
5786         "*":        "PyNumber_Multiply",
5787         "/":        "__Pyx_PyNumber_Divide",
5788         "//":       "PyNumber_FloorDivide",
5789         "%":        "PyNumber_Remainder",
5790         "**":       "PyNumber_Power"
5791     }
5792
5793 class IntBinopNode(NumBinopNode):
5794     #  Binary operation taking integer arguments.
5795
5796     def c_types_okay(self, type1, type2):
5797         #print "IntBinopNode.c_types_okay:", type1, type2 ###
5798         return (type1.is_int or type1.is_enum) \
5799             and (type2.is_int or type2.is_enum)
5800
5801
5802 class AddNode(NumBinopNode):
5803     #  '+' operator.
5804
5805     def is_py_operation_types(self, type1, type2):
5806         if type1.is_string and type2.is_string:
5807             return 1
5808         else:
5809             return NumBinopNode.is_py_operation_types(self, type1, type2)
5810
5811     def compute_c_result_type(self, type1, type2):
5812         #print "AddNode.compute_c_result_type:", type1, self.operator, type2 ###
5813         if (type1.is_ptr or type1.is_array) and (type2.is_int or type2.is_enum):
5814             return type1
5815         elif (type2.is_ptr or type2.is_array) and (type1.is_int or type1.is_enum):
5816             return type2
5817         else:
5818             return NumBinopNode.compute_c_result_type(
5819                 self, type1, type2)
5820
5821
5822 class SubNode(NumBinopNode):
5823     #  '-' operator.
5824
5825     def compute_c_result_type(self, type1, type2):
5826         if (type1.is_ptr or type1.is_array) and (type2.is_int or type2.is_enum):
5827             return type1
5828         elif (type1.is_ptr or type1.is_array) and (type2.is_ptr or type2.is_array):
5829             return PyrexTypes.c_int_type
5830         else:
5831             return NumBinopNode.compute_c_result_type(
5832                 self, type1, type2)
5833
5834
5835 class MulNode(NumBinopNode):
5836     #  '*' operator.
5837
5838     def is_py_operation_types(self, type1, type2):
5839         if (type1.is_string and type2.is_int) \
5840             or (type2.is_string and type1.is_int):
5841                 return 1
5842         else:
5843             return NumBinopNode.is_py_operation_types(self, type1, type2)
5844
5845
5846 class DivNode(NumBinopNode):
5847     #  '/' or '//' operator.
5848
5849     cdivision = None
5850     truedivision = None   # == "unknown" if operator == '/'
5851     ctruedivision = False
5852     cdivision_warnings = False
5853     zerodivision_check = None
5854
5855     def find_compile_time_binary_operator(self, op1, op2):
5856         func = compile_time_binary_operators[self.operator]
5857         if self.operator == '/' and self.truedivision is None:
5858             # => true div for floats, floor div for integers
5859             if isinstance(op1, (int,long)) and isinstance(op2, (int,long)):
5860                 func = compile_time_binary_operators['//']
5861         return func
5862
5863     def calculate_constant_result(self):
5864         op1 = self.operand1.constant_result
5865         op2 = self.operand2.constant_result
5866         func = self.find_compile_time_binary_operator(op1, op2)
5867         self.constant_result = func(
5868             self.operand1.constant_result,
5869             self.operand2.constant_result)
5870
5871     def compile_time_value(self, denv):
5872         operand1 = self.operand1.compile_time_value(denv)
5873         operand2 = self.operand2.compile_time_value(denv)
5874         try:
5875             func = self.find_compile_time_binary_operator(
5876                 self, operand1, operand2)
5877             return func(operand1, operand2)
5878         except Exception, e:
5879             self.compile_time_value_error(e)
5880
5881     def analyse_operation(self, env):
5882         if self.cdivision or env.directives['cdivision']:
5883             self.ctruedivision = False
5884         else:
5885             self.ctruedivision = self.truedivision
5886         NumBinopNode.analyse_operation(self, env)
5887         if self.is_cpp_operation():
5888             self.cdivision = True
5889         if not self.type.is_pyobject:
5890             self.zerodivision_check = (
5891                 self.cdivision is None and not env.directives['cdivision']
5892                 and (not self.operand2.has_constant_result() or
5893                      self.operand2.constant_result == 0))
5894             if self.zerodivision_check or env.directives['cdivision_warnings']:
5895                 # Need to check ahead of time to warn or raise zero division error
5896                 self.operand1 = self.operand1.coerce_to_simple(env)
5897                 self.operand2 = self.operand2.coerce_to_simple(env)
5898                 if env.nogil:
5899                     error(self.pos, "Pythonic division not allowed without gil, consider using cython.cdivision(True)")
5900
5901     def compute_c_result_type(self, type1, type2):
5902         if self.operator == '/' and self.ctruedivision:
5903             if not type1.is_float and not type2.is_float:
5904                 widest_type = PyrexTypes.widest_numeric_type(type1, PyrexTypes.c_double_type)
5905                 widest_type = PyrexTypes.widest_numeric_type(type2, widest_type)
5906                 return widest_type
5907         return NumBinopNode.compute_c_result_type(self, type1, type2)
5908
5909     def zero_division_message(self):
5910         if self.type.is_int:
5911             return "integer division or modulo by zero"
5912         else:
5913             return "float division"
5914
5915     def generate_evaluation_code(self, code):
5916         if not self.type.is_pyobject and not self.type.is_complex:
5917             if self.cdivision is None:
5918                 self.cdivision = (code.globalstate.directives['cdivision']
5919                                     or not self.type.signed
5920                                     or self.type.is_float)
5921             if not self.cdivision:
5922                 code.globalstate.use_utility_code(div_int_utility_code.specialize(self.type))
5923         NumBinopNode.generate_evaluation_code(self, code)
5924         self.generate_div_warning_code(code)
5925
5926     def generate_div_warning_code(self, code):
5927         if not self.type.is_pyobject:
5928             if self.zerodivision_check:
5929                 if not self.infix:
5930                     zero_test = "%s(%s)" % (self.type.unary_op('zero'), self.operand2.result())
5931                 else:
5932                     zero_test = "%s == 0" % self.operand2.result()
5933                 code.putln("if (unlikely(%s)) {" % zero_test)
5934                 code.putln('PyErr_Format(PyExc_ZeroDivisionError, "%s");' % self.zero_division_message())
5935                 code.putln(code.error_goto(self.pos))
5936                 code.putln("}")
5937                 if self.type.is_int and self.type.signed and self.operator != '%':
5938                     code.globalstate.use_utility_code(division_overflow_test_code)
5939                     code.putln("else if (sizeof(%s) == sizeof(long) && unlikely(%s == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(%s))) {" % (
5940                                     self.type.declaration_code(''),
5941                                     self.operand2.result(),
5942                                     self.operand1.result()))
5943                     code.putln('PyErr_Format(PyExc_OverflowError, "value too large to perform division");')
5944                     code.putln(code.error_goto(self.pos))
5945                     code.putln("}")
5946             if code.globalstate.directives['cdivision_warnings'] and self.operator != '/':
5947                 code.globalstate.use_utility_code(cdivision_warning_utility_code)
5948                 code.putln("if ((%s < 0) ^ (%s < 0)) {" % (
5949                                 self.operand1.result(),
5950                                 self.operand2.result()))
5951                 code.putln(code.set_error_info(self.pos));
5952                 code.put("if (__Pyx_cdivision_warning()) ")
5953                 code.put_goto(code.error_label)
5954                 code.putln("}")
5955
5956     def calculate_result_code(self):
5957         if self.type.is_complex:
5958             return NumBinopNode.calculate_result_code(self)
5959         elif self.type.is_float and self.operator == '//':
5960             return "floor(%s / %s)" % (
5961                 self.operand1.result(),
5962                 self.operand2.result())
5963         elif self.truedivision or self.cdivision:
5964             op1 = self.operand1.result()
5965             op2 = self.operand2.result()
5966             if self.truedivision:
5967                 if self.type != self.operand1.type:
5968                     op1 = self.type.cast_code(op1)
5969                 if self.type != self.operand2.type:
5970                     op2 = self.type.cast_code(op2)
5971             return "(%s / %s)" % (op1, op2)
5972         else:
5973             return "__Pyx_div_%s(%s, %s)" % (
5974                     self.type.specialization_name(),
5975                     self.operand1.result(),
5976                     self.operand2.result())
5977
5978
5979 class ModNode(DivNode):
5980     #  '%' operator.
5981
5982     def is_py_operation_types(self, type1, type2):
5983         return (type1.is_string
5984             or type2.is_string
5985             or NumBinopNode.is_py_operation_types(self, type1, type2))
5986
5987     def zero_division_message(self):
5988         if self.type.is_int:
5989             return "integer division or modulo by zero"
5990         else:
5991             return "float divmod()"
5992
5993     def generate_evaluation_code(self, code):
5994         if not self.type.is_pyobject:
5995             if self.cdivision is None:
5996                 self.cdivision = code.globalstate.directives['cdivision'] or not self.type.signed
5997             if not self.cdivision:
5998                 if self.type.is_int:
5999                     code.globalstate.use_utility_code(mod_int_utility_code.specialize(self.type))
6000                 else:
6001                     code.globalstate.use_utility_code(
6002                         mod_float_utility_code.specialize(self.type, math_h_modifier=self.type.math_h_modifier))
6003         NumBinopNode.generate_evaluation_code(self, code)
6004         self.generate_div_warning_code(code)
6005
6006     def calculate_result_code(self):
6007         if self.cdivision:
6008             if self.type.is_float:
6009                 return "fmod%s(%s, %s)" % (
6010                     self.type.math_h_modifier,
6011                     self.operand1.result(),
6012                     self.operand2.result())
6013             else:
6014                 return "(%s %% %s)" % (
6015                     self.operand1.result(),
6016                     self.operand2.result())
6017         else:
6018             return "__Pyx_mod_%s(%s, %s)" % (
6019                     self.type.specialization_name(),
6020                     self.operand1.result(),
6021                     self.operand2.result())
6022
6023 class PowNode(NumBinopNode):
6024     #  '**' operator.
6025
6026     def analyse_c_operation(self, env):
6027         NumBinopNode.analyse_c_operation(self, env)
6028         if self.type.is_complex:
6029             if self.type.real_type.is_float:
6030                 self.operand1 = self.operand1.coerce_to(self.type, env)
6031                 self.operand2 = self.operand2.coerce_to(self.type, env)
6032                 self.pow_func = "__Pyx_c_pow" + self.type.real_type.math_h_modifier
6033             else:
6034                 error(self.pos, "complex int powers not supported")
6035                 self.pow_func = "<error>"
6036         elif self.type.is_float:
6037             self.pow_func = "pow" + self.type.math_h_modifier
6038         else:
6039             self.pow_func = "__Pyx_pow_%s" % self.type.declaration_code('').replace(' ', '_')
6040             env.use_utility_code(
6041                     int_pow_utility_code.specialize(func_name=self.pow_func,
6042                                                 type=self.type.declaration_code('')))
6043
6044     def calculate_result_code(self):
6045         # Work around MSVC overloading ambiguity.
6046         def typecast(operand):
6047             if self.type == operand.type:
6048                 return operand.result()
6049             else:
6050                 return self.type.cast_code(operand.result())
6051         return "%s(%s, %s)" % (
6052             self.pow_func,
6053             typecast(self.operand1),
6054             typecast(self.operand2))
6055
6056
6057 # Note: This class is temporarily "shut down" into an ineffective temp
6058 # allocation mode.
6059 #
6060 # More sophisticated temp reuse was going on before, one could have a
6061 # look at adding this again after /all/ classes are converted to the
6062 # new temp scheme. (The temp juggling cannot work otherwise).
6063 class BoolBinopNode(ExprNode):
6064     #  Short-circuiting boolean operation.
6065     #
6066     #  operator     string
6067     #  operand1     ExprNode
6068     #  operand2     ExprNode
6069
6070     subexprs = ['operand1', 'operand2']
6071
6072     def infer_type(self, env):
6073         type1 = self.operand1.infer_type(env)
6074         type2 = self.operand2.infer_type(env)
6075         return PyrexTypes.independent_spanning_type(type1, type2)
6076
6077     def may_be_none(self):
6078         if self.operator == 'or':
6079             return self.operand2.may_be_none()
6080         else:
6081             return self.operand1.may_be_none() or self.operand2.may_be_none()
6082
6083     def calculate_constant_result(self):
6084         if self.operator == 'and':
6085             self.constant_result = \
6086                 self.operand1.constant_result and \
6087                 self.operand2.constant_result
6088         else:
6089             self.constant_result = \
6090                 self.operand1.constant_result or \
6091                 self.operand2.constant_result
6092
6093     def compile_time_value(self, denv):
6094         if self.operator == 'and':
6095             return self.operand1.compile_time_value(denv) \
6096                 and self.operand2.compile_time_value(denv)
6097         else:
6098             return self.operand1.compile_time_value(denv) \
6099                 or self.operand2.compile_time_value(denv)
6100
6101     def coerce_to_boolean(self, env):
6102         return BoolBinopNode(
6103             self.pos,
6104             operator = self.operator,
6105             operand1 = self.operand1.coerce_to_boolean(env),
6106             operand2 = self.operand2.coerce_to_boolean(env),
6107             type = PyrexTypes.c_bint_type,
6108             is_temp = self.is_temp)
6109
6110     def analyse_types(self, env):
6111         self.operand1.analyse_types(env)
6112         self.operand2.analyse_types(env)
6113         self.type = PyrexTypes.independent_spanning_type(self.operand1.type, self.operand2.type)
6114         self.operand1 = self.operand1.coerce_to(self.type, env)
6115         self.operand2 = self.operand2.coerce_to(self.type, env)
6116
6117         # For what we're about to do, it's vital that
6118         # both operands be temp nodes.
6119         self.operand1 = self.operand1.coerce_to_simple(env)
6120         self.operand2 = self.operand2.coerce_to_simple(env)
6121         self.is_temp = 1
6122
6123     gil_message = "Truth-testing Python object"
6124
6125     def check_const(self):
6126         return self.operand1.check_const() and self.operand2.check_const()
6127
6128     def generate_evaluation_code(self, code):
6129         code.mark_pos(self.pos)
6130         self.operand1.generate_evaluation_code(code)
6131         test_result, uses_temp = self.generate_operand1_test(code)
6132         if self.operator == 'and':
6133             sense = ""
6134         else:
6135             sense = "!"
6136         code.putln(
6137             "if (%s%s) {" % (
6138                 sense,
6139                 test_result))
6140         if uses_temp:
6141             code.funcstate.release_temp(test_result)
6142         self.operand1.generate_disposal_code(code)
6143         self.operand2.generate_evaluation_code(code)
6144         self.allocate_temp_result(code)
6145         self.operand2.make_owned_reference(code)
6146         code.putln("%s = %s;" % (self.result(), self.operand2.result()))
6147         self.operand2.generate_post_assignment_code(code)
6148         self.operand2.free_temps(code)
6149         code.putln("} else {")
6150         self.operand1.make_owned_reference(code)
6151         code.putln("%s = %s;" % (self.result(), self.operand1.result()))
6152         self.operand1.generate_post_assignment_code(code)
6153         self.operand1.free_temps(code)
6154         code.putln("}")
6155
6156     def generate_operand1_test(self, code):
6157         #  Generate code to test the truth of the first operand.
6158         if self.type.is_pyobject:
6159             test_result = code.funcstate.allocate_temp(PyrexTypes.c_bint_type,
6160                                                        manage_ref=False)
6161             code.putln(
6162                 "%s = __Pyx_PyObject_IsTrue(%s); %s" % (
6163                     test_result,
6164                     self.operand1.py_result(),
6165                     code.error_goto_if_neg(test_result, self.pos)))
6166         else:
6167             test_result = self.operand1.result()
6168         return (test_result, self.type.is_pyobject)
6169
6170
6171 class CondExprNode(ExprNode):
6172     #  Short-circuiting conditional expression.
6173     #
6174     #  test        ExprNode
6175     #  true_val    ExprNode
6176     #  false_val   ExprNode
6177
6178     true_val = None
6179     false_val = None
6180
6181     subexprs = ['test', 'true_val', 'false_val']
6182
6183     def type_dependencies(self, env):
6184         return self.true_val.type_dependencies(env) + self.false_val.type_dependencies(env)
6185
6186     def infer_type(self, env):
6187         return PyrexTypes.independent_spanning_type(self.true_val.infer_type(env),
6188                                                     self.false_val.infer_type(env))
6189
6190     def calculate_constant_result(self):
6191         if self.test.constant_result:
6192             self.constant_result = self.true_val.constant_result
6193         else:
6194             self.constant_result = self.false_val.constant_result
6195
6196     def analyse_types(self, env):
6197         self.test.analyse_types(env)
6198         self.test = self.test.coerce_to_boolean(env)
6199         self.true_val.analyse_types(env)
6200         self.false_val.analyse_types(env)
6201         self.type = PyrexTypes.independent_spanning_type(self.true_val.type, self.false_val.type)
6202         if self.true_val.type.is_pyobject or self.false_val.type.is_pyobject:
6203             self.true_val = self.true_val.coerce_to(self.type, env)
6204             self.false_val = self.false_val.coerce_to(self.type, env)
6205         self.is_temp = 1
6206         if self.type == PyrexTypes.error_type:
6207             self.type_error()
6208
6209     def type_error(self):
6210         if not (self.true_val.type.is_error or self.false_val.type.is_error):
6211             error(self.pos, "Incompatable types in conditional expression (%s; %s)" %
6212                 (self.true_val.type, self.false_val.type))
6213         self.type = PyrexTypes.error_type
6214
6215     def check_const(self):
6216         return (self.test.check_const()
6217             and self.true_val.check_const()
6218             and self.false_val.check_const())
6219
6220     def generate_evaluation_code(self, code):
6221         # Because subexprs may not be evaluated we can use a more optimal
6222         # subexpr allocation strategy than the default, so override evaluation_code.
6223
6224         code.mark_pos(self.pos)
6225         self.allocate_temp_result(code)
6226         self.test.generate_evaluation_code(code)
6227         code.putln("if (%s) {" % self.test.result() )
6228         self.eval_and_get(code, self.true_val)
6229         code.putln("} else {")
6230         self.eval_and_get(code, self.false_val)
6231         code.putln("}")
6232         self.test.generate_disposal_code(code)
6233         self.test.free_temps(code)
6234
6235     def eval_and_get(self, code, expr):
6236         expr.generate_evaluation_code(code)
6237         expr.make_owned_reference(code)
6238         code.putln("%s = %s;" % (self.result(), expr.result()))
6239         expr.generate_post_assignment_code(code)
6240         expr.free_temps(code)
6241
6242 richcmp_constants = {
6243     "<" : "Py_LT",
6244     "<=": "Py_LE",
6245     "==": "Py_EQ",
6246     "!=": "Py_NE",
6247     "<>": "Py_NE",
6248     ">" : "Py_GT",
6249     ">=": "Py_GE",
6250 }
6251
6252 class CmpNode(object):
6253     #  Mixin class containing code common to PrimaryCmpNodes
6254     #  and CascadedCmpNodes.
6255
6256     special_bool_cmp_function = None
6257
6258     def infer_type(self, env):
6259         # TODO: Actually implement this (after merging with -unstable).
6260         return py_object_type
6261
6262     def calculate_cascaded_constant_result(self, operand1_result):
6263         func = compile_time_binary_operators[self.operator]
6264         operand2_result = self.operand2.constant_result
6265         result = func(operand1_result, operand2_result)
6266         if self.cascade:
6267             self.cascade.calculate_cascaded_constant_result(operand2_result)
6268             if self.cascade.constant_result:
6269                 self.constant_result = result and self.cascade.constant_result
6270         else:
6271             self.constant_result = result
6272
6273     def cascaded_compile_time_value(self, operand1, denv):
6274         func = get_compile_time_binop(self)
6275         operand2 = self.operand2.compile_time_value(denv)
6276         try:
6277             result = func(operand1, operand2)
6278         except Exception, e:
6279             self.compile_time_value_error(e)
6280             result = None
6281         if result:
6282             cascade = self.cascade
6283             if cascade:
6284                 # FIXME: I bet this must call cascaded_compile_time_value()
6285                 result = result and cascade.cascaded_compile_time_value(operand2, denv)
6286         return result
6287
6288     def is_cpp_comparison(self):
6289         return self.operand1.type.is_cpp_class or self.operand2.type.is_cpp_class
6290
6291     def find_common_int_type(self, env, op, operand1, operand2):
6292         # type1 != type2 and at least one of the types is not a C int
6293         type1 = operand1.type
6294         type2 = operand2.type
6295         type1_can_be_int = False
6296         type2_can_be_int = False
6297
6298         if isinstance(operand1, (StringNode, BytesNode, UnicodeNode)) \
6299                and operand1.can_coerce_to_char_literal():
6300             type1_can_be_int = True
6301         if isinstance(operand2, (StringNode, BytesNode, UnicodeNode)) \
6302                  and operand2.can_coerce_to_char_literal():
6303             type2_can_be_int = True
6304
6305         if type1.is_int:
6306             if type2_can_be_int:
6307                 return type1
6308         elif type2.is_int:
6309             if type1_can_be_int:
6310                 return type2
6311         elif type1_can_be_int:
6312             if type2_can_be_int:
6313                 return PyrexTypes.c_uchar_type
6314
6315         return None
6316
6317     def find_common_type(self, env, op, operand1, common_type=None):
6318         operand2 = self.operand2
6319         type1 = operand1.type
6320         type2 = operand2.type
6321
6322         new_common_type = None
6323
6324         # catch general errors
6325         if type1 == str_type and (type2.is_string or type2 in (bytes_type, unicode_type)) or \
6326                type2 == str_type and (type1.is_string or type1 in (bytes_type, unicode_type)):
6327             error(self.pos, "Comparisons between bytes/unicode and str are not portable to Python 3")
6328             new_common_type = error_type
6329
6330         # try to use numeric comparisons where possible
6331         elif type1.is_complex or type2.is_complex:
6332             if op not in ('==', '!='):
6333                 error(self.pos, "complex types are unordered")
6334                 new_common_type = error_type
6335             if type1.is_pyobject:
6336                 new_common_type = type1
6337             elif type2.is_pyobject:
6338                 new_common_type = type2
6339             else:
6340                 new_common_type = PyrexTypes.widest_numeric_type(type1, type2)
6341         elif type1.is_numeric and type2.is_numeric:
6342             new_common_type = PyrexTypes.widest_numeric_type(type1, type2)
6343         elif common_type is None or not common_type.is_pyobject:
6344             new_common_type = self.find_common_int_type(env, op, operand1, operand2)
6345
6346         if new_common_type is None:
6347             # fall back to generic type compatibility tests
6348             if type1 == type2:
6349                 new_common_type = type1
6350             elif type1.is_pyobject or type2.is_pyobject:
6351                 if type2.is_numeric or type2.is_string:
6352                     if operand2.check_for_coercion_error(type1):
6353                         new_common_type = error_type
6354                     else:
6355                         new_common_type = py_object_type
6356                 elif type1.is_numeric or type1.is_string:
6357                     if operand1.check_for_coercion_error(type2):
6358                         new_common_type = error_type
6359                     else:
6360                         new_common_type = py_object_type
6361                 elif py_object_type.assignable_from(type1) and py_object_type.assignable_from(type2):
6362                     new_common_type = py_object_type
6363                 else:
6364                     # one Python type and one non-Python type, not assignable
6365                     self.invalid_types_error(operand1, op, operand2)
6366                     new_common_type = error_type
6367             elif type1.assignable_from(type2):
6368                 new_common_type = type1
6369             elif type2.assignable_from(type1):
6370                 new_common_type = type2
6371             else:
6372                 # C types that we couldn't handle up to here are an error
6373                 self.invalid_types_error(operand1, op, operand2)
6374                 new_common_type = error_type
6375
6376         if new_common_type.is_string and (isinstance(operand1, BytesNode) or
6377                                           isinstance(operand2, BytesNode)):
6378             # special case when comparing char* to bytes literal: must
6379             # compare string values!
6380             new_common_type = bytes_type
6381
6382         # recursively merge types
6383         if common_type is None or new_common_type.is_error:
6384             common_type = new_common_type
6385         else:
6386             # we could do a lot better by splitting the comparison
6387             # into a non-Python part and a Python part, but this is
6388             # safer for now
6389             common_type = PyrexTypes.spanning_type(common_type, new_common_type)
6390
6391         if self.cascade:
6392             common_type = self.cascade.find_common_type(env, self.operator, operand2, common_type)
6393
6394         return common_type
6395
6396     def invalid_types_error(self, operand1, op, operand2):
6397         error(self.pos, "Invalid types for '%s' (%s, %s)" %
6398               (op, operand1.type, operand2.type))
6399
6400     def is_python_comparison(self):
6401         return (not self.is_ptr_contains()
6402             and not self.is_c_string_contains()
6403             and (self.has_python_operands()
6404                  or (self.cascade and self.cascade.is_python_comparison())
6405                  or self.operator in ('in', 'not_in')))
6406
6407     def coerce_operands_to(self, dst_type, env):
6408         operand2 = self.operand2
6409         if operand2.type != dst_type:
6410             self.operand2 = operand2.coerce_to(dst_type, env)
6411         if self.cascade:
6412             self.cascade.coerce_operands_to(dst_type, env)
6413
6414     def is_python_result(self):
6415         return ((self.has_python_operands() and
6416                  self.special_bool_cmp_function is None and
6417                  self.operator not in ('is', 'is_not', 'in', 'not_in') and
6418                  not self.is_c_string_contains() and
6419                  not self.is_ptr_contains())
6420             or (self.cascade and self.cascade.is_python_result()))
6421
6422     def is_c_string_contains(self):
6423         return self.operator in ('in', 'not_in') and \
6424                ((self.operand1.type.is_int
6425                  and (self.operand2.type.is_string or self.operand2.type is bytes_type)) or
6426                 (self.operand1.type is PyrexTypes.c_py_unicode_type
6427                  and self.operand2.type is unicode_type))
6428
6429     def is_ptr_contains(self):
6430         if self.operator in ('in', 'not_in'):
6431             container_type = self.operand2.type
6432             return (container_type.is_ptr or container_type.is_array) \
6433                 and not container_type.is_string
6434
6435     def find_special_bool_compare_function(self, env):
6436         if self.operator in ('==', '!='):
6437             type1, type2 = self.operand1.type, self.operand2.type
6438             if type1.is_pyobject and type2.is_pyobject:
6439                 if type1 is Builtin.unicode_type or type2 is Builtin.unicode_type:
6440                     env.use_utility_code(pyunicode_equals_utility_code)
6441                     self.special_bool_cmp_function = "__Pyx_PyUnicode_Equals"
6442                     return True
6443         return False
6444
6445     def generate_operation_code(self, code, result_code,
6446             operand1, op , operand2):
6447         if self.type.is_pyobject:
6448             coerce_result = "__Pyx_PyBool_FromLong"
6449         else:
6450             coerce_result = ""
6451         if 'not' in op:
6452             negation = "!"
6453         else:
6454             negation = ""
6455         if self.special_bool_cmp_function:
6456             if operand1.type.is_pyobject:
6457                 result1 = operand1.py_result()
6458             else:
6459                 result1 = operand1.result()
6460             if operand2.type.is_pyobject:
6461                 result2 = operand2.py_result()
6462             else:
6463                 result2 = operand2.result()
6464             code.putln("%s = %s(%s, %s, %s); %s" % (
6465                 result_code,
6466                 self.special_bool_cmp_function,
6467                 result1,
6468                 result2,
6469                 richcmp_constants[op],
6470                 code.error_goto_if_neg(result_code, self.pos)))
6471         elif op == 'in' or op == 'not_in':
6472             code.globalstate.use_utility_code(contains_utility_code)
6473             if self.type.is_pyobject:
6474                 coerce_result = "__Pyx_PyBoolOrNull_FromLong"
6475             if op == 'not_in':
6476                 negation = "__Pyx_NegateNonNeg"
6477             if operand2.type is dict_type:
6478                 method = "PyDict_Contains"
6479             else:
6480                 method = "PySequence_Contains"
6481             if self.type.is_pyobject:
6482                 error_clause = code.error_goto_if_null
6483                 got_ref = "__Pyx_XGOTREF(%s); " % result_code
6484             else:
6485                 error_clause = code.error_goto_if_neg
6486                 got_ref = ""
6487             code.putln(
6488                 "%s = %s(%s(%s(%s, %s))); %s%s" % (
6489                     result_code,
6490                     coerce_result,
6491                     negation,
6492                     method,
6493                     operand2.py_result(),
6494                     operand1.py_result(),
6495                     got_ref,
6496                     error_clause(result_code, self.pos)))
6497         elif (operand1.type.is_pyobject
6498             and op not in ('is', 'is_not')):
6499                 code.putln("%s = PyObject_RichCompare(%s, %s, %s); %s" % (
6500                         result_code,
6501                         operand1.py_result(),
6502                         operand2.py_result(),
6503                         richcmp_constants[op],
6504                         code.error_goto_if_null(result_code, self.pos)))
6505                 code.put_gotref(result_code)
6506         elif operand1.type.is_complex:
6507             if op == "!=":
6508                 negation = "!"
6509             else:
6510                 negation = ""
6511             code.putln("%s = %s(%s%s(%s, %s));" % (
6512                 result_code,
6513                 coerce_result,
6514                 negation,
6515                 operand1.type.unary_op('eq'),
6516                 operand1.result(),
6517                 operand2.result()))
6518         else:
6519             type1 = operand1.type
6520             type2 = operand2.type
6521             if (type1.is_extension_type or type2.is_extension_type) \
6522                     and not type1.same_as(type2):
6523                 common_type = py_object_type
6524             elif type1.is_numeric:
6525                 common_type = PyrexTypes.widest_numeric_type(type1, type2)
6526             else:
6527                 common_type = type1
6528             code1 = operand1.result_as(common_type)
6529             code2 = operand2.result_as(common_type)
6530             code.putln("%s = %s(%s %s %s);" % (
6531                 result_code,
6532                 coerce_result,
6533                 code1,
6534                 self.c_operator(op),
6535                 code2))
6536
6537     def c_operator(self, op):
6538         if op == 'is':
6539             return "=="
6540         elif op == 'is_not':
6541             return "!="
6542         else:
6543             return op
6544
6545 contains_utility_code = UtilityCode(
6546 proto="""
6547 static CYTHON_INLINE long __Pyx_NegateNonNeg(long b) { return unlikely(b < 0) ? b : !b; }
6548 static CYTHON_INLINE PyObject* __Pyx_PyBoolOrNull_FromLong(long b) {
6549     return unlikely(b < 0) ? NULL : __Pyx_PyBool_FromLong(b);
6550 }
6551 """)
6552
6553 char_in_bytes_utility_code = UtilityCode(
6554 proto="""
6555 static CYTHON_INLINE int __Pyx_BytesContains(PyObject* bytes, char character); /*proto*/
6556 """,
6557 impl="""
6558 static CYTHON_INLINE int __Pyx_BytesContains(PyObject* bytes, char character) {
6559     const Py_ssize_t length = PyBytes_GET_SIZE(bytes);
6560     char* char_start = PyBytes_AS_STRING(bytes);
6561     char* pos;
6562     for (pos=char_start; pos < char_start+length; pos++) {
6563         if (character == pos[0]) return 1;
6564     }
6565     return 0;
6566 }
6567 """)
6568
6569 pyunicode_in_unicode_utility_code = UtilityCode(
6570 proto="""
6571 static CYTHON_INLINE int __Pyx_UnicodeContains(PyObject* unicode, Py_UNICODE character); /*proto*/
6572 """,
6573 impl="""
6574 static CYTHON_INLINE int __Pyx_UnicodeContains(PyObject* unicode, Py_UNICODE character) {
6575     const Py_ssize_t length = PyUnicode_GET_SIZE(unicode);
6576     Py_UNICODE* char_start = PyUnicode_AS_UNICODE(unicode);
6577     Py_UNICODE* pos;
6578     for (pos=char_start; pos < char_start+length; pos++) {
6579         if (character == pos[0]) return 1;
6580     }
6581     return 0;
6582 }
6583 """)
6584
6585 pyunicode_equals_utility_code = UtilityCode(
6586 proto="""
6587 static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/
6588 """,
6589 impl="""
6590 static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
6591     if (s1 == s2) {   /* as done by PyObject_RichCompareBool(); also catches the (interned) empty string */
6592         return (equals == Py_EQ);
6593     } else if (PyUnicode_CheckExact(s1) & PyUnicode_CheckExact(s2)) {
6594         if (PyUnicode_GET_SIZE(s1) != PyUnicode_GET_SIZE(s2)) {
6595             return (equals == Py_NE);
6596         } else if (PyUnicode_GET_SIZE(s1) == 1) {
6597             if (equals == Py_EQ)
6598                 return (PyUnicode_AS_UNICODE(s1)[0] == PyUnicode_AS_UNICODE(s2)[0]);
6599             else
6600                 return (PyUnicode_AS_UNICODE(s1)[0] != PyUnicode_AS_UNICODE(s2)[0]);
6601         } else {
6602             int result = PyUnicode_Compare(s1, s2);
6603             if ((result == -1) && unlikely(PyErr_Occurred()))
6604                 return -1;
6605             return (equals == Py_EQ) ? (result == 0) : (result != 0);
6606         }
6607     } else if ((s1 == Py_None) & (s2 == Py_None)) {
6608         return (equals == Py_EQ);
6609     } else if ((s1 == Py_None) & PyUnicode_CheckExact(s2)) {
6610         return (equals == Py_NE);
6611     } else if ((s2 == Py_None) & PyUnicode_CheckExact(s1)) {
6612         return (equals == Py_NE);
6613     } else {
6614         int result;
6615         PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
6616         if (!py_result)
6617             return -1;
6618         result = __Pyx_PyObject_IsTrue(py_result);
6619         Py_DECREF(py_result);
6620         return result;
6621     }
6622 }
6623 """)
6624
6625
6626 class PrimaryCmpNode(ExprNode, CmpNode):
6627     #  Non-cascaded comparison or first comparison of
6628     #  a cascaded sequence.
6629     #
6630     #  operator      string
6631     #  operand1      ExprNode
6632     #  operand2      ExprNode
6633     #  cascade       CascadedCmpNode
6634
6635     #  We don't use the subexprs mechanism, because
6636     #  things here are too complicated for it to handle.
6637     #  Instead, we override all the framework methods
6638     #  which use it.
6639
6640     child_attrs = ['operand1', 'operand2', 'cascade']
6641
6642     cascade = None
6643
6644     def infer_type(self, env):
6645         # TODO: Actually implement this (after merging with -unstable).
6646         return py_object_type
6647
6648     def type_dependencies(self, env):
6649         return ()
6650
6651     def calculate_constant_result(self):
6652         self.calculate_cascaded_constant_result(self.operand1.constant_result)
6653
6654     def compile_time_value(self, denv):
6655         operand1 = self.operand1.compile_time_value(denv)
6656         return self.cascaded_compile_time_value(operand1, denv)
6657
6658     def analyse_types(self, env):
6659         self.operand1.analyse_types(env)
6660         self.operand2.analyse_types(env)
6661         if self.is_cpp_comparison():
6662             self.analyse_cpp_comparison(env)
6663             if self.cascade:
6664                 error(self.pos, "Cascading comparison not yet supported for cpp types.")
6665             return
6666         if self.cascade:
6667             self.cascade.analyse_types(env)
6668
6669         if self.operator in ('in', 'not_in'):
6670             if self.is_c_string_contains():
6671                 self.is_pycmp = False
6672                 common_type = None
6673                 if self.cascade:
6674                     error(self.pos, "Cascading comparison not yet supported for 'int_val in string'.")
6675                     return
6676                 if self.operand2.type is unicode_type:
6677                     env.use_utility_code(pyunicode_in_unicode_utility_code)
6678                 else:
6679                     if self.operand1.type is PyrexTypes.c_uchar_type:
6680                         self.operand1 = self.operand1.coerce_to(PyrexTypes.c_char_type, env)
6681                     if self.operand2.type is not bytes_type:
6682                         self.operand2 = self.operand2.coerce_to(bytes_type, env)
6683                     env.use_utility_code(char_in_bytes_utility_code)
6684                 self.operand2 = self.operand2.as_none_safe_node(
6685                     "argument of type 'NoneType' is not iterable")
6686             elif self.is_ptr_contains():
6687                 if self.cascade:
6688                     error(self.pos, "Cascading comparison not yet supported for 'val in sliced pointer'.")
6689                 self.type = PyrexTypes.c_bint_type
6690                 # Will be transformed by IterationTransform
6691                 return
6692             else:
6693                 if self.operand2.type is dict_type:
6694                     self.operand2 = self.operand2.as_none_safe_node("'NoneType' object is not iterable")
6695                 common_type = py_object_type
6696                 self.is_pycmp = True
6697         elif self.find_special_bool_compare_function(env):
6698             common_type = None # if coercion needed, the method call above has already done it
6699             self.is_pycmp = False # result is bint
6700             self.is_temp = True # must check for error return
6701         else:
6702             common_type = self.find_common_type(env, self.operator, self.operand1)
6703             self.is_pycmp = common_type.is_pyobject
6704
6705         if common_type is not None and not common_type.is_error:
6706             if self.operand1.type != common_type:
6707                 self.operand1 = self.operand1.coerce_to(common_type, env)
6708             self.coerce_operands_to(common_type, env)
6709
6710         if self.cascade:
6711             self.operand2 = self.operand2.coerce_to_simple(env)
6712             self.cascade.coerce_cascaded_operands_to_temp(env)
6713         if self.is_python_result():
6714             self.type = PyrexTypes.py_object_type
6715         else:
6716             self.type = PyrexTypes.c_bint_type
6717         cdr = self.cascade
6718         while cdr:
6719             cdr.type = self.type
6720             cdr = cdr.cascade
6721         if self.is_pycmp or self.cascade:
6722             self.is_temp = 1
6723
6724     def analyse_cpp_comparison(self, env):
6725         type1 = self.operand1.type
6726         type2 = self.operand2.type
6727         entry = env.lookup_operator(self.operator, [self.operand1, self.operand2])
6728         if entry is None:
6729             error(self.pos, "Invalid types for '%s' (%s, %s)" %
6730                 (self.operator, type1, type2))
6731             self.type = PyrexTypes.error_type
6732             self.result_code = "<error>"
6733             return
6734         func_type = entry.type
6735         if func_type.is_ptr:
6736             func_type = func_type.base_type
6737         if len(func_type.args) == 1:
6738             self.operand2 = self.operand2.coerce_to(func_type.args[0].type, env)
6739         else:
6740             self.operand1 = self.operand1.coerce_to(func_type.args[0].type, env)
6741             self.operand2 = self.operand2.coerce_to(func_type.args[1].type, env)
6742         self.type = func_type.return_type
6743
6744     def has_python_operands(self):
6745         return (self.operand1.type.is_pyobject
6746             or self.operand2.type.is_pyobject)
6747
6748     def check_const(self):
6749         if self.cascade:
6750             self.not_const()
6751             return False
6752         else:
6753             return self.operand1.check_const() and self.operand2.check_const()
6754
6755     def calculate_result_code(self):
6756         if self.operand1.type.is_complex:
6757             if self.operator == "!=":
6758                 negation = "!"
6759             else:
6760                 negation = ""
6761             return "(%s%s(%s, %s))" % (
6762                 negation,
6763                 self.operand1.type.binary_op('=='),
6764                 self.operand1.result(),
6765                 self.operand2.result())
6766         elif self.is_c_string_contains():
6767             if self.operand2.type is bytes_type:
6768                 method = "__Pyx_BytesContains"
6769             else:
6770                 method = "__Pyx_UnicodeContains"
6771             if self.operator == "not_in":
6772                 negation = "!"
6773             else:
6774                 negation = ""
6775             return "(%s%s(%s, %s))" % (
6776                 negation,
6777                 method,
6778                 self.operand2.result(),
6779                 self.operand1.result())
6780         else:
6781             return "(%s %s %s)" % (
6782                 self.operand1.result(),
6783                 self.c_operator(self.operator),
6784                 self.operand2.result())
6785
6786     def generate_evaluation_code(self, code):
6787         self.operand1.generate_evaluation_code(code)
6788         self.operand2.generate_evaluation_code(code)
6789         if self.is_temp:
6790             self.allocate_temp_result(code)
6791             self.generate_operation_code(code, self.result(),
6792                 self.operand1, self.operator, self.operand2)
6793             if self.cascade:
6794                 self.cascade.generate_evaluation_code(code,
6795                     self.result(), self.operand2)
6796             self.operand1.generate_disposal_code(code)
6797             self.operand1.free_temps(code)
6798             self.operand2.generate_disposal_code(code)
6799             self.operand2.free_temps(code)
6800
6801     def generate_subexpr_disposal_code(self, code):
6802         #  If this is called, it is a non-cascaded cmp,
6803         #  so only need to dispose of the two main operands.
6804         self.operand1.generate_disposal_code(code)
6805         self.operand2.generate_disposal_code(code)
6806
6807     def free_subexpr_temps(self, code):
6808         #  If this is called, it is a non-cascaded cmp,
6809         #  so only need to dispose of the two main operands.
6810         self.operand1.free_temps(code)
6811         self.operand2.free_temps(code)
6812
6813     def annotate(self, code):
6814         self.operand1.annotate(code)
6815         self.operand2.annotate(code)
6816         if self.cascade:
6817             self.cascade.annotate(code)
6818
6819
6820 class CascadedCmpNode(Node, CmpNode):
6821     #  A CascadedCmpNode is not a complete expression node. It
6822     #  hangs off the side of another comparison node, shares
6823     #  its left operand with that node, and shares its result
6824     #  with the PrimaryCmpNode at the head of the chain.
6825     #
6826     #  operator      string
6827     #  operand2      ExprNode
6828     #  cascade       CascadedCmpNode
6829
6830     child_attrs = ['operand2', 'cascade']
6831
6832     cascade = None
6833     constant_result = constant_value_not_set # FIXME: where to calculate this?
6834
6835     def infer_type(self, env):
6836         # TODO: Actually implement this (after merging with -unstable).
6837         return py_object_type
6838
6839     def type_dependencies(self, env):
6840         return ()
6841
6842     def has_constant_result(self):
6843         return self.constant_result is not constant_value_not_set and \
6844                self.constant_result is not not_a_constant
6845
6846     def analyse_types(self, env):
6847         self.operand2.analyse_types(env)
6848         if self.cascade:
6849             self.cascade.analyse_types(env)
6850
6851     def has_python_operands(self):
6852         return self.operand2.type.is_pyobject
6853
6854     def coerce_operands_to_pyobjects(self, env):
6855         self.operand2 = self.operand2.coerce_to_pyobject(env)
6856         if self.operand2.type is dict_type and self.operator in ('in', 'not_in'):
6857             self.operand2 = self.operand2.as_none_safe_node("'NoneType' object is not iterable")
6858         if self.cascade:
6859             self.cascade.coerce_operands_to_pyobjects(env)
6860
6861     def coerce_cascaded_operands_to_temp(self, env):
6862         if self.cascade:
6863             #self.operand2 = self.operand2.coerce_to_temp(env) #CTT
6864             self.operand2 = self.operand2.coerce_to_simple(env)
6865             self.cascade.coerce_cascaded_operands_to_temp(env)
6866
6867     def generate_evaluation_code(self, code, result, operand1):
6868         if self.type.is_pyobject:
6869             code.putln("if (__Pyx_PyObject_IsTrue(%s)) {" % result)
6870             code.put_decref(result, self.type)
6871         else:
6872             code.putln("if (%s) {" % result)
6873         self.operand2.generate_evaluation_code(code)
6874         self.generate_operation_code(code, result,
6875             operand1, self.operator, self.operand2)
6876         if self.cascade:
6877             self.cascade.generate_evaluation_code(
6878                 code, result, self.operand2)
6879         # Cascaded cmp result is always temp
6880         self.operand2.generate_disposal_code(code)
6881         self.operand2.free_temps(code)
6882         code.putln("}")
6883
6884     def annotate(self, code):
6885         self.operand2.annotate(code)
6886         if self.cascade:
6887             self.cascade.annotate(code)
6888
6889
6890 binop_node_classes = {
6891     "or":       BoolBinopNode,
6892     "and":      BoolBinopNode,
6893     "|":        IntBinopNode,
6894     "^":        IntBinopNode,
6895     "&":        IntBinopNode,
6896     "<<":       IntBinopNode,
6897     ">>":       IntBinopNode,
6898     "+":        AddNode,
6899     "-":        SubNode,
6900     "*":        MulNode,
6901     "/":        DivNode,
6902     "//":       DivNode,
6903     "%":        ModNode,
6904     "**":       PowNode
6905 }
6906
6907 def binop_node(pos, operator, operand1, operand2, inplace=False):
6908     # Construct binop node of appropriate class for
6909     # given operator.
6910     return binop_node_classes[operator](pos,
6911         operator = operator,
6912         operand1 = operand1,
6913         operand2 = operand2,
6914         inplace = inplace)
6915
6916 #-------------------------------------------------------------------
6917 #
6918 #  Coercion nodes
6919 #
6920 #  Coercion nodes are special in that they are created during
6921 #  the analyse_types phase of parse tree processing.
6922 #  Their __init__ methods consequently incorporate some aspects
6923 #  of that phase.
6924 #
6925 #-------------------------------------------------------------------
6926
6927 class CoercionNode(ExprNode):
6928     #  Abstract base class for coercion nodes.
6929     #
6930     #  arg       ExprNode       node being coerced
6931
6932     subexprs = ['arg']
6933     constant_result = not_a_constant
6934
6935     def __init__(self, arg):
6936         self.pos = arg.pos
6937         self.arg = arg
6938         if debug_coercion:
6939             print("%s Coercing %s" % (self, self.arg))
6940
6941     def calculate_constant_result(self):
6942         # constant folding can break type coercion, so this is disabled
6943         pass
6944
6945     def annotate(self, code):
6946         self.arg.annotate(code)
6947         if self.arg.type != self.type:
6948             file, line, col = self.pos
6949             code.annotate((file, line, col-1), AnnotationItem(style='coerce', tag='coerce', text='[%s] to [%s]' % (self.arg.type, self.type)))
6950
6951
6952 class CastNode(CoercionNode):
6953     #  Wrap a node in a C type cast.
6954
6955     def __init__(self, arg, new_type):
6956         CoercionNode.__init__(self, arg)
6957         self.type = new_type
6958
6959     def may_be_none(self):
6960         return self.arg.may_be_none()
6961
6962     def calculate_result_code(self):
6963         return self.arg.result_as(self.type)
6964
6965     def generate_result_code(self, code):
6966         self.arg.generate_result_code(code)
6967
6968
6969 class PyTypeTestNode(CoercionNode):
6970     #  This node is used to check that a generic Python
6971     #  object is an instance of a particular extension type.
6972     #  This node borrows the result of its argument node.
6973
6974     def __init__(self, arg, dst_type, env, notnone=False):
6975         #  The arg is know to be a Python object, and
6976         #  the dst_type is known to be an extension type.
6977         assert dst_type.is_extension_type or dst_type.is_builtin_type, "PyTypeTest on non extension type"
6978         CoercionNode.__init__(self, arg)
6979         self.type = dst_type
6980         self.result_ctype = arg.ctype()
6981         self.notnone = notnone
6982
6983     nogil_check = Node.gil_error
6984     gil_message = "Python type test"
6985
6986     def analyse_types(self, env):
6987         pass
6988
6989     def may_be_none(self):
6990         if self.notnone:
6991             return False
6992         return self.arg.may_be_none()
6993
6994     def result_in_temp(self):
6995         return self.arg.result_in_temp()
6996
6997     def is_ephemeral(self):
6998         return self.arg.is_ephemeral()
6999
7000     def calculate_constant_result(self):
7001         # FIXME
7002         pass
7003
7004     def calculate_result_code(self):
7005         return self.arg.result()
7006
7007     def generate_result_code(self, code):
7008         if self.type.typeobj_is_available():
7009             if not self.type.is_builtin_type:
7010                 code.globalstate.use_utility_code(type_test_utility_code)
7011             code.putln(
7012                 "if (!(%s)) %s" % (
7013                     self.type.type_test_code(self.arg.py_result(), self.notnone),
7014                     code.error_goto(self.pos)))
7015         else:
7016             error(self.pos, "Cannot test type of extern C class "
7017                 "without type object name specification")
7018
7019     def generate_post_assignment_code(self, code):
7020         self.arg.generate_post_assignment_code(code)
7021
7022     def free_temps(self, code):
7023         self.arg.free_temps(code)
7024
7025
7026 class NoneCheckNode(CoercionNode):
7027     # This node is used to check that a Python object is not None and
7028     # raises an appropriate exception (as specified by the creating
7029     # transform).
7030
7031     def __init__(self, arg, exception_type_cname, exception_message):
7032         CoercionNode.__init__(self, arg)
7033         self.type = arg.type
7034         self.result_ctype = arg.ctype()
7035         self.exception_type_cname = exception_type_cname
7036         self.exception_message = exception_message
7037
7038     def analyse_types(self, env):
7039         pass
7040
7041     def may_be_none(self):
7042         return False
7043
7044     def result_in_temp(self):
7045         return self.arg.result_in_temp()
7046
7047     def calculate_result_code(self):
7048         return self.arg.result()
7049
7050     def generate_result_code(self, code):
7051         code.putln(
7052             "if (unlikely(%s == Py_None)) {" % self.arg.result())
7053         code.putln('PyErr_SetString(%s, "%s"); %s ' % (
7054             self.exception_type_cname,
7055             StringEncoding.escape_byte_string(
7056                 self.exception_message.encode('UTF-8')),
7057             code.error_goto(self.pos)))
7058         code.putln("}")
7059
7060     def generate_post_assignment_code(self, code):
7061         self.arg.generate_post_assignment_code(code)
7062
7063     def free_temps(self, code):
7064         self.arg.free_temps(code)
7065
7066
7067 class CoerceToPyTypeNode(CoercionNode):
7068     #  This node is used to convert a C data type
7069     #  to a Python object.
7070
7071     type = py_object_type
7072     is_temp = 1
7073
7074     def __init__(self, arg, env, type=py_object_type):
7075         CoercionNode.__init__(self, arg)
7076         if not arg.type.create_to_py_utility_code(env):
7077             error(arg.pos,
7078                   "Cannot convert '%s' to Python object" % arg.type)
7079         if type is py_object_type:
7080             # be specific about some known types
7081             if arg.type.is_string:
7082                 self.type = bytes_type
7083             elif arg.type is PyrexTypes.c_py_unicode_type:
7084                 self.type = unicode_type
7085             elif arg.type.is_complex:
7086                 self.type = Builtin.complex_type
7087         else:
7088             # FIXME: check that the target type and the resulting type are compatible
7089             pass
7090
7091     gil_message = "Converting to Python object"
7092
7093     def may_be_none(self):
7094         # FIXME: is this always safe?
7095         return False
7096
7097     def coerce_to_boolean(self, env):
7098         arg_type = self.arg.type
7099         if (arg_type == PyrexTypes.c_bint_type or
7100             (arg_type.is_pyobject and arg_type.name == 'bool')):
7101             return self.arg.coerce_to_temp(env)
7102         else:
7103             return CoerceToBooleanNode(self, env)
7104
7105     def coerce_to_integer(self, env):
7106         # If not already some C integer type, coerce to longint.
7107         if self.arg.type.is_int:
7108             return self.arg
7109         else:
7110             return self.arg.coerce_to(PyrexTypes.c_long_type, env)
7111
7112     def analyse_types(self, env):
7113         # The arg is always already analysed
7114         pass
7115
7116     def generate_result_code(self, code):
7117         function = self.arg.type.to_py_function
7118         code.putln('%s = %s(%s); %s' % (
7119             self.result(),
7120             function,
7121             self.arg.result(),
7122             code.error_goto_if_null(self.result(), self.pos)))
7123         code.put_gotref(self.py_result())
7124
7125
7126 class CoerceIntToBytesNode(CoerceToPyTypeNode):
7127     #  This node is used to convert a C int type to a Python bytes
7128     #  object.
7129
7130     is_temp = 1
7131
7132     def __init__(self, arg, env):
7133         arg = arg.coerce_to_simple(env)
7134         CoercionNode.__init__(self, arg)
7135         self.type = Builtin.bytes_type
7136
7137     def generate_result_code(self, code):
7138         arg = self.arg
7139         arg_result = arg.result()
7140         if arg.type not in (PyrexTypes.c_char_type,
7141                             PyrexTypes.c_uchar_type,
7142                             PyrexTypes.c_schar_type):
7143             if arg.type.signed:
7144                 code.putln("if ((%s < 0) || (%s > 255)) {" % (
7145                     arg_result, arg_result))
7146             else:
7147                 code.putln("if (%s > 255) {" % arg_result)
7148             code.putln('PyErr_Format(PyExc_OverflowError, '
7149                        '"value too large to pack into a byte"); %s' % (
7150                            code.error_goto(self.pos)))
7151             code.putln('}')
7152         temp = None
7153         if arg.type is not PyrexTypes.c_char_type:
7154             temp = code.funcstate.allocate_temp(PyrexTypes.c_char_type, manage_ref=False)
7155             code.putln("%s = (char)%s;" % (temp, arg_result))
7156             arg_result = temp
7157         code.putln('%s = PyBytes_FromStringAndSize(&%s, 1); %s' % (
7158             self.result(),
7159             arg_result,
7160             code.error_goto_if_null(self.result(), self.pos)))
7161         if temp is not None:
7162             code.funcstate.release_temp(temp)
7163         code.put_gotref(self.py_result())
7164
7165
7166 class CoerceFromPyTypeNode(CoercionNode):
7167     #  This node is used to convert a Python object
7168     #  to a C data type.
7169
7170     def __init__(self, result_type, arg, env):
7171         CoercionNode.__init__(self, arg)
7172         self.type = result_type
7173         self.is_temp = 1
7174         if not result_type.create_from_py_utility_code(env):
7175             error(arg.pos,
7176                   "Cannot convert Python object to '%s'" % result_type)
7177         if self.type.is_string and self.arg.is_ephemeral():
7178             error(arg.pos,
7179                   "Obtaining char * from temporary Python value")
7180
7181     def analyse_types(self, env):
7182         # The arg is always already analysed
7183         pass
7184
7185     def generate_result_code(self, code):
7186         function = self.type.from_py_function
7187         operand = self.arg.py_result()
7188         rhs = "%s(%s)" % (function, operand)
7189         if self.type.is_enum:
7190             rhs = typecast(self.type, c_long_type, rhs)
7191         code.putln('%s = %s; %s' % (
7192             self.result(),
7193             rhs,
7194             code.error_goto_if(self.type.error_condition(self.result()), self.pos)))
7195         if self.type.is_pyobject:
7196             code.put_gotref(self.py_result())
7197
7198
7199 class CoerceToBooleanNode(CoercionNode):
7200     #  This node is used when a result needs to be used
7201     #  in a boolean context.
7202
7203     type = PyrexTypes.c_bint_type
7204
7205     _special_builtins = {
7206         Builtin.list_type    : 'PyList_GET_SIZE',
7207         Builtin.tuple_type   : 'PyTuple_GET_SIZE',
7208         Builtin.bytes_type   : 'PyBytes_GET_SIZE',
7209         Builtin.unicode_type : 'PyUnicode_GET_SIZE',
7210         }
7211
7212     def __init__(self, arg, env):
7213         CoercionNode.__init__(self, arg)
7214         if arg.type.is_pyobject:
7215             self.is_temp = 1
7216
7217     def nogil_check(self, env):
7218         if self.arg.type.is_pyobject and self._special_builtins.get(self.arg.type) is None:
7219             self.gil_error()
7220
7221     gil_message = "Truth-testing Python object"
7222
7223     def check_const(self):
7224         if self.is_temp:
7225             self.not_const()
7226             return False
7227         return self.arg.check_const()
7228
7229     def calculate_result_code(self):
7230         return "(%s != 0)" % self.arg.result()
7231
7232     def generate_result_code(self, code):
7233         if not self.is_temp:
7234             return
7235         test_func = self._special_builtins.get(self.arg.type)
7236         if test_func is not None:
7237             code.putln("%s = (%s != Py_None) && (%s(%s) != 0);" % (
7238                        self.result(),
7239                        self.arg.py_result(),
7240                        test_func,
7241                        self.arg.py_result()))
7242         else:
7243             code.putln(
7244                 "%s = __Pyx_PyObject_IsTrue(%s); %s" % (
7245                     self.result(),
7246                     self.arg.py_result(),
7247                     code.error_goto_if_neg(self.result(), self.pos)))
7248
7249 class CoerceToComplexNode(CoercionNode):
7250
7251     def __init__(self, arg, dst_type, env):
7252         if arg.type.is_complex:
7253             arg = arg.coerce_to_simple(env)
7254         self.type = dst_type
7255         CoercionNode.__init__(self, arg)
7256         dst_type.create_declaration_utility_code(env)
7257
7258     def calculate_result_code(self):
7259         if self.arg.type.is_complex:
7260             real_part = "__Pyx_CREAL(%s)" % self.arg.result()
7261             imag_part = "__Pyx_CIMAG(%s)" % self.arg.result()
7262         else:
7263             real_part = self.arg.result()
7264             imag_part = "0"
7265         return "%s(%s, %s)" % (
7266                 self.type.from_parts,
7267                 real_part,
7268                 imag_part)
7269
7270     def generate_result_code(self, code):
7271         pass
7272
7273 class CoerceToTempNode(CoercionNode):
7274     #  This node is used to force the result of another node
7275     #  to be stored in a temporary. It is only used if the
7276     #  argument node's result is not already in a temporary.
7277
7278     def __init__(self, arg, env):
7279         CoercionNode.__init__(self, arg)
7280         self.type = self.arg.type
7281         self.constant_result = self.arg.constant_result
7282         self.is_temp = 1
7283         if self.type.is_pyobject:
7284             self.result_ctype = py_object_type
7285
7286     gil_message = "Creating temporary Python reference"
7287
7288     def analyse_types(self, env):
7289         # The arg is always already analysed
7290         pass
7291
7292     def coerce_to_boolean(self, env):
7293         self.arg = self.arg.coerce_to_boolean(env)
7294         if self.arg.is_simple():
7295             return self.arg
7296         self.type = self.arg.type
7297         self.result_ctype = self.type
7298         return self
7299
7300     def generate_result_code(self, code):
7301         #self.arg.generate_evaluation_code(code) # Already done
7302         # by generic generate_subexpr_evaluation_code!
7303         code.putln("%s = %s;" % (
7304             self.result(), self.arg.result_as(self.ctype())))
7305         if self.type.is_pyobject and self.use_managed_ref:
7306             code.put_incref(self.result(), self.ctype())
7307
7308
7309 class CloneNode(CoercionNode):
7310     #  This node is employed when the result of another node needs
7311     #  to be used multiple times. The argument node's result must
7312     #  be in a temporary. This node "borrows" the result from the
7313     #  argument node, and does not generate any evaluation or
7314     #  disposal code for it. The original owner of the argument
7315     #  node is responsible for doing those things.
7316
7317     subexprs = [] # Arg is not considered a subexpr
7318     nogil_check = None
7319
7320     def __init__(self, arg):
7321         CoercionNode.__init__(self, arg)
7322         if hasattr(arg, 'type'):
7323             self.type = arg.type
7324             self.result_ctype = arg.result_ctype
7325         if hasattr(arg, 'entry'):
7326             self.entry = arg.entry
7327
7328     def result(self):
7329         return self.arg.result()
7330
7331     def type_dependencies(self, env):
7332         return self.arg.type_dependencies(env)
7333
7334     def infer_type(self, env):
7335         return self.arg.infer_type(env)
7336
7337     def analyse_types(self, env):
7338         self.type = self.arg.type
7339         self.result_ctype = self.arg.result_ctype
7340         self.is_temp = 1
7341         if hasattr(self.arg, 'entry'):
7342             self.entry = self.arg.entry
7343
7344     def generate_evaluation_code(self, code):
7345         pass
7346
7347     def generate_result_code(self, code):
7348         pass
7349
7350     def generate_disposal_code(self, code):
7351         pass
7352
7353     def free_temps(self, code):
7354         pass
7355
7356
7357 class ModuleRefNode(ExprNode):
7358     # Simple returns the module object
7359
7360     type = py_object_type
7361     is_temp = False
7362     subexprs = []
7363
7364     def analyse_types(self, env):
7365         pass
7366
7367     def may_be_none(self):
7368         return False
7369
7370     def calculate_result_code(self):
7371         return Naming.module_cname
7372
7373     def generate_result_code(self, code):
7374         pass
7375
7376 class DocstringRefNode(ExprNode):
7377     # Extracts the docstring of the body element
7378
7379     subexprs = ['body']
7380     type = py_object_type
7381     is_temp = True
7382
7383     def __init__(self, pos, body):
7384         ExprNode.__init__(self, pos)
7385         assert body.type.is_pyobject
7386         self.body = body
7387
7388     def analyse_types(self, env):
7389         pass
7390
7391     def generate_result_code(self, code):
7392         code.putln('%s = __Pyx_GetAttrString(%s, "__doc__"); %s' % (
7393             self.result(), self.body.result(),
7394             code.error_goto_if_null(self.result(), self.pos)))
7395         code.put_gotref(self.result())
7396
7397
7398
7399 #------------------------------------------------------------------------------------
7400 #
7401 #  Runtime support code
7402 #
7403 #------------------------------------------------------------------------------------
7404
7405 get_name_interned_utility_code = UtilityCode(
7406 proto = """
7407 static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
7408 """,
7409 impl = """
7410 static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
7411     PyObject *result;
7412     result = PyObject_GetAttr(dict, name);
7413     if (!result)
7414         PyErr_SetObject(PyExc_NameError, name);
7415     return result;
7416 }
7417 """)
7418
7419 #------------------------------------------------------------------------------------
7420
7421 import_utility_code = UtilityCode(
7422 proto = """
7423 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/
7424 """,
7425 impl = """
7426 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) {
7427     PyObject *py_import = 0;
7428     PyObject *empty_list = 0;
7429     PyObject *module = 0;
7430     PyObject *global_dict = 0;
7431     PyObject *empty_dict = 0;
7432     PyObject *list;
7433     py_import = __Pyx_GetAttrString(%(BUILTINS)s, "__import__");
7434     if (!py_import)
7435         goto bad;
7436     if (from_list)
7437         list = from_list;
7438     else {
7439         empty_list = PyList_New(0);
7440         if (!empty_list)
7441             goto bad;
7442         list = empty_list;
7443     }
7444     global_dict = PyModule_GetDict(%(GLOBALS)s);
7445     if (!global_dict)
7446         goto bad;
7447     empty_dict = PyDict_New();
7448     if (!empty_dict)
7449         goto bad;
7450     module = PyObject_CallFunctionObjArgs(py_import,
7451         name, global_dict, empty_dict, list, NULL);
7452 bad:
7453     Py_XDECREF(empty_list);
7454     Py_XDECREF(py_import);
7455     Py_XDECREF(empty_dict);
7456     return module;
7457 }
7458 """ % {
7459     "BUILTINS": Naming.builtins_cname,
7460     "GLOBALS":  Naming.module_cname,
7461 })
7462
7463 #------------------------------------------------------------------------------------
7464
7465 get_exception_utility_code = UtilityCode(
7466 proto = """
7467 static PyObject *__Pyx_GetExcValue(void); /*proto*/
7468 """,
7469 impl = """
7470 static PyObject *__Pyx_GetExcValue(void) {
7471     PyObject *type = 0, *value = 0, *tb = 0;
7472     PyObject *tmp_type, *tmp_value, *tmp_tb;
7473     PyObject *result = 0;
7474     PyThreadState *tstate = PyThreadState_Get();
7475     PyErr_Fetch(&type, &value, &tb);
7476     PyErr_NormalizeException(&type, &value, &tb);
7477     if (PyErr_Occurred())
7478         goto bad;
7479     if (!value) {
7480         value = Py_None;
7481         Py_INCREF(value);
7482     }
7483     tmp_type = tstate->exc_type;
7484     tmp_value = tstate->exc_value;
7485     tmp_tb = tstate->exc_traceback;
7486     tstate->exc_type = type;
7487     tstate->exc_value = value;
7488     tstate->exc_traceback = tb;
7489     /* Make sure tstate is in a consistent state when we XDECREF
7490     these objects (XDECREF may run arbitrary code). */
7491     Py_XDECREF(tmp_type);
7492     Py_XDECREF(tmp_value);
7493     Py_XDECREF(tmp_tb);
7494     result = value;
7495     Py_XINCREF(result);
7496     type = 0;
7497     value = 0;
7498     tb = 0;
7499 bad:
7500     Py_XDECREF(type);
7501     Py_XDECREF(value);
7502     Py_XDECREF(tb);
7503     return result;
7504 }
7505 """)
7506
7507 #------------------------------------------------------------------------------------
7508
7509 type_test_utility_code = UtilityCode(
7510 proto = """
7511 static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
7512 """,
7513 impl = """
7514 static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
7515     if (unlikely(!type)) {
7516         PyErr_Format(PyExc_SystemError, "Missing type object");
7517         return 0;
7518     }
7519     if (likely(PyObject_TypeCheck(obj, type)))
7520         return 1;
7521     PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s",
7522                  Py_TYPE(obj)->tp_name, type->tp_name);
7523     return 0;
7524 }
7525 """)
7526
7527 #------------------------------------------------------------------------------------
7528
7529 find_py2_metaclass_utility_code = UtilityCode(
7530 proto = '''
7531 static PyObject *__Pyx_FindPy2Metaclass(PyObject *bases); /*proto*/
7532 ''',
7533 impl = '''
7534 static PyObject *__Pyx_FindPy2Metaclass(PyObject *bases) {
7535     PyObject *metaclass;
7536     /* Default metaclass */
7537 #if PY_MAJOR_VERSION < 3
7538     if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
7539         PyObject *base = PyTuple_GET_ITEM(bases, 0);
7540         metaclass = PyObject_GetAttrString(base, "__class__");
7541         if (!metaclass) {
7542             PyErr_Clear();
7543             metaclass = (PyObject*) Py_TYPE(base);
7544         }
7545     } else {
7546         metaclass = (PyObject *) &PyClass_Type;
7547     }
7548 #else
7549     if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
7550         PyObject *base = PyTuple_GET_ITEM(bases, 0);
7551         metaclass = (PyObject*) Py_TYPE(base);
7552     } else {
7553         metaclass = (PyObject *) &PyType_Type;
7554     }
7555 #endif
7556     Py_INCREF(metaclass);
7557     return metaclass;
7558 }
7559 ''')
7560
7561 create_class_utility_code = UtilityCode(
7562 proto = """
7563 static PyObject *__Pyx_CreateClass(PyObject *bases, PyObject *dict, PyObject *name,
7564                                    PyObject *modname); /*proto*/
7565 """,
7566 impl = """
7567 static PyObject *__Pyx_CreateClass(PyObject *bases, PyObject *dict, PyObject *name,
7568                                    PyObject *modname) {
7569     PyObject *result;
7570     PyObject *metaclass;
7571
7572     if (PyDict_SetItemString(dict, "__module__", modname) < 0)
7573         return NULL;
7574
7575     /* Python2 __metaclass__ */
7576     metaclass = PyDict_GetItemString(dict, "__metaclass__");
7577     if (metaclass) {
7578         Py_INCREF(metaclass);
7579     } else {
7580         metaclass = __Pyx_FindPy2Metaclass(bases);
7581     }
7582     result = PyObject_CallFunctionObjArgs(metaclass, name, bases, dict, NULL);
7583     Py_DECREF(metaclass);
7584     return result;
7585 }
7586 """,
7587 requires = [find_py2_metaclass_utility_code])
7588
7589 #------------------------------------------------------------------------------------
7590
7591 create_py3class_utility_code = UtilityCode(
7592 proto = """
7593 static PyObject *__Pyx_Py3MetaclassGet(PyObject *bases, PyObject *mkw); /*proto*/
7594 static PyObject *__Pyx_Py3MetaclassPrepare(PyObject *metaclass, PyObject *bases, PyObject *name, PyObject *mkw, PyObject *modname, PyObject *doc); /*proto*/
7595 static PyObject *__Pyx_Py3ClassCreate(PyObject *metaclass, PyObject *name, PyObject *bases, PyObject *dict, PyObject *mkw); /*proto*/
7596 """,
7597 impl = """
7598 PyObject *__Pyx_Py3MetaclassGet(PyObject *bases, PyObject *mkw) {
7599     PyObject *metaclass = PyDict_GetItemString(mkw, "metaclass");
7600     if (metaclass) {
7601         Py_INCREF(metaclass);
7602         if (PyDict_DelItemString(mkw, "metaclass") < 0) {
7603             Py_DECREF(metaclass);
7604             return NULL;
7605         }
7606         return metaclass;
7607     }
7608     return __Pyx_FindPy2Metaclass(bases);
7609 }
7610
7611 PyObject *__Pyx_Py3MetaclassPrepare(PyObject *metaclass, PyObject *bases, PyObject *name, PyObject *mkw,
7612                                     PyObject *modname, PyObject *doc) {
7613     PyObject *prep;
7614     PyObject *pargs;
7615     PyObject *ns;
7616     PyObject *str;
7617
7618     prep = PyObject_GetAttrString(metaclass, "__prepare__");
7619     if (!prep) {
7620         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
7621             return NULL;
7622         PyErr_Clear();
7623         return PyDict_New();
7624     }
7625     pargs = PyTuple_New(2);
7626     if (!pargs) {
7627         Py_DECREF(prep);
7628         return NULL;
7629     }
7630
7631     Py_INCREF(name);
7632     Py_INCREF(bases);
7633     PyTuple_SET_ITEM(pargs, 0, name);
7634     PyTuple_SET_ITEM(pargs, 1, bases);
7635
7636     ns = PyObject_Call(prep, pargs, mkw);
7637
7638     Py_DECREF(prep);
7639     Py_DECREF(pargs);
7640
7641     if (ns == NULL)
7642         return NULL;
7643
7644     /* Required here to emulate assignment order */
7645     /* XXX: use consts here */
7646     #if PY_MAJOR_VERSION >= 3
7647     str = PyUnicode_FromString("__module__");
7648     #else
7649     str = PyString_FromString("__module__");
7650     #endif
7651     if (!str) {
7652         Py_DECREF(ns);
7653         return NULL;
7654     }
7655
7656     if (PyObject_SetItem(ns, str, modname) < 0) {
7657         Py_DECREF(ns);
7658         Py_DECREF(str);
7659         return NULL;
7660     }
7661     Py_DECREF(str);
7662     if (doc) {
7663         #if PY_MAJOR_VERSION >= 3
7664         str = PyUnicode_FromString("__doc__");
7665         #else
7666         str = PyString_FromString("__doc__");
7667         #endif
7668         if (!str) {
7669             Py_DECREF(ns);
7670             return NULL;
7671         }
7672         if (PyObject_SetItem(ns, str, doc) < 0) {
7673             Py_DECREF(ns);
7674             Py_DECREF(str);
7675             return NULL;
7676         }
7677         Py_DECREF(str);
7678     }
7679     return ns;
7680 }
7681
7682 PyObject *__Pyx_Py3ClassCreate(PyObject *metaclass, PyObject *name, PyObject *bases, PyObject *dict, PyObject *mkw) {
7683     PyObject *result;
7684     PyObject *margs = PyTuple_New(3);
7685     if (!margs)
7686         return NULL;
7687     Py_INCREF(name);
7688     Py_INCREF(bases);
7689     Py_INCREF(dict);
7690     PyTuple_SET_ITEM(margs, 0, name);
7691     PyTuple_SET_ITEM(margs, 1, bases);
7692     PyTuple_SET_ITEM(margs, 2, dict);
7693     result = PyObject_Call(metaclass, margs, mkw);
7694     Py_DECREF(margs);
7695     return result;
7696 }
7697 """,
7698 requires = [find_py2_metaclass_utility_code])
7699
7700 #------------------------------------------------------------------------------------
7701
7702 cpp_exception_utility_code = UtilityCode(
7703 proto = """
7704 #ifndef __Pyx_CppExn2PyErr
7705 static void __Pyx_CppExn2PyErr() {
7706   try {
7707     if (PyErr_Occurred())
7708       ; // let the latest Python exn pass through and ignore the current one
7709     else
7710       throw;
7711   } catch (const std::invalid_argument& exn) {
7712     // Catch a handful of different errors here and turn them into the
7713     // equivalent Python errors.
7714     // Change invalid_argument to ValueError
7715     PyErr_SetString(PyExc_ValueError, exn.what());
7716   } catch (const std::out_of_range& exn) {
7717     // Change out_of_range to IndexError
7718     PyErr_SetString(PyExc_IndexError, exn.what());
7719   } catch (const std::exception& exn) {
7720     PyErr_SetString(PyExc_RuntimeError, exn.what());
7721   }
7722   catch (...)
7723   {
7724     PyErr_SetString(PyExc_RuntimeError, "Unknown exception");
7725   }
7726 }
7727 #endif
7728 """,
7729 impl = ""
7730 )
7731
7732 pyerr_occurred_withgil_utility_code= UtilityCode(
7733 proto = """
7734 static CYTHON_INLINE int __Pyx_ErrOccurredWithGIL(void); /* proto */
7735 """,
7736 impl = """
7737 static CYTHON_INLINE int __Pyx_ErrOccurredWithGIL(void) {
7738   int err;
7739   #ifdef WITH_THREAD
7740   PyGILState_STATE _save = PyGILState_Ensure();
7741   #endif
7742   err = !!PyErr_Occurred();
7743   #ifdef WITH_THREAD
7744   PyGILState_Release(_save);
7745   #endif
7746   return err;
7747 }
7748 """
7749 )
7750
7751 #------------------------------------------------------------------------------------
7752
7753 raise_noneattr_error_utility_code = UtilityCode(
7754 proto = """
7755 static CYTHON_INLINE void __Pyx_RaiseNoneAttributeError(const char* attrname);
7756 """,
7757 impl = '''
7758 static CYTHON_INLINE void __Pyx_RaiseNoneAttributeError(const char* attrname) {
7759     PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", attrname);
7760 }
7761 ''')
7762
7763 raise_noneindex_error_utility_code = UtilityCode(
7764 proto = """
7765 static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void);
7766 """,
7767 impl = '''
7768 static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void) {
7769     PyErr_SetString(PyExc_TypeError, "'NoneType' object is unsubscriptable");
7770 }
7771 ''')
7772
7773 raise_none_iter_error_utility_code = UtilityCode(
7774 proto = """
7775 static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
7776 """,
7777 impl = '''
7778 static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
7779     PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
7780 }
7781 ''')
7782
7783 #------------------------------------------------------------------------------------
7784
7785 getitem_dict_utility_code = UtilityCode(
7786 proto = """
7787 #if PY_MAJOR_VERSION >= 3
7788 static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
7789     PyObject *value;
7790     if (unlikely(d == Py_None)) {
7791         __Pyx_RaiseNoneIndexingError();
7792         return NULL;
7793     }
7794     value = PyDict_GetItemWithError(d, key);
7795     if (unlikely(!value)) {
7796         if (!PyErr_Occurred())
7797             PyErr_SetObject(PyExc_KeyError, key);
7798         return NULL;
7799     }
7800     Py_INCREF(value);
7801     return value;
7802 }
7803 #else
7804     #define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key)
7805 #endif
7806 """,
7807 requires = [raise_noneindex_error_utility_code])
7808
7809 #------------------------------------------------------------------------------------
7810
7811 getitem_int_pyunicode_utility_code = UtilityCode(
7812 proto = '''
7813 #define __Pyx_GetItemInt_Unicode(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\
7814                                                __Pyx_GetItemInt_Unicode_Fast(o, i) : \\
7815                                                __Pyx_GetItemInt_Unicode_Generic(o, to_py_func(i)))
7816
7817 static CYTHON_INLINE Py_UNICODE __Pyx_GetItemInt_Unicode_Fast(PyObject* ustring, Py_ssize_t i) {
7818     if (likely((0 <= i) & (i < PyUnicode_GET_SIZE(ustring)))) {
7819         return PyUnicode_AS_UNICODE(ustring)[i];
7820     } else if ((-PyUnicode_GET_SIZE(ustring) <= i) & (i < 0)) {
7821         i += PyUnicode_GET_SIZE(ustring);
7822         return PyUnicode_AS_UNICODE(ustring)[i];
7823     } else {
7824         PyErr_SetString(PyExc_IndexError, "string index out of range");
7825         return (Py_UNICODE)-1;
7826     }
7827 }
7828
7829 static CYTHON_INLINE Py_UNICODE __Pyx_GetItemInt_Unicode_Generic(PyObject* ustring, PyObject* j) {
7830     Py_UNICODE uchar;
7831     PyObject *uchar_string;
7832     if (!j) return (Py_UNICODE)-1;
7833     uchar_string = PyObject_GetItem(ustring, j);
7834     Py_DECREF(j);
7835     if (!uchar_string) return (Py_UNICODE)-1;
7836     uchar = PyUnicode_AS_UNICODE(uchar_string)[0];
7837     Py_DECREF(uchar_string);
7838     return uchar;
7839 }
7840 ''')
7841
7842 getitem_int_utility_code = UtilityCode(
7843 proto = """
7844
7845 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
7846     PyObject *r;
7847     if (!j) return NULL;
7848     r = PyObject_GetItem(o, j);
7849     Py_DECREF(j);
7850     return r;
7851 }
7852
7853 """ + ''.join([
7854 """
7855 #define __Pyx_GetItemInt_%(type)s(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\
7856                                                     __Pyx_GetItemInt_%(type)s_Fast(o, i) : \\
7857                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
7858
7859 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_%(type)s_Fast(PyObject *o, Py_ssize_t i) {
7860     if (likely(o != Py_None)) {
7861         if (likely((0 <= i) & (i < Py%(type)s_GET_SIZE(o)))) {
7862             PyObject *r = Py%(type)s_GET_ITEM(o, i);
7863             Py_INCREF(r);
7864             return r;
7865         }
7866         else if ((-Py%(type)s_GET_SIZE(o) <= i) & (i < 0)) {
7867             PyObject *r = Py%(type)s_GET_ITEM(o, Py%(type)s_GET_SIZE(o) + i);
7868             Py_INCREF(r);
7869             return r;
7870         }
7871     }
7872     return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
7873 }
7874 """ % {'type' : type_name} for type_name in ('List', 'Tuple')
7875 ]) + """
7876
7877 #define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\
7878                                                     __Pyx_GetItemInt_Fast(o, i) : \\
7879                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
7880
7881 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) {
7882     PyObject *r;
7883     if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
7884         r = PyList_GET_ITEM(o, i);
7885         Py_INCREF(r);
7886     }
7887     else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
7888         r = PyTuple_GET_ITEM(o, i);
7889         Py_INCREF(r);
7890     }
7891     else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
7892         r = PySequence_GetItem(o, i);
7893     }
7894     else {
7895         r = __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
7896     }
7897     return r;
7898 }
7899 """,
7900 impl = """
7901 """)
7902
7903
7904
7905 #------------------------------------------------------------------------------------
7906
7907 setitem_int_utility_code = UtilityCode(
7908 proto = """
7909 #define __Pyx_SetItemInt(o, i, v, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\
7910                                                     __Pyx_SetItemInt_Fast(o, i, v) : \\
7911                                                     __Pyx_SetItemInt_Generic(o, to_py_func(i), v))
7912
7913 static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) {
7914     int r;
7915     if (!j) return -1;
7916     r = PyObject_SetItem(o, j, v);
7917     Py_DECREF(j);
7918     return r;
7919 }
7920
7921 static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v) {
7922     if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
7923         Py_INCREF(v);
7924         Py_DECREF(PyList_GET_ITEM(o, i));
7925         PyList_SET_ITEM(o, i, v);
7926         return 1;
7927     }
7928     else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_ass_item && (likely(i >= 0)))
7929         return PySequence_SetItem(o, i, v);
7930     else {
7931         PyObject *j = PyInt_FromSsize_t(i);
7932         return __Pyx_SetItemInt_Generic(o, j, v);
7933     }
7934 }
7935 """,
7936 impl = """
7937 """)
7938
7939 #------------------------------------------------------------------------------------
7940
7941 delitem_int_utility_code = UtilityCode(
7942 proto = """
7943 #define __Pyx_DelItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\
7944                                                     __Pyx_DelItemInt_Fast(o, i) : \\
7945                                                     __Pyx_DelItem_Generic(o, to_py_func(i)))
7946
7947 static CYTHON_INLINE int __Pyx_DelItem_Generic(PyObject *o, PyObject *j) {
7948     int r;
7949     if (!j) return -1;
7950     r = PyObject_DelItem(o, j);
7951     Py_DECREF(j);
7952     return r;
7953 }
7954
7955 static CYTHON_INLINE int __Pyx_DelItemInt_Fast(PyObject *o, Py_ssize_t i) {
7956     if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_ass_item && likely(i >= 0))
7957         return PySequence_DelItem(o, i);
7958     else {
7959         PyObject *j = PyInt_FromSsize_t(i);
7960         return __Pyx_DelItem_Generic(o, j);
7961     }
7962 }
7963 """,
7964 impl = """
7965 """)
7966
7967 #------------------------------------------------------------------------------------
7968
7969 raise_too_many_values_to_unpack = UtilityCode(
7970 proto = """
7971 static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
7972 """,
7973 impl = '''
7974 static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
7975     PyErr_Format(PyExc_ValueError,
7976         #if PY_VERSION_HEX < 0x02050000
7977             "too many values to unpack (expected %d)", (int)expected);
7978         #else
7979             "too many values to unpack (expected %zd)", expected);
7980         #endif
7981 }
7982 ''')
7983
7984 raise_need_more_values_to_unpack = UtilityCode(
7985 proto = """
7986 static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
7987 """,
7988 impl = '''
7989 static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
7990     PyErr_Format(PyExc_ValueError,
7991         #if PY_VERSION_HEX < 0x02050000
7992                  "need more than %d value%s to unpack", (int)index,
7993         #else
7994                  "need more than %zd value%s to unpack", index,
7995         #endif
7996                  (index == 1) ? "" : "s");
7997 }
7998 ''')
7999
8000 #------------------------------------------------------------------------------------
8001
8002 tuple_unpacking_error_code = UtilityCode(
8003 proto = """
8004 static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
8005 """,
8006 impl = """
8007 static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
8008     if (t == Py_None) {
8009       __Pyx_RaiseNoneNotIterableError();
8010     } else if (PyTuple_GET_SIZE(t) < index) {
8011       __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t));
8012     } else {
8013       __Pyx_RaiseTooManyValuesError(index);
8014     }
8015 }
8016 """,
8017 requires = [raise_none_iter_error_utility_code,
8018             raise_need_more_values_to_unpack,
8019             raise_too_many_values_to_unpack]
8020 )
8021
8022 unpacking_utility_code = UtilityCode(
8023 proto = """
8024 static PyObject *__Pyx_UnpackItem(PyObject *, Py_ssize_t index); /*proto*/
8025 static int __Pyx_EndUnpack(PyObject *, Py_ssize_t expected); /*proto*/
8026 """,
8027 impl = """
8028 static PyObject *__Pyx_UnpackItem(PyObject *iter, Py_ssize_t index) {
8029     PyObject *item;
8030     if (!(item = PyIter_Next(iter))) {
8031         if (!PyErr_Occurred()) {
8032             __Pyx_RaiseNeedMoreValuesError(index);
8033         }
8034     }
8035     return item;
8036 }
8037
8038 static int __Pyx_EndUnpack(PyObject *iter, Py_ssize_t expected) {
8039     PyObject *item;
8040     if ((item = PyIter_Next(iter))) {
8041         Py_DECREF(item);
8042         __Pyx_RaiseTooManyValuesError(expected);
8043         return -1;
8044     }
8045     else if (!PyErr_Occurred())
8046         return 0;
8047     else
8048         return -1;
8049 }
8050 """,
8051 requires = [raise_need_more_values_to_unpack,
8052             raise_too_many_values_to_unpack]
8053 )
8054
8055 #------------------------------------------------------------------------------------
8056
8057 # CPython supports calling functions with non-dict kwargs by
8058 # converting them to a dict first
8059
8060 kwargs_call_utility_code = UtilityCode(
8061 proto = """
8062 static PyObject* __Pyx_PyEval_CallObjectWithKeywords(PyObject*, PyObject*, PyObject*); /*proto*/
8063 """,
8064 impl = """
8065 static PyObject* __Pyx_PyEval_CallObjectWithKeywords(PyObject *callable, PyObject *args, PyObject *kwargs) {
8066     PyObject* result;
8067     if (likely(PyDict_Check(kwargs))) {
8068         return PyEval_CallObjectWithKeywords(callable, args, kwargs);
8069     } else {
8070         PyObject* real_dict;
8071         real_dict = PyObject_CallFunctionObjArgs((PyObject*)&PyDict_Type, kwargs, NULL);
8072         if (unlikely(!real_dict))
8073             return NULL;
8074         result = PyEval_CallObjectWithKeywords(callable, args, real_dict);
8075         Py_DECREF(real_dict);
8076         return result; /* may be NULL */
8077     }
8078 }
8079 """,
8080 )
8081
8082
8083 #------------------------------------------------------------------------------------
8084
8085 int_pow_utility_code = UtilityCode(
8086 proto="""
8087 static CYTHON_INLINE %(type)s %(func_name)s(%(type)s, %(type)s); /* proto */
8088 """,
8089 impl="""
8090 static CYTHON_INLINE %(type)s %(func_name)s(%(type)s b, %(type)s e) {
8091     %(type)s t = b;
8092     switch (e) {
8093         case 3:
8094             t *= b;
8095         case 2:
8096             t *= b;
8097         case 1:
8098             return t;
8099         case 0:
8100             return 1;
8101     }
8102     if (unlikely(e<0)) return 0;
8103     t = 1;
8104     while (likely(e)) {
8105         t *= (b * (e&1)) | ((~e)&1);    /* 1 or b */
8106         b *= b;
8107         e >>= 1;
8108     }
8109     return t;
8110 }
8111 """)
8112
8113 # ------------------------------ Division ------------------------------------
8114
8115 div_int_utility_code = UtilityCode(
8116 proto="""
8117 static CYTHON_INLINE %(type)s __Pyx_div_%(type_name)s(%(type)s, %(type)s); /* proto */
8118 """,
8119 impl="""
8120 static CYTHON_INLINE %(type)s __Pyx_div_%(type_name)s(%(type)s a, %(type)s b) {
8121     %(type)s q = a / b;
8122     %(type)s r = a - q*b;
8123     q -= ((r != 0) & ((r ^ b) < 0));
8124     return q;
8125 }
8126 """)
8127
8128 mod_int_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 = a %% b;
8135     r += ((r != 0) & ((r ^ b) < 0)) * b;
8136     return r;
8137 }
8138 """)
8139
8140 mod_float_utility_code = UtilityCode(
8141 proto="""
8142 static CYTHON_INLINE %(type)s __Pyx_mod_%(type_name)s(%(type)s, %(type)s); /* proto */
8143 """,
8144 impl="""
8145 static CYTHON_INLINE %(type)s __Pyx_mod_%(type_name)s(%(type)s a, %(type)s b) {
8146     %(type)s r = fmod%(math_h_modifier)s(a, b);
8147     r += ((r != 0) & ((r < 0) ^ (b < 0))) * b;
8148     return r;
8149 }
8150 """)
8151
8152 cdivision_warning_utility_code = UtilityCode(
8153 proto="""
8154 static int __Pyx_cdivision_warning(void); /* proto */
8155 """,
8156 impl="""
8157 static int __Pyx_cdivision_warning(void) {
8158     return PyErr_WarnExplicit(PyExc_RuntimeWarning,
8159                               "division with oppositely signed operands, C and Python semantics differ",
8160                               %(FILENAME)s,
8161                               %(LINENO)s,
8162                               __Pyx_MODULE_NAME,
8163                               NULL);
8164 }
8165 """ % {
8166     'FILENAME': Naming.filename_cname,
8167     'LINENO':  Naming.lineno_cname,
8168 })
8169
8170 # from intobject.c
8171 division_overflow_test_code = UtilityCode(
8172 proto="""
8173 #define UNARY_NEG_WOULD_OVERFLOW(x)     \
8174         (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x)))
8175 """)
8176
8177
8178 binding_cfunc_utility_code = UtilityCode(
8179 proto="""
8180 #define %(binding_cfunc)s_USED 1
8181
8182 typedef struct {
8183     PyCFunctionObject func;
8184 } %(binding_cfunc)s_object;
8185
8186 static PyTypeObject %(binding_cfunc)s_type;
8187 static PyTypeObject *%(binding_cfunc)s = NULL;
8188
8189 static PyObject *%(binding_cfunc)s_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module); /* proto */
8190 #define %(binding_cfunc)s_New(ml, self) %(binding_cfunc)s_NewEx(ml, self, NULL)
8191
8192 static int %(binding_cfunc)s_init(void); /* proto */
8193 """ % Naming.__dict__,
8194 impl="""
8195
8196 static PyObject *%(binding_cfunc)s_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) {
8197         %(binding_cfunc)s_object *op = PyObject_GC_New(%(binding_cfunc)s_object, %(binding_cfunc)s);
8198     if (op == NULL)
8199         return NULL;
8200         op->func.m_ml = ml;
8201         Py_XINCREF(self);
8202         op->func.m_self = self;
8203         Py_XINCREF(module);
8204         op->func.m_module = module;
8205         PyObject_GC_Track(op);
8206         return (PyObject *)op;
8207 }
8208
8209 static void %(binding_cfunc)s_dealloc(%(binding_cfunc)s_object *m) {
8210         PyObject_GC_UnTrack(m);
8211         Py_XDECREF(m->func.m_self);
8212         Py_XDECREF(m->func.m_module);
8213     PyObject_GC_Del(m);
8214 }
8215
8216 static PyObject *%(binding_cfunc)s_descr_get(PyObject *func, PyObject *obj, PyObject *type) {
8217         if (obj == Py_None)
8218                 obj = NULL;
8219         return PyMethod_New(func, obj, type);
8220 }
8221
8222 static int %(binding_cfunc)s_init(void) {
8223     %(binding_cfunc)s_type = PyCFunction_Type;
8224     %(binding_cfunc)s_type.tp_name = __Pyx_NAMESTR("cython_binding_builtin_function_or_method");
8225     %(binding_cfunc)s_type.tp_dealloc = (destructor)%(binding_cfunc)s_dealloc;
8226     %(binding_cfunc)s_type.tp_descr_get = %(binding_cfunc)s_descr_get;
8227     if (PyType_Ready(&%(binding_cfunc)s_type) < 0) {
8228         return -1;
8229     }
8230     %(binding_cfunc)s = &%(binding_cfunc)s_type;
8231     return 0;
8232
8233 }
8234 """ % Naming.__dict__)