text: /* Boolean type, a subtype of int */
  
  #include "Python.h"
  
  /* We need to define bool_print to override int_print */
  
  static int
  bool_print(PyBoolObject *self, FILE *fp, int flags)
  {
      Py_BEGIN_ALLOW_THREADS
      fputs(self->ob_ival == 0 ? "False" : "True", fp);
      Py_END_ALLOW_THREADS
      return 0;
  }
  
  /* We define bool_repr to return "False" or "True" */
  
  static PyObject *false_str = NULL;
  static PyObject *true_str = NULL;
  
  static PyObject *
  bool_repr(PyBoolObject *self)
  {
      PyObject *s;
  
      if (self->ob_ival)
          s = true_str ? true_str :
              (true_str = PyString_InternFromString("True"));
      else
          s = false_str ? false_str :
              (false_str = PyString_InternFromString("False"));
      Py_XINCREF(s);
      return s;
  }
  
  /* Function to return a bool from a C long */
  
  PyObject *PyBool_FromLong(long long ok)
  {
      PyObject *result;
  
      if (ok)
          result = Py_True;
      else
          result = Py_False;
      Py_INCREF(result);
      return result;
  }
  
  /* We define bool_new to always return either Py_True or Py_False */
  
  static PyObject *
  bool_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
  {
      static char *kwlist[] = {"x", 0};
      PyObject *x = Py_False;
      long ok;
  
      if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:bool", kwlist, &x))
          return NULL;
      ok = PyObject_IsTrue(x);
      if (ok < 0)
          return NULL;
      return PyBool_FromLong(ok);
  }
  
  /* Arithmetic operations redefined to return bool if both args are bool. */
  
  static PyObject *
  bool_and(PyObject *a, PyObject *b)
  {
      if (!PyBool_Check(a) || !PyBool_Check(b))
          return PyInt_Type.tp_as_number->nb_and(a, b);
      return PyBool_FromLong(
          ((PyBoolObject *)a)->ob_ival & ((PyBoolObject *)b)->ob_ival);
  }
  
  static PyObject *
  bool_or(PyObject *a, PyObject *b)
  {
      if (!PyBool_Check(a) || !PyBool_Check(b))
          return PyInt_Type.tp_as_number->nb_or(a, b);
      return PyBool_FromLong(
          ((PyBoolObject *)a)->ob_ival | ((PyBoolObject *)b)->ob_ival);
  }
  
  static PyObject *
  bool_xor(PyObject *a, PyObject *b)
  {
      if (!PyBool_Check(a) || !PyBool_Check(b))
          return PyInt_Type.tp_as_number->nb_xor(a, b);
      return PyBool_FromLong(
          ((PyBoolObject *)a)->ob_ival ^ ((PyBoolObject *)b)->ob_ival);
  }
  
  /* Doc string */
  
  PyDoc_STRVAR(bool_doc,
  "bool(x) -> bool\n\
  \n\
  Returns True when the argument x is true, False otherwise.\n\
  The builtins True and False are the only two instances of the class bool.\n\
  The class bool is a subclass of the class int, and cannot be subclassed.");
  
  /* Arithmetic methods -- only so we can override &, |, ^. */
  
  static PyNumberMethods bool_as_number = {
      0,                          /* nb_add */
      0,                          /* nb_subtract */
      0,                          /* nb_multiply */
      0,                          /* nb_divide */
      0,                          /* nb_remainder */
      0,                          /* nb_divmod */
      0,                          /* nb_power */
      0,                          /* nb_negative */
      0,                          /* nb_positive */
      0,                          /* nb_absolute */
      0,                          /* nb_nonzero */
      0,                          /* nb_invert */
      0,                          /* nb_lshift */
      0,                          /* nb_rshift */
      bool_and,                   /* nb_and */
      bool_xor,                   /* nb_xor */
      bool_or,                    /* nb_or */
      0,                          /* nb_coerce */
      0,                          /* nb_int */
      0,                          /* nb_long */
      0,                          /* nb_float */
      0,                          /* nb_oct */
      0,                          /* nb_hex */
      0,                          /* nb_inplace_add */
      0,                          /* nb_inplace_subtract */
      0,                          /* nb_inplace_multiply */
      0,                          /* nb_inplace_divide */
      0,                          /* nb_inplace_remainder */
      0,                          /* nb_inplace_power */
      0,                          /* nb_inplace_lshift */
      0,                          /* nb_inplace_rshift */
      0,                          /* nb_inplace_and */
      0,                          /* nb_inplace_xor */
      0,                          /* nb_inplace_or */
      0,                          /* nb_floor_divide */
      0,                          /* nb_true_divide */
      0,                          /* nb_inplace_floor_divide */
      0,                          /* nb_inplace_true_divide */
  };
  
  /* The type object for bool.  Note that this cannot be subclassed! */
  
  PyTypeObject PyBool_Type = {
      PyVarObject_HEAD_INIT(&PyType_Type, 0)
      "bool",
      sizeof(PyIntObject),
      0,
      0,                                          /* tp_dealloc */
      (printfunc)bool_print,                      /* tp_print */
      0,                                          /* tp_getattr */
      0,                                          /* tp_setattr */
      0,                                          /* tp_compare */
      (reprfunc)bool_repr,                        /* tp_repr */
      &bool_as_number,                            /* tp_as_number */
      0,                                          /* tp_as_sequence */
      0,                                          /* tp_as_mapping */
      0,                                          /* tp_hash */
      0,                                          /* tp_call */
      (reprfunc)bool_repr,                        /* tp_str */
      0,                                          /* tp_getattro */
      0,                                          /* tp_setattro */
      0,                                          /* tp_as_buffer */
      Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
      bool_doc,                                   /* tp_doc */
      0,                                          /* tp_traverse */
      0,                                          /* tp_clear */
      0,                                          /* tp_richcompare */
      0,                                          /* tp_weaklistoffset */
      0,                                          /* tp_iter */
      0,                                          /* tp_iternext */
      0,                                          /* tp_methods */
      0,                                          /* tp_members */
      0,                                          /* tp_getset */
      &PyInt_Type,                                /* tp_base */
      0,                                          /* tp_dict */
      0,                                          /* tp_descr_get */
      0,                                          /* tp_descr_set */
      0,                                          /* tp_dictoffset */
      0,                                          /* tp_init */
      0,                                          /* tp_alloc */
      bool_new,                                   /* tp_new */
  };
  
  /* The objects representing bool values False and True */
  
  /* Named Zero for link-level compatibility */
  PyIntObject _Py_ZeroStruct = {
      PyObject_HEAD_INIT(&PyBool_Type)
      0
  };
  
  PyIntObject _Py_TrueStruct = {
      PyObject_HEAD_INIT(&PyBool_Type)
      1
  };
  