Python-2.7.3/Objects/boolobject.c

No issues found

  1 /* Boolean type, a subtype of int */
  2 
  3 #include "Python.h"
  4 
  5 /* We need to define bool_print to override int_print */
  6 
  7 static int
  8 bool_print(PyBoolObject *self, FILE *fp, int flags)
  9 {
 10     Py_BEGIN_ALLOW_THREADS
 11     fputs(self->ob_ival == 0 ? "False" : "True", fp);
 12     Py_END_ALLOW_THREADS
 13     return 0;
 14 }
 15 
 16 /* We define bool_repr to return "False" or "True" */
 17 
 18 static PyObject *false_str = NULL;
 19 static PyObject *true_str = NULL;
 20 
 21 static PyObject *
 22 bool_repr(PyBoolObject *self)
 23 {
 24     PyObject *s;
 25 
 26     if (self->ob_ival)
 27         s = true_str ? true_str :
 28             (true_str = PyString_InternFromString("True"));
 29     else
 30         s = false_str ? false_str :
 31             (false_str = PyString_InternFromString("False"));
 32     Py_XINCREF(s);
 33     return s;
 34 }
 35 
 36 /* Function to return a bool from a C long */
 37 
 38 PyObject *PyBool_FromLong(long ok)
 39 {
 40     PyObject *result;
 41 
 42     if (ok)
 43         result = Py_True;
 44     else
 45         result = Py_False;
 46     Py_INCREF(result);
 47     return result;
 48 }
 49 
 50 /* We define bool_new to always return either Py_True or Py_False */
 51 
 52 static PyObject *
 53 bool_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 54 {
 55     static char *kwlist[] = {"x", 0};
 56     PyObject *x = Py_False;
 57     long ok;
 58 
 59     if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:bool", kwlist, &x))
 60         return NULL;
 61     ok = PyObject_IsTrue(x);
 62     if (ok < 0)
 63         return NULL;
 64     return PyBool_FromLong(ok);
 65 }
 66 
 67 /* Arithmetic operations redefined to return bool if both args are bool. */
 68 
 69 static PyObject *
 70 bool_and(PyObject *a, PyObject *b)
 71 {
 72     if (!PyBool_Check(a) || !PyBool_Check(b))
 73         return PyInt_Type.tp_as_number->nb_and(a, b);
 74     return PyBool_FromLong(
 75         ((PyBoolObject *)a)->ob_ival & ((PyBoolObject *)b)->ob_ival);
 76 }
 77 
 78 static PyObject *
 79 bool_or(PyObject *a, PyObject *b)
 80 {
 81     if (!PyBool_Check(a) || !PyBool_Check(b))
 82         return PyInt_Type.tp_as_number->nb_or(a, b);
 83     return PyBool_FromLong(
 84         ((PyBoolObject *)a)->ob_ival | ((PyBoolObject *)b)->ob_ival);
 85 }
 86 
 87 static PyObject *
 88 bool_xor(PyObject *a, PyObject *b)
 89 {
 90     if (!PyBool_Check(a) || !PyBool_Check(b))
 91         return PyInt_Type.tp_as_number->nb_xor(a, b);
 92     return PyBool_FromLong(
 93         ((PyBoolObject *)a)->ob_ival ^ ((PyBoolObject *)b)->ob_ival);
 94 }
 95 
 96 /* Doc string */
 97 
 98 PyDoc_STRVAR(bool_doc,
 99 "bool(x) -> bool\n\
100 \n\
101 Returns True when the argument x is true, False otherwise.\n\
102 The builtins True and False are the only two instances of the class bool.\n\
103 The class bool is a subclass of the class int, and cannot be subclassed.");
104 
105 /* Arithmetic methods -- only so we can override &, |, ^. */
106 
107 static PyNumberMethods bool_as_number = {
108     0,                          /* nb_add */
109     0,                          /* nb_subtract */
110     0,                          /* nb_multiply */
111     0,                          /* nb_divide */
112     0,                          /* nb_remainder */
113     0,                          /* nb_divmod */
114     0,                          /* nb_power */
115     0,                          /* nb_negative */
116     0,                          /* nb_positive */
117     0,                          /* nb_absolute */
118     0,                          /* nb_nonzero */
119     0,                          /* nb_invert */
120     0,                          /* nb_lshift */
121     0,                          /* nb_rshift */
122     bool_and,                   /* nb_and */
123     bool_xor,                   /* nb_xor */
124     bool_or,                    /* nb_or */
125     0,                          /* nb_coerce */
126     0,                          /* nb_int */
127     0,                          /* nb_long */
128     0,                          /* nb_float */
129     0,                          /* nb_oct */
130     0,                          /* nb_hex */
131     0,                          /* nb_inplace_add */
132     0,                          /* nb_inplace_subtract */
133     0,                          /* nb_inplace_multiply */
134     0,                          /* nb_inplace_divide */
135     0,                          /* nb_inplace_remainder */
136     0,                          /* nb_inplace_power */
137     0,                          /* nb_inplace_lshift */
138     0,                          /* nb_inplace_rshift */
139     0,                          /* nb_inplace_and */
140     0,                          /* nb_inplace_xor */
141     0,                          /* nb_inplace_or */
142     0,                          /* nb_floor_divide */
143     0,                          /* nb_true_divide */
144     0,                          /* nb_inplace_floor_divide */
145     0,                          /* nb_inplace_true_divide */
146 };
147 
148 /* The type object for bool.  Note that this cannot be subclassed! */
149 
150 PyTypeObject PyBool_Type = {
151     PyVarObject_HEAD_INIT(&PyType_Type, 0)
152     "bool",
153     sizeof(PyIntObject),
154     0,
155     0,                                          /* tp_dealloc */
156     (printfunc)bool_print,                      /* tp_print */
157     0,                                          /* tp_getattr */
158     0,                                          /* tp_setattr */
159     0,                                          /* tp_compare */
160     (reprfunc)bool_repr,                        /* tp_repr */
161     &bool_as_number,                            /* tp_as_number */
162     0,                                          /* tp_as_sequence */
163     0,                                          /* tp_as_mapping */
164     0,                                          /* tp_hash */
165     0,                                          /* tp_call */
166     (reprfunc)bool_repr,                        /* tp_str */
167     0,                                          /* tp_getattro */
168     0,                                          /* tp_setattro */
169     0,                                          /* tp_as_buffer */
170     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
171     bool_doc,                                   /* tp_doc */
172     0,                                          /* tp_traverse */
173     0,                                          /* tp_clear */
174     0,                                          /* tp_richcompare */
175     0,                                          /* tp_weaklistoffset */
176     0,                                          /* tp_iter */
177     0,                                          /* tp_iternext */
178     0,                                          /* tp_methods */
179     0,                                          /* tp_members */
180     0,                                          /* tp_getset */
181     &PyInt_Type,                                /* tp_base */
182     0,                                          /* tp_dict */
183     0,                                          /* tp_descr_get */
184     0,                                          /* tp_descr_set */
185     0,                                          /* tp_dictoffset */
186     0,                                          /* tp_init */
187     0,                                          /* tp_alloc */
188     bool_new,                                   /* tp_new */
189 };
190 
191 /* The objects representing bool values False and True */
192 
193 /* Named Zero for link-level compatibility */
194 PyIntObject _Py_ZeroStruct = {
195     PyObject_HEAD_INIT(&PyBool_Type)
196     0
197 };
198 
199 PyIntObject _Py_TrueStruct = {
200     PyObject_HEAD_INIT(&PyBool_Type)
201     1
202 };