7#include "nuitka/prelude.h"
12#if PYTHON_VERSION < 0x300
14static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_INT_INT(PyObject *operand1, PyObject *operand2) {
15 CHECK_OBJECT(operand1);
16 assert(PyInt_CheckExact(operand1));
17 CHECK_OBJECT(operand2);
18 assert(PyInt_CheckExact(operand2));
25#pragma warning(disable : 4101)
27 NUITKA_MAY_BE_UNUSED
bool cbool_result;
28 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
29 NUITKA_MAY_BE_UNUSED
long clong_result;
30 NUITKA_MAY_BE_UNUSED
double cfloat_result;
35 CHECK_OBJECT(operand1);
36 assert(PyInt_CheckExact(operand1));
37 CHECK_OBJECT(operand2);
38 assert(PyInt_CheckExact(operand2));
40 const long a = PyInt_AS_LONG(operand1);
41 const long b = PyInt_AS_LONG(operand2);
43 if (unlikely(b == 0)) {
44 PyThreadState *tstate = PyThreadState_GET();
46 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ZeroDivisionError,
"integer division or modulo by zero");
47 goto exit_result_exception;
56 if (likely(b != -1 || !UNARY_NEG_WOULD_OVERFLOW(a))) {
58 long a_mod_b = (long)(a - (
unsigned long)a_div_b * b);
60 if (a_mod_b && (b ^ a_mod_b) < 0) {
65 clong_result = a_div_b;
66 goto exit_result_ok_clong;
70 PyObject *operand1_object = operand1;
71 PyObject *operand2_object = operand2;
73 PyObject *r = PyLong_Type.tp_as_number->nb_floor_divide(operand1_object, operand2_object);
74 assert(r != Py_NotImplemented);
77 goto exit_result_object;
81 result = Nuitka_PyInt_FromLong(clong_result);
85 if (unlikely(obj_result == NULL)) {
86 goto exit_result_exception;
98PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_INT_INT(PyObject *operand1, PyObject *operand2) {
99 return _BINARY_OPERATION_FLOORDIV_OBJECT_INT_INT(operand1, operand2);
103#if PYTHON_VERSION < 0x300
105static HEDLEY_NEVER_INLINE PyObject *__BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_INT(PyObject *operand1,
106 PyObject *operand2) {
107 PyTypeObject *type1 = Py_TYPE(operand1);
111#pragma warning(disable : 4101)
113 NUITKA_MAY_BE_UNUSED
bool cbool_result;
114 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
120 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_floor_divide : NULL;
121 binaryfunc slot2 = NULL;
123 if (!(type1 == &PyInt_Type)) {
126 slot2 = PyInt_Type.tp_as_number->nb_floor_divide;
128 if (slot1 == slot2) {
134 PyObject *x = slot1(operand1, operand2);
136 if (x != Py_NotImplemented) {
138 goto exit_binary_result_object;
141 Py_DECREF_IMMORTAL(x);
145 PyObject *x = slot2(operand1, operand2);
147 if (x != Py_NotImplemented) {
149 goto exit_binary_result_object;
152 Py_DECREF_IMMORTAL(x);
155#if PYTHON_VERSION < 0x300
156 if (!NEW_STYLE_NUMBER_TYPE(type1) || !1) {
158 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_coerce : NULL;
161 PyObject *coerced1 = operand1;
162 PyObject *coerced2 = operand2;
164 int err = c1(&coerced1, &coerced2);
166 if (unlikely(err < 0)) {
167 goto exit_binary_exception;
171 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
173 if (likely(mv == NULL)) {
174 binaryfunc slot = mv->nb_floor_divide;
176 if (likely(slot != NULL)) {
177 PyObject *x = slot(coerced1, coerced2);
183 goto exit_binary_result_object;
192 coercion c2 = PyInt_Type.tp_as_number->nb_coerce;
195 PyObject *coerced1 = operand1;
196 PyObject *coerced2 = operand2;
198 int err = c2(&coerced2, &coerced1);
200 if (unlikely(err < 0)) {
201 goto exit_binary_exception;
205 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
207 if (likely(mv == NULL)) {
208 binaryfunc slot = mv->nb_floor_divide;
210 if (likely(slot != NULL)) {
211 PyObject *x = slot(coerced1, coerced2);
217 goto exit_binary_result_object;
229 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: '%s' and 'int'", type1->tp_name);
230 goto exit_binary_exception;
232exit_binary_result_object:
235exit_binary_exception:
238static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_INT(PyObject *operand1, PyObject *operand2) {
239 CHECK_OBJECT(operand1);
240 CHECK_OBJECT(operand2);
241 assert(PyInt_CheckExact(operand2));
243 PyTypeObject *type1 = Py_TYPE(operand1);
245 if (type1 == &PyInt_Type) {
253#pragma warning(disable : 4101)
255 NUITKA_MAY_BE_UNUSED
bool cbool_result;
256 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
257 NUITKA_MAY_BE_UNUSED
long clong_result;
258 NUITKA_MAY_BE_UNUSED
double cfloat_result;
263 CHECK_OBJECT(operand1);
264 assert(PyInt_CheckExact(operand1));
265 CHECK_OBJECT(operand2);
266 assert(PyInt_CheckExact(operand2));
268 const long a = PyInt_AS_LONG(operand1);
269 const long b = PyInt_AS_LONG(operand2);
271 if (unlikely(b == 0)) {
272 PyThreadState *tstate = PyThreadState_GET();
274 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ZeroDivisionError,
"integer division or modulo by zero");
275 goto exit_result_exception;
284 if (likely(b != -1 || !UNARY_NEG_WOULD_OVERFLOW(a))) {
285 long a_div_b = a / b;
286 long a_mod_b = (long)(a - (
unsigned long)a_div_b * b);
288 if (a_mod_b && (b ^ a_mod_b) < 0) {
293 clong_result = a_div_b;
294 goto exit_result_ok_clong;
298 PyObject *operand1_object = operand1;
299 PyObject *operand2_object = operand2;
301 PyObject *r = PyLong_Type.tp_as_number->nb_floor_divide(operand1_object, operand2_object);
302 assert(r != Py_NotImplemented);
305 goto exit_result_object;
308 exit_result_ok_clong:
309 result = Nuitka_PyInt_FromLong(clong_result);
313 if (unlikely(obj_result == NULL)) {
314 goto exit_result_exception;
322 exit_result_exception:
326 return __BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_INT(operand1, operand2);
329PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_INT(PyObject *operand1, PyObject *operand2) {
330 return _BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_INT(operand1, operand2);
334#if PYTHON_VERSION < 0x300
336static HEDLEY_NEVER_INLINE PyObject *__BINARY_OPERATION_FLOORDIV_OBJECT_INT_OBJECT(PyObject *operand1,
337 PyObject *operand2) {
338 PyTypeObject *type2 = Py_TYPE(operand2);
342#pragma warning(disable : 4101)
344 NUITKA_MAY_BE_UNUSED
bool cbool_result;
345 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
350 binaryfunc slot1 = PyInt_Type.tp_as_number->nb_floor_divide;
351 binaryfunc slot2 = NULL;
353 if (!(&PyInt_Type == type2)) {
357 (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_floor_divide : NULL;
359 if (slot1 == slot2) {
366 if (Nuitka_Type_IsSubtype(type2, &PyInt_Type)) {
367 PyObject *x = slot2(operand1, operand2);
369 if (x != Py_NotImplemented) {
371 goto exit_binary_result_object;
374 Py_DECREF_IMMORTAL(x);
379 PyObject *x = slot1(operand1, operand2);
381 if (x != Py_NotImplemented) {
383 goto exit_binary_result_object;
386 Py_DECREF_IMMORTAL(x);
390 PyObject *x = slot2(operand1, operand2);
392 if (x != Py_NotImplemented) {
394 goto exit_binary_result_object;
397 Py_DECREF_IMMORTAL(x);
400#if PYTHON_VERSION < 0x300
401 if (!1 || !NEW_STYLE_NUMBER_TYPE(type2)) {
402 coercion c1 = PyInt_Type.tp_as_number->nb_coerce;
405 PyObject *coerced1 = operand1;
406 PyObject *coerced2 = operand2;
408 int err = c1(&coerced1, &coerced2);
410 if (unlikely(err < 0)) {
411 goto exit_binary_exception;
415 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
417 if (likely(mv == NULL)) {
418 binaryfunc slot = mv->nb_floor_divide;
420 if (likely(slot != NULL)) {
421 PyObject *x = slot(coerced1, coerced2);
427 goto exit_binary_result_object;
437 (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_coerce : NULL;
440 PyObject *coerced1 = operand1;
441 PyObject *coerced2 = operand2;
443 int err = c2(&coerced2, &coerced1);
445 if (unlikely(err < 0)) {
446 goto exit_binary_exception;
450 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
452 if (likely(mv == NULL)) {
453 binaryfunc slot = mv->nb_floor_divide;
455 if (likely(slot != NULL)) {
456 PyObject *x = slot(coerced1, coerced2);
462 goto exit_binary_result_object;
474 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: 'int' and '%s'", type2->tp_name);
475 goto exit_binary_exception;
477exit_binary_result_object:
480exit_binary_exception:
483static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_INT_OBJECT(PyObject *operand1, PyObject *operand2) {
484 CHECK_OBJECT(operand1);
485 assert(PyInt_CheckExact(operand1));
486 CHECK_OBJECT(operand2);
488 PyTypeObject *type2 = Py_TYPE(operand2);
490 if (&PyInt_Type == type2) {
498#pragma warning(disable : 4101)
500 NUITKA_MAY_BE_UNUSED
bool cbool_result;
501 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
502 NUITKA_MAY_BE_UNUSED
long clong_result;
503 NUITKA_MAY_BE_UNUSED
double cfloat_result;
508 CHECK_OBJECT(operand1);
509 assert(PyInt_CheckExact(operand1));
510 CHECK_OBJECT(operand2);
511 assert(PyInt_CheckExact(operand2));
513 const long a = PyInt_AS_LONG(operand1);
514 const long b = PyInt_AS_LONG(operand2);
516 if (unlikely(b == 0)) {
517 PyThreadState *tstate = PyThreadState_GET();
519 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ZeroDivisionError,
"integer division or modulo by zero");
520 goto exit_result_exception;
529 if (likely(b != -1 || !UNARY_NEG_WOULD_OVERFLOW(a))) {
530 long a_div_b = a / b;
531 long a_mod_b = (long)(a - (
unsigned long)a_div_b * b);
533 if (a_mod_b && (b ^ a_mod_b) < 0) {
538 clong_result = a_div_b;
539 goto exit_result_ok_clong;
543 PyObject *operand1_object = operand1;
544 PyObject *operand2_object = operand2;
546 PyObject *r = PyLong_Type.tp_as_number->nb_floor_divide(operand1_object, operand2_object);
547 assert(r != Py_NotImplemented);
550 goto exit_result_object;
553 exit_result_ok_clong:
554 result = Nuitka_PyInt_FromLong(clong_result);
558 if (unlikely(obj_result == NULL)) {
559 goto exit_result_exception;
567 exit_result_exception:
571 return __BINARY_OPERATION_FLOORDIV_OBJECT_INT_OBJECT(operand1, operand2);
574PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_INT_OBJECT(PyObject *operand1, PyObject *operand2) {
575 return _BINARY_OPERATION_FLOORDIV_OBJECT_INT_OBJECT(operand1, operand2);
580static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_LONG_LONG(PyObject *operand1, PyObject *operand2) {
581 CHECK_OBJECT(operand1);
582 assert(PyLong_CheckExact(operand1));
583 CHECK_OBJECT(operand2);
584 assert(PyLong_CheckExact(operand2));
591#pragma warning(disable : 4101)
593 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
594 NUITKA_MAY_BE_UNUSED
long clong_result;
599 PyObject *x = PyLong_Type.tp_as_number->nb_floor_divide(operand1, operand2);
600 assert(x != Py_NotImplemented);
603 goto exit_result_object;
606 if (unlikely(obj_result == NULL)) {
607 goto exit_result_exception;
615exit_result_exception:
619PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_LONG_LONG(PyObject *operand1, PyObject *operand2) {
620 return _BINARY_OPERATION_FLOORDIV_OBJECT_LONG_LONG(operand1, operand2);
624static HEDLEY_NEVER_INLINE PyObject *__BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_LONG(PyObject *operand1,
625 PyObject *operand2) {
626 PyTypeObject *type1 = Py_TYPE(operand1);
630#pragma warning(disable : 4101)
632 NUITKA_MAY_BE_UNUSED
bool cbool_result;
633 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
639 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_floor_divide : NULL;
640 binaryfunc slot2 = NULL;
642 if (!(type1 == &PyLong_Type)) {
645 slot2 = PyLong_Type.tp_as_number->nb_floor_divide;
647 if (slot1 == slot2) {
653 PyObject *x = slot1(operand1, operand2);
655 if (x != Py_NotImplemented) {
657 goto exit_binary_result_object;
660 Py_DECREF_IMMORTAL(x);
664 PyObject *x = slot2(operand1, operand2);
666 if (x != Py_NotImplemented) {
668 goto exit_binary_result_object;
671 Py_DECREF_IMMORTAL(x);
674#if PYTHON_VERSION < 0x300
675 if (!NEW_STYLE_NUMBER_TYPE(type1) || !1) {
677 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_coerce : NULL;
680 PyObject *coerced1 = operand1;
681 PyObject *coerced2 = operand2;
683 int err = c1(&coerced1, &coerced2);
685 if (unlikely(err < 0)) {
686 goto exit_binary_exception;
690 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
692 if (likely(mv == NULL)) {
693 binaryfunc slot = mv->nb_floor_divide;
695 if (likely(slot != NULL)) {
696 PyObject *x = slot(coerced1, coerced2);
702 goto exit_binary_result_object;
711 coercion c2 = PyLong_Type.tp_as_number->nb_coerce;
714 PyObject *coerced1 = operand1;
715 PyObject *coerced2 = operand2;
717 int err = c2(&coerced2, &coerced1);
719 if (unlikely(err < 0)) {
720 goto exit_binary_exception;
724 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
726 if (likely(mv == NULL)) {
727 binaryfunc slot = mv->nb_floor_divide;
729 if (likely(slot != NULL)) {
730 PyObject *x = slot(coerced1, coerced2);
736 goto exit_binary_result_object;
748#if PYTHON_VERSION < 0x300
749 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: '%s' and 'long'", type1->tp_name);
751 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: '%s' and 'int'", type1->tp_name);
753 goto exit_binary_exception;
755exit_binary_result_object:
758exit_binary_exception:
761static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_LONG(PyObject *operand1, PyObject *operand2) {
762 CHECK_OBJECT(operand1);
763 CHECK_OBJECT(operand2);
764 assert(PyLong_CheckExact(operand2));
766 PyTypeObject *type1 = Py_TYPE(operand1);
768 if (type1 == &PyLong_Type) {
776#pragma warning(disable : 4101)
778 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
779 NUITKA_MAY_BE_UNUSED
long clong_result;
784 PyObject *x = PyLong_Type.tp_as_number->nb_floor_divide(operand1, operand2);
785 assert(x != Py_NotImplemented);
788 goto exit_result_object;
791 if (unlikely(obj_result == NULL)) {
792 goto exit_result_exception;
800 exit_result_exception:
804 return __BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_LONG(operand1, operand2);
807PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_LONG(PyObject *operand1, PyObject *operand2) {
808 return _BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_LONG(operand1, operand2);
812static HEDLEY_NEVER_INLINE PyObject *__BINARY_OPERATION_FLOORDIV_OBJECT_LONG_OBJECT(PyObject *operand1,
813 PyObject *operand2) {
814 PyTypeObject *type2 = Py_TYPE(operand2);
818#pragma warning(disable : 4101)
820 NUITKA_MAY_BE_UNUSED
bool cbool_result;
821 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
826 binaryfunc slot1 = PyLong_Type.tp_as_number->nb_floor_divide;
827 binaryfunc slot2 = NULL;
829 if (!(&PyLong_Type == type2)) {
833 (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_floor_divide : NULL;
835 if (slot1 == slot2) {
842 if (Nuitka_Type_IsSubtype(type2, &PyLong_Type)) {
843 PyObject *x = slot2(operand1, operand2);
845 if (x != Py_NotImplemented) {
847 goto exit_binary_result_object;
850 Py_DECREF_IMMORTAL(x);
855 PyObject *x = slot1(operand1, operand2);
857 if (x != Py_NotImplemented) {
859 goto exit_binary_result_object;
862 Py_DECREF_IMMORTAL(x);
866 PyObject *x = slot2(operand1, operand2);
868 if (x != Py_NotImplemented) {
870 goto exit_binary_result_object;
873 Py_DECREF_IMMORTAL(x);
876#if PYTHON_VERSION < 0x300
877 if (!1 || !NEW_STYLE_NUMBER_TYPE(type2)) {
878 coercion c1 = PyLong_Type.tp_as_number->nb_coerce;
881 PyObject *coerced1 = operand1;
882 PyObject *coerced2 = operand2;
884 int err = c1(&coerced1, &coerced2);
886 if (unlikely(err < 0)) {
887 goto exit_binary_exception;
891 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
893 if (likely(mv == NULL)) {
894 binaryfunc slot = mv->nb_floor_divide;
896 if (likely(slot != NULL)) {
897 PyObject *x = slot(coerced1, coerced2);
903 goto exit_binary_result_object;
913 (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_coerce : NULL;
916 PyObject *coerced1 = operand1;
917 PyObject *coerced2 = operand2;
919 int err = c2(&coerced2, &coerced1);
921 if (unlikely(err < 0)) {
922 goto exit_binary_exception;
926 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
928 if (likely(mv == NULL)) {
929 binaryfunc slot = mv->nb_floor_divide;
931 if (likely(slot != NULL)) {
932 PyObject *x = slot(coerced1, coerced2);
938 goto exit_binary_result_object;
950#if PYTHON_VERSION < 0x300
951 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: 'long' and '%s'", type2->tp_name);
953 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: 'int' and '%s'", type2->tp_name);
955 goto exit_binary_exception;
957exit_binary_result_object:
960exit_binary_exception:
963static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_LONG_OBJECT(PyObject *operand1, PyObject *operand2) {
964 CHECK_OBJECT(operand1);
965 assert(PyLong_CheckExact(operand1));
966 CHECK_OBJECT(operand2);
968 PyTypeObject *type2 = Py_TYPE(operand2);
970 if (&PyLong_Type == type2) {
978#pragma warning(disable : 4101)
980 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
981 NUITKA_MAY_BE_UNUSED
long clong_result;
986 PyObject *x = PyLong_Type.tp_as_number->nb_floor_divide(operand1, operand2);
987 assert(x != Py_NotImplemented);
990 goto exit_result_object;
993 if (unlikely(obj_result == NULL)) {
994 goto exit_result_exception;
1002 exit_result_exception:
1006 return __BINARY_OPERATION_FLOORDIV_OBJECT_LONG_OBJECT(operand1, operand2);
1009PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_LONG_OBJECT(PyObject *operand1, PyObject *operand2) {
1010 return _BINARY_OPERATION_FLOORDIV_OBJECT_LONG_OBJECT(operand1, operand2);
1014static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_FLOAT(PyObject *operand1, PyObject *operand2) {
1015 CHECK_OBJECT(operand1);
1016 assert(PyFloat_CheckExact(operand1));
1017 CHECK_OBJECT(operand2);
1018 assert(PyFloat_CheckExact(operand2));
1022#if defined(_MSC_VER)
1023#pragma warning(push)
1024#pragma warning(disable : 4101)
1027 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1028 NUITKA_MAY_BE_UNUSED
long clong_result;
1029 NUITKA_MAY_BE_UNUSED
double cfloat_result;
1030#if defined(_MSC_VER)
1034 CHECK_OBJECT(operand1);
1035 assert(PyFloat_CheckExact(operand1));
1036 CHECK_OBJECT(operand2);
1037 assert(PyFloat_CheckExact(operand2));
1039 const double a = PyFloat_AS_DOUBLE(operand1);
1040 const double b = PyFloat_AS_DOUBLE(operand2);
1042 if (unlikely(b == 0)) {
1043 PyThreadState *tstate = PyThreadState_GET();
1045 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ZeroDivisionError,
"integer division or modulo by zero");
1046 goto exit_result_exception;
1050 double mod = fmod(a, b);
1051 double div = (a - mod) / b;
1054 if ((a < 0) != (mod < 0)) {
1061 floordiv = floor(div);
1062 if (div - floordiv > 0.5) {
1066 floordiv = copysign(0.0, a / b);
1069 cfloat_result = floordiv;
1070 goto exit_result_ok_cfloat;
1073exit_result_ok_cfloat:
1074 result = MAKE_FLOAT_FROM_DOUBLE(cfloat_result);
1075 goto exit_result_ok;
1080exit_result_exception:
1084PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_FLOAT(PyObject *operand1, PyObject *operand2) {
1085 return _BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_FLOAT(operand1, operand2);
1089static HEDLEY_NEVER_INLINE PyObject *__BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_FLOAT(PyObject *operand1,
1090 PyObject *operand2) {
1091 PyTypeObject *type1 = Py_TYPE(operand1);
1093#if defined(_MSC_VER)
1094#pragma warning(push)
1095#pragma warning(disable : 4101)
1097 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1098 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1099#if defined(_MSC_VER)
1104 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_floor_divide : NULL;
1105 binaryfunc slot2 = NULL;
1107 if (!(type1 == &PyFloat_Type)) {
1110 slot2 = PyFloat_Type.tp_as_number->nb_floor_divide;
1112 if (slot1 == slot2) {
1117 if (slot1 != NULL) {
1118 PyObject *x = slot1(operand1, operand2);
1120 if (x != Py_NotImplemented) {
1122 goto exit_binary_result_object;
1125 Py_DECREF_IMMORTAL(x);
1128 if (slot2 != NULL) {
1129 PyObject *x = slot2(operand1, operand2);
1131 if (x != Py_NotImplemented) {
1133 goto exit_binary_result_object;
1136 Py_DECREF_IMMORTAL(x);
1139#if PYTHON_VERSION < 0x300
1140 if (!NEW_STYLE_NUMBER_TYPE(type1) || !1) {
1142 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_coerce : NULL;
1145 PyObject *coerced1 = operand1;
1146 PyObject *coerced2 = operand2;
1148 int err = c1(&coerced1, &coerced2);
1150 if (unlikely(err < 0)) {
1151 goto exit_binary_exception;
1155 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1157 if (likely(mv == NULL)) {
1158 binaryfunc slot = mv->nb_floor_divide;
1160 if (likely(slot != NULL)) {
1161 PyObject *x = slot(coerced1, coerced2);
1163 Py_DECREF(coerced1);
1164 Py_DECREF(coerced2);
1167 goto exit_binary_result_object;
1172 Py_DECREF(coerced1);
1173 Py_DECREF(coerced2);
1176 coercion c2 = PyFloat_Type.tp_as_number->nb_coerce;
1179 PyObject *coerced1 = operand1;
1180 PyObject *coerced2 = operand2;
1182 int err = c2(&coerced2, &coerced1);
1184 if (unlikely(err < 0)) {
1185 goto exit_binary_exception;
1189 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1191 if (likely(mv == NULL)) {
1192 binaryfunc slot = mv->nb_floor_divide;
1194 if (likely(slot != NULL)) {
1195 PyObject *x = slot(coerced1, coerced2);
1197 Py_DECREF(coerced1);
1198 Py_DECREF(coerced2);
1201 goto exit_binary_result_object;
1206 Py_DECREF(coerced1);
1207 Py_DECREF(coerced2);
1213 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: '%s' and 'float'", type1->tp_name);
1214 goto exit_binary_exception;
1216exit_binary_result_object:
1219exit_binary_exception:
1222static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_FLOAT(PyObject *operand1, PyObject *operand2) {
1223 CHECK_OBJECT(operand1);
1224 CHECK_OBJECT(operand2);
1225 assert(PyFloat_CheckExact(operand2));
1227 PyTypeObject *type1 = Py_TYPE(operand1);
1229 if (type1 == &PyFloat_Type) {
1234#if defined(_MSC_VER)
1235#pragma warning(push)
1236#pragma warning(disable : 4101)
1239 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1240 NUITKA_MAY_BE_UNUSED
long clong_result;
1241 NUITKA_MAY_BE_UNUSED
double cfloat_result;
1242#if defined(_MSC_VER)
1246 CHECK_OBJECT(operand1);
1247 assert(PyFloat_CheckExact(operand1));
1248 CHECK_OBJECT(operand2);
1249 assert(PyFloat_CheckExact(operand2));
1251 const double a = PyFloat_AS_DOUBLE(operand1);
1252 const double b = PyFloat_AS_DOUBLE(operand2);
1254 if (unlikely(b == 0)) {
1255 PyThreadState *tstate = PyThreadState_GET();
1257 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ZeroDivisionError,
"integer division or modulo by zero");
1258 goto exit_result_exception;
1262 double mod = fmod(a, b);
1263 double div = (a - mod) / b;
1266 if ((a < 0) != (mod < 0)) {
1273 floordiv = floor(div);
1274 if (div - floordiv > 0.5) {
1278 floordiv = copysign(0.0, a / b);
1281 cfloat_result = floordiv;
1282 goto exit_result_ok_cfloat;
1285 exit_result_ok_cfloat:
1286 result = MAKE_FLOAT_FROM_DOUBLE(cfloat_result);
1287 goto exit_result_ok;
1292 exit_result_exception:
1296 return __BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_FLOAT(operand1, operand2);
1299PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_FLOAT(PyObject *operand1, PyObject *operand2) {
1300 return _BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_FLOAT(operand1, operand2);
1304static HEDLEY_NEVER_INLINE PyObject *__BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_OBJECT(PyObject *operand1,
1305 PyObject *operand2) {
1306 PyTypeObject *type2 = Py_TYPE(operand2);
1308#if defined(_MSC_VER)
1309#pragma warning(push)
1310#pragma warning(disable : 4101)
1312 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1313 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1314#if defined(_MSC_VER)
1318 binaryfunc slot1 = PyFloat_Type.tp_as_number->nb_floor_divide;
1319 binaryfunc slot2 = NULL;
1321 if (!(&PyFloat_Type == type2)) {
1325 (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_floor_divide : NULL;
1327 if (slot1 == slot2) {
1332 if (slot1 != NULL) {
1333 if (slot2 != NULL) {
1334 if (Nuitka_Type_IsSubtype(type2, &PyFloat_Type)) {
1335 PyObject *x = slot2(operand1, operand2);
1337 if (x != Py_NotImplemented) {
1339 goto exit_binary_result_object;
1342 Py_DECREF_IMMORTAL(x);
1347 PyObject *x = slot1(operand1, operand2);
1349 if (x != Py_NotImplemented) {
1351 goto exit_binary_result_object;
1354 Py_DECREF_IMMORTAL(x);
1357 if (slot2 != NULL) {
1358 PyObject *x = slot2(operand1, operand2);
1360 if (x != Py_NotImplemented) {
1362 goto exit_binary_result_object;
1365 Py_DECREF_IMMORTAL(x);
1368#if PYTHON_VERSION < 0x300
1369 if (!1 || !NEW_STYLE_NUMBER_TYPE(type2)) {
1370 coercion c1 = PyFloat_Type.tp_as_number->nb_coerce;
1373 PyObject *coerced1 = operand1;
1374 PyObject *coerced2 = operand2;
1376 int err = c1(&coerced1, &coerced2);
1378 if (unlikely(err < 0)) {
1379 goto exit_binary_exception;
1383 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1385 if (likely(mv == NULL)) {
1386 binaryfunc slot = mv->nb_floor_divide;
1388 if (likely(slot != NULL)) {
1389 PyObject *x = slot(coerced1, coerced2);
1391 Py_DECREF(coerced1);
1392 Py_DECREF(coerced2);
1395 goto exit_binary_result_object;
1400 Py_DECREF(coerced1);
1401 Py_DECREF(coerced2);
1405 (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_coerce : NULL;
1408 PyObject *coerced1 = operand1;
1409 PyObject *coerced2 = operand2;
1411 int err = c2(&coerced2, &coerced1);
1413 if (unlikely(err < 0)) {
1414 goto exit_binary_exception;
1418 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1420 if (likely(mv == NULL)) {
1421 binaryfunc slot = mv->nb_floor_divide;
1423 if (likely(slot != NULL)) {
1424 PyObject *x = slot(coerced1, coerced2);
1426 Py_DECREF(coerced1);
1427 Py_DECREF(coerced2);
1430 goto exit_binary_result_object;
1435 Py_DECREF(coerced1);
1436 Py_DECREF(coerced2);
1442 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: 'float' and '%s'", type2->tp_name);
1443 goto exit_binary_exception;
1445exit_binary_result_object:
1448exit_binary_exception:
1451static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_OBJECT(PyObject *operand1, PyObject *operand2) {
1452 CHECK_OBJECT(operand1);
1453 assert(PyFloat_CheckExact(operand1));
1454 CHECK_OBJECT(operand2);
1456 PyTypeObject *type2 = Py_TYPE(operand2);
1458 if (&PyFloat_Type == type2) {
1463#if defined(_MSC_VER)
1464#pragma warning(push)
1465#pragma warning(disable : 4101)
1468 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1469 NUITKA_MAY_BE_UNUSED
long clong_result;
1470 NUITKA_MAY_BE_UNUSED
double cfloat_result;
1471#if defined(_MSC_VER)
1475 CHECK_OBJECT(operand1);
1476 assert(PyFloat_CheckExact(operand1));
1477 CHECK_OBJECT(operand2);
1478 assert(PyFloat_CheckExact(operand2));
1480 const double a = PyFloat_AS_DOUBLE(operand1);
1481 const double b = PyFloat_AS_DOUBLE(operand2);
1483 if (unlikely(b == 0)) {
1484 PyThreadState *tstate = PyThreadState_GET();
1486 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ZeroDivisionError,
"integer division or modulo by zero");
1487 goto exit_result_exception;
1491 double mod = fmod(a, b);
1492 double div = (a - mod) / b;
1495 if ((a < 0) != (mod < 0)) {
1502 floordiv = floor(div);
1503 if (div - floordiv > 0.5) {
1507 floordiv = copysign(0.0, a / b);
1510 cfloat_result = floordiv;
1511 goto exit_result_ok_cfloat;
1514 exit_result_ok_cfloat:
1515 result = MAKE_FLOAT_FROM_DOUBLE(cfloat_result);
1516 goto exit_result_ok;
1521 exit_result_exception:
1525 return __BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_OBJECT(operand1, operand2);
1528PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_OBJECT(PyObject *operand1, PyObject *operand2) {
1529 return _BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_OBJECT(operand1, operand2);
1533static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_LONG(PyObject *operand1, PyObject *operand2) {
1534 CHECK_OBJECT(operand1);
1535 assert(PyFloat_CheckExact(operand1));
1536 CHECK_OBJECT(operand2);
1537 assert(PyLong_CheckExact(operand2));
1539#if defined(_MSC_VER)
1540#pragma warning(push)
1541#pragma warning(disable : 4101)
1543 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1544 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1545#if defined(_MSC_VER)
1549 binaryfunc slot1 = PyFloat_Type.tp_as_number->nb_floor_divide;
1552 if (slot1 != NULL) {
1553 PyObject *x = slot1(operand1, operand2);
1555 if (x != Py_NotImplemented) {
1557 goto exit_binary_result_object;
1560 Py_DECREF_IMMORTAL(x);
1565#if PYTHON_VERSION < 0x300
1566 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: 'float' and 'long'");
1568 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: 'float' and 'int'");
1570 goto exit_binary_exception;
1572exit_binary_result_object:
1575exit_binary_exception:
1579PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_LONG(PyObject *operand1, PyObject *operand2) {
1580 return _BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_LONG(operand1, operand2);
1584static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_LONG_FLOAT(PyObject *operand1, PyObject *operand2) {
1585 CHECK_OBJECT(operand1);
1586 assert(PyLong_CheckExact(operand1));
1587 CHECK_OBJECT(operand2);
1588 assert(PyFloat_CheckExact(operand2));
1590#if defined(_MSC_VER)
1591#pragma warning(push)
1592#pragma warning(disable : 4101)
1594 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1595 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1596#if defined(_MSC_VER)
1601 binaryfunc slot2 = NULL;
1606 slot2 = PyFloat_Type.tp_as_number->nb_floor_divide;
1609 if (slot2 != NULL) {
1610 PyObject *x = slot2(operand1, operand2);
1612 if (x != Py_NotImplemented) {
1614 goto exit_binary_result_object;
1617 Py_DECREF_IMMORTAL(x);
1622#if PYTHON_VERSION < 0x300
1623 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: 'long' and 'float'");
1625 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: 'int' and 'float'");
1627 goto exit_binary_exception;
1629exit_binary_result_object:
1632exit_binary_exception:
1636PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_LONG_FLOAT(PyObject *operand1, PyObject *operand2) {
1637 return _BINARY_OPERATION_FLOORDIV_OBJECT_LONG_FLOAT(operand1, operand2);
1640#if PYTHON_VERSION < 0x300
1642static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_INT(PyObject *operand1, PyObject *operand2) {
1643 CHECK_OBJECT(operand1);
1644 assert(PyFloat_CheckExact(operand1));
1645 CHECK_OBJECT(operand2);
1646 assert(PyInt_CheckExact(operand2));
1648#if defined(_MSC_VER)
1649#pragma warning(push)
1650#pragma warning(disable : 4101)
1652 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1653 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1654#if defined(_MSC_VER)
1658 binaryfunc slot1 = PyFloat_Type.tp_as_number->nb_floor_divide;
1661 if (slot1 != NULL) {
1662 PyObject *x = slot1(operand1, operand2);
1664 if (x != Py_NotImplemented) {
1666 goto exit_binary_result_object;
1669 Py_DECREF_IMMORTAL(x);
1674 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: 'float' and 'int'");
1675 goto exit_binary_exception;
1677exit_binary_result_object:
1680exit_binary_exception:
1684PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_INT(PyObject *operand1, PyObject *operand2) {
1685 return _BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_INT(operand1, operand2);
1689#if PYTHON_VERSION < 0x300
1691static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_INT_FLOAT(PyObject *operand1, PyObject *operand2) {
1692 CHECK_OBJECT(operand1);
1693 assert(PyInt_CheckExact(operand1));
1694 CHECK_OBJECT(operand2);
1695 assert(PyFloat_CheckExact(operand2));
1697#if defined(_MSC_VER)
1698#pragma warning(push)
1699#pragma warning(disable : 4101)
1701 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1702 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1703#if defined(_MSC_VER)
1708 binaryfunc slot2 = NULL;
1713 slot2 = PyFloat_Type.tp_as_number->nb_floor_divide;
1716 if (slot2 != NULL) {
1717 PyObject *x = slot2(operand1, operand2);
1719 if (x != Py_NotImplemented) {
1721 goto exit_binary_result_object;
1724 Py_DECREF_IMMORTAL(x);
1729 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: 'int' and 'float'");
1730 goto exit_binary_exception;
1732exit_binary_result_object:
1735exit_binary_exception:
1739PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_INT_FLOAT(PyObject *operand1, PyObject *operand2) {
1740 return _BINARY_OPERATION_FLOORDIV_OBJECT_INT_FLOAT(operand1, operand2);
1744#if PYTHON_VERSION < 0x300
1746static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_LONG_INT(PyObject *operand1, PyObject *operand2) {
1747 CHECK_OBJECT(operand1);
1748 assert(PyLong_CheckExact(operand1));
1749 CHECK_OBJECT(operand2);
1750 assert(PyInt_CheckExact(operand2));
1752#if defined(_MSC_VER)
1753#pragma warning(push)
1754#pragma warning(disable : 4101)
1756 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1757 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1758#if defined(_MSC_VER)
1762 binaryfunc slot1 = PyLong_Type.tp_as_number->nb_floor_divide;
1765 if (slot1 != NULL) {
1766 PyObject *x = slot1(operand1, operand2);
1768 if (x != Py_NotImplemented) {
1770 goto exit_binary_result_object;
1773 Py_DECREF_IMMORTAL(x);
1778 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: 'long' and 'int'");
1779 goto exit_binary_exception;
1781exit_binary_result_object:
1784exit_binary_exception:
1788PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_LONG_INT(PyObject *operand1, PyObject *operand2) {
1789 return _BINARY_OPERATION_FLOORDIV_OBJECT_LONG_INT(operand1, operand2);
1793#if PYTHON_VERSION < 0x300
1795static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_INT_LONG(PyObject *operand1, PyObject *operand2) {
1796 CHECK_OBJECT(operand1);
1797 assert(PyInt_CheckExact(operand1));
1798 CHECK_OBJECT(operand2);
1799 assert(PyLong_CheckExact(operand2));
1801#if defined(_MSC_VER)
1802#pragma warning(push)
1803#pragma warning(disable : 4101)
1805 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1806 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1807#if defined(_MSC_VER)
1812 binaryfunc slot2 = NULL;
1817 slot2 = PyLong_Type.tp_as_number->nb_floor_divide;
1820 if (slot2 != NULL) {
1821 PyObject *x = slot2(operand1, operand2);
1823 if (x != Py_NotImplemented) {
1825 goto exit_binary_result_object;
1828 Py_DECREF_IMMORTAL(x);
1833 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: 'int' and 'long'");
1834 goto exit_binary_exception;
1836exit_binary_result_object:
1839exit_binary_exception:
1843PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_INT_LONG(PyObject *operand1, PyObject *operand2) {
1844 return _BINARY_OPERATION_FLOORDIV_OBJECT_INT_LONG(operand1, operand2);
1848#if PYTHON_VERSION < 0x300
1850static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_INT_CLONG(PyObject *operand1,
long operand2) {
1851 CHECK_OBJECT(operand1);
1852 assert(PyInt_CheckExact(operand1));
1857#if defined(_MSC_VER)
1858#pragma warning(push)
1859#pragma warning(disable : 4101)
1861 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1862 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1863 NUITKA_MAY_BE_UNUSED
long clong_result;
1864 NUITKA_MAY_BE_UNUSED
double cfloat_result;
1865#if defined(_MSC_VER)
1869 CHECK_OBJECT(operand1);
1870 assert(PyInt_CheckExact(operand1));
1872 const long a = PyInt_AS_LONG(operand1);
1873 const long b = operand2;
1875 if (unlikely(b == 0)) {
1876 PyThreadState *tstate = PyThreadState_GET();
1878 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ZeroDivisionError,
"integer division or modulo by zero");
1879 goto exit_result_exception;
1888 if (likely(b != -1 || !UNARY_NEG_WOULD_OVERFLOW(a))) {
1889 long a_div_b = a / b;
1890 long a_mod_b = (long)(a - (
unsigned long)a_div_b * b);
1892 if (a_mod_b && (b ^ a_mod_b) < 0) {
1897 clong_result = a_div_b;
1898 goto exit_result_ok_clong;
1902 PyObject *operand1_object = operand1;
1903 PyObject *operand2_object = Nuitka_PyLong_FromLong(operand2);
1905 PyObject *r = PyLong_Type.tp_as_number->nb_floor_divide(operand1_object, operand2_object);
1906 assert(r != Py_NotImplemented);
1908 Py_DECREF(operand2_object);
1911 goto exit_result_object;
1914exit_result_ok_clong:
1915 result = Nuitka_PyInt_FromLong(clong_result);
1916 goto exit_result_ok;
1919 if (unlikely(obj_result == NULL)) {
1920 goto exit_result_exception;
1922 result = obj_result;
1923 goto exit_result_ok;
1928exit_result_exception:
1932PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_INT_CLONG(PyObject *operand1,
long operand2) {
1933 return _BINARY_OPERATION_FLOORDIV_OBJECT_INT_CLONG(operand1, operand2);
1937#if PYTHON_VERSION < 0x300
1939static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_CLONG_INT(
long operand1, PyObject *operand2) {
1941 CHECK_OBJECT(operand2);
1942 assert(PyInt_CheckExact(operand2));
1947#if defined(_MSC_VER)
1948#pragma warning(push)
1949#pragma warning(disable : 4101)
1951 NUITKA_MAY_BE_UNUSED
bool cbool_result;
1952 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1953 NUITKA_MAY_BE_UNUSED
long clong_result;
1954 NUITKA_MAY_BE_UNUSED
double cfloat_result;
1955#if defined(_MSC_VER)
1959 CHECK_OBJECT(operand2);
1960 assert(PyInt_CheckExact(operand2));
1962 const long a = operand1;
1963 const long b = PyInt_AS_LONG(operand2);
1965 if (unlikely(b == 0)) {
1966 PyThreadState *tstate = PyThreadState_GET();
1968 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ZeroDivisionError,
"integer division or modulo by zero");
1969 goto exit_result_exception;
1978 if (likely(b != -1 || !UNARY_NEG_WOULD_OVERFLOW(a))) {
1979 long a_div_b = a / b;
1980 long a_mod_b = (long)(a - (
unsigned long)a_div_b * b);
1982 if (a_mod_b && (b ^ a_mod_b) < 0) {
1987 clong_result = a_div_b;
1988 goto exit_result_ok_clong;
1992 PyObject *operand1_object = Nuitka_PyLong_FromLong(operand1);
1993 PyObject *operand2_object = operand2;
1995 PyObject *r = PyLong_Type.tp_as_number->nb_floor_divide(operand1_object, operand2_object);
1996 assert(r != Py_NotImplemented);
1998 Py_DECREF(operand1_object);
2001 goto exit_result_object;
2004exit_result_ok_clong:
2005 result = Nuitka_PyInt_FromLong(clong_result);
2006 goto exit_result_ok;
2009 if (unlikely(obj_result == NULL)) {
2010 goto exit_result_exception;
2012 result = obj_result;
2013 goto exit_result_ok;
2018exit_result_exception:
2022PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_CLONG_INT(
long operand1, PyObject *operand2) {
2023 return _BINARY_OPERATION_FLOORDIV_OBJECT_CLONG_INT(operand1, operand2);
2028static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_CFLOAT(PyObject *operand1,
double operand2) {
2029 CHECK_OBJECT(operand1);
2030 assert(PyFloat_CheckExact(operand1));
2034#if defined(_MSC_VER)
2035#pragma warning(push)
2036#pragma warning(disable : 4101)
2039 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2040 NUITKA_MAY_BE_UNUSED
long clong_result;
2041 NUITKA_MAY_BE_UNUSED
double cfloat_result;
2042#if defined(_MSC_VER)
2046 CHECK_OBJECT(operand1);
2047 assert(PyFloat_CheckExact(operand1));
2049 const double a = PyFloat_AS_DOUBLE(operand1);
2050 const double b = operand2;
2052 if (unlikely(b == 0)) {
2053 PyThreadState *tstate = PyThreadState_GET();
2055 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ZeroDivisionError,
"integer division or modulo by zero");
2056 goto exit_result_exception;
2060 double mod = fmod(a, b);
2061 double div = (a - mod) / b;
2064 if ((a < 0) != (mod < 0)) {
2071 floordiv = floor(div);
2072 if (div - floordiv > 0.5) {
2076 floordiv = copysign(0.0, a / b);
2079 cfloat_result = floordiv;
2080 goto exit_result_ok_cfloat;
2083exit_result_ok_cfloat:
2084 result = MAKE_FLOAT_FROM_DOUBLE(cfloat_result);
2085 goto exit_result_ok;
2090exit_result_exception:
2094PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_CFLOAT(PyObject *operand1,
double operand2) {
2095 return _BINARY_OPERATION_FLOORDIV_OBJECT_FLOAT_CFLOAT(operand1, operand2);
2099static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_CFLOAT_FLOAT(
double operand1, PyObject *operand2) {
2101 CHECK_OBJECT(operand2);
2102 assert(PyFloat_CheckExact(operand2));
2106#if defined(_MSC_VER)
2107#pragma warning(push)
2108#pragma warning(disable : 4101)
2111 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2112 NUITKA_MAY_BE_UNUSED
long clong_result;
2113 NUITKA_MAY_BE_UNUSED
double cfloat_result;
2114#if defined(_MSC_VER)
2118 CHECK_OBJECT(operand2);
2119 assert(PyFloat_CheckExact(operand2));
2121 const double a = operand1;
2122 const double b = PyFloat_AS_DOUBLE(operand2);
2124 if (unlikely(b == 0)) {
2125 PyThreadState *tstate = PyThreadState_GET();
2127 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ZeroDivisionError,
"integer division or modulo by zero");
2128 goto exit_result_exception;
2132 double mod = fmod(a, b);
2133 double div = (a - mod) / b;
2136 if ((a < 0) != (mod < 0)) {
2143 floordiv = floor(div);
2144 if (div - floordiv > 0.5) {
2148 floordiv = copysign(0.0, a / b);
2151 cfloat_result = floordiv;
2152 goto exit_result_ok_cfloat;
2155exit_result_ok_cfloat:
2156 result = MAKE_FLOAT_FROM_DOUBLE(cfloat_result);
2157 goto exit_result_ok;
2162exit_result_exception:
2166PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_CFLOAT_FLOAT(
double operand1, PyObject *operand2) {
2167 return _BINARY_OPERATION_FLOORDIV_OBJECT_CFLOAT_FLOAT(operand1, operand2);
2171static PyObject *_BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_OBJECT(PyObject *operand1, PyObject *operand2) {
2172 CHECK_OBJECT(operand1);
2173 CHECK_OBJECT(operand2);
2175#if PYTHON_VERSION < 0x300
2176 if (PyInt_CheckExact(operand1) && PyInt_CheckExact(operand2)) {
2180#if defined(_MSC_VER)
2181#pragma warning(push)
2182#pragma warning(disable : 4101)
2184 NUITKA_MAY_BE_UNUSED
bool cbool_result;
2185 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2186 NUITKA_MAY_BE_UNUSED
long clong_result;
2187 NUITKA_MAY_BE_UNUSED
double cfloat_result;
2188#if defined(_MSC_VER)
2192 CHECK_OBJECT(operand1);
2193 assert(PyInt_CheckExact(operand1));
2194 CHECK_OBJECT(operand2);
2195 assert(PyInt_CheckExact(operand2));
2197 const long a = PyInt_AS_LONG(operand1);
2198 const long b = PyInt_AS_LONG(operand2);
2200 if (unlikely(b == 0)) {
2201 PyThreadState *tstate = PyThreadState_GET();
2203 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ZeroDivisionError,
"integer division or modulo by zero");
2204 goto exit_result_exception;
2213 if (likely(b != -1 || !UNARY_NEG_WOULD_OVERFLOW(a))) {
2214 long a_div_b = a / b;
2215 long a_mod_b = (long)(a - (
unsigned long)a_div_b * b);
2217 if (a_mod_b && (b ^ a_mod_b) < 0) {
2222 clong_result = a_div_b;
2223 goto exit_result_ok_clong;
2227 PyObject *operand1_object = operand1;
2228 PyObject *operand2_object = operand2;
2230 PyObject *r = PyLong_Type.tp_as_number->nb_floor_divide(operand1_object, operand2_object);
2231 assert(r != Py_NotImplemented);
2234 goto exit_result_object;
2237 exit_result_ok_clong:
2238 result = Nuitka_PyInt_FromLong(clong_result);
2239 goto exit_result_ok;
2242 if (unlikely(obj_result == NULL)) {
2243 goto exit_result_exception;
2245 result = obj_result;
2246 goto exit_result_ok;
2251 exit_result_exception:
2256 PyTypeObject *type1 = Py_TYPE(operand1);
2257 PyTypeObject *type2 = Py_TYPE(operand2);
2259#if defined(_MSC_VER)
2260#pragma warning(push)
2261#pragma warning(disable : 4101)
2263 NUITKA_MAY_BE_UNUSED
bool cbool_result;
2264 NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2265#if defined(_MSC_VER)
2270 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_floor_divide : NULL;
2271 binaryfunc slot2 = NULL;
2273 if (!(type1 == type2)) {
2277 (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_floor_divide : NULL;
2279 if (slot1 == slot2) {
2284 if (slot1 != NULL) {
2285 if (slot2 != NULL) {
2286 if (Nuitka_Type_IsSubtype(type2, type1)) {
2287 PyObject *x = slot2(operand1, operand2);
2289 if (x != Py_NotImplemented) {
2291 goto exit_binary_result_object;
2294 Py_DECREF_IMMORTAL(x);
2299 PyObject *x = slot1(operand1, operand2);
2301 if (x != Py_NotImplemented) {
2303 goto exit_binary_result_object;
2306 Py_DECREF_IMMORTAL(x);
2309 if (slot2 != NULL) {
2310 PyObject *x = slot2(operand1, operand2);
2312 if (x != Py_NotImplemented) {
2314 goto exit_binary_result_object;
2317 Py_DECREF_IMMORTAL(x);
2320#if PYTHON_VERSION < 0x300
2321 if (!NEW_STYLE_NUMBER_TYPE(type1) || !NEW_STYLE_NUMBER_TYPE(type2)) {
2323 (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_coerce : NULL;
2326 PyObject *coerced1 = operand1;
2327 PyObject *coerced2 = operand2;
2329 int err = c1(&coerced1, &coerced2);
2331 if (unlikely(err < 0)) {
2332 goto exit_binary_exception;
2336 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
2338 if (likely(mv == NULL)) {
2339 binaryfunc slot = mv->nb_floor_divide;
2341 if (likely(slot != NULL)) {
2342 PyObject *x = slot(coerced1, coerced2);
2344 Py_DECREF(coerced1);
2345 Py_DECREF(coerced2);
2348 goto exit_binary_result_object;
2353 Py_DECREF(coerced1);
2354 Py_DECREF(coerced2);
2358 (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_coerce : NULL;
2361 PyObject *coerced1 = operand1;
2362 PyObject *coerced2 = operand2;
2364 int err = c2(&coerced2, &coerced1);
2366 if (unlikely(err < 0)) {
2367 goto exit_binary_exception;
2371 PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
2373 if (likely(mv == NULL)) {
2374 binaryfunc slot = mv->nb_floor_divide;
2376 if (likely(slot != NULL)) {
2377 PyObject *x = slot(coerced1, coerced2);
2379 Py_DECREF(coerced1);
2380 Py_DECREF(coerced2);
2383 goto exit_binary_result_object;
2388 Py_DECREF(coerced1);
2389 Py_DECREF(coerced2);
2395 PyErr_Format(PyExc_TypeError,
"unsupported operand type(s) for //: '%s' and '%s'", type1->tp_name, type2->tp_name);
2396 goto exit_binary_exception;
2398exit_binary_result_object:
2401exit_binary_exception:
2405PyObject *BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_OBJECT(PyObject *operand1, PyObject *operand2) {
2406 return _BINARY_OPERATION_FLOORDIV_OBJECT_OBJECT_OBJECT(operand1, operand2);