22
22
23
23
NPY_NO_EXPORT NumericOps n_ops ; /* NB: static objects initialized to zero */
24
24
25
+ /*
26
+ * Forward declarations. Might want to move functions around instead
27
+ */
28
+ static PyObject *
29
+ array_inplace_add (PyArrayObject * m1 , PyObject * m2 );
30
+ static PyObject *
31
+ array_inplace_subtract (PyArrayObject * m1 , PyObject * m2 );
32
+ static PyObject *
33
+ array_inplace_multiply (PyArrayObject * m1 , PyObject * m2 );
34
+ #if !defined(NPY_PY3K )
35
+ static PyObject *
36
+ array_inplace_divide (PyArrayObject * m1 , PyObject * m2 );
37
+ #endif
38
+ static PyObject *
39
+ array_inplace_true_divide (PyArrayObject * m1 , PyObject * m2 );
40
+ static PyObject *
41
+ array_inplace_floor_divide (PyArrayObject * m1 , PyObject * m2 );
42
+ static PyObject *
43
+ array_inplace_bitwise_and (PyArrayObject * m1 , PyObject * m2 );
44
+ static PyObject *
45
+ array_inplace_bitwise_or (PyArrayObject * m1 , PyObject * m2 );
46
+ static PyObject *
47
+ array_inplace_bitwise_xor (PyArrayObject * m1 , PyObject * m2 );
48
+ static PyObject *
49
+ array_inplace_left_shift (PyArrayObject * m1 , PyObject * m2 );
50
+ static PyObject *
51
+ array_inplace_right_shift (PyArrayObject * m1 , PyObject * m2 );
52
+ static PyObject *
53
+ array_inplace_remainder (PyArrayObject * m1 , PyObject * m2 );
54
+ static PyObject *
55
+ array_inplace_power (PyArrayObject * a1 , PyObject * o2 , PyObject * NPY_UNUSED (modulo ));
56
+
25
57
/*
26
58
* Dictionary can contain any of the numeric operations, by name.
27
59
* Those not present will not be changed
@@ -255,31 +287,6 @@ PyArray_GenericInplaceUnaryFunction(PyArrayObject *m1, PyObject *op)
255
287
return PyObject_CallFunctionObjArgs (op , m1 , m1 , NULL );
256
288
}
257
289
258
- static PyObject *
259
- array_inplace_add (PyArrayObject * m1 , PyObject * m2 );
260
- static PyObject *
261
- array_inplace_subtract (PyArrayObject * m1 , PyObject * m2 );
262
- static PyObject *
263
- array_inplace_multiply (PyArrayObject * m1 , PyObject * m2 );
264
- #if !defined(NPY_PY3K )
265
- static PyObject *
266
- array_inplace_divide (PyArrayObject * m1 , PyObject * m2 );
267
- #endif
268
- static PyObject *
269
- array_inplace_true_divide (PyArrayObject * m1 , PyObject * m2 );
270
- static PyObject *
271
- array_inplace_floor_divide (PyArrayObject * m1 , PyObject * m2 );
272
- static PyObject *
273
- array_inplace_bitwise_and (PyArrayObject * m1 , PyObject * m2 );
274
- static PyObject *
275
- array_inplace_bitwise_or (PyArrayObject * m1 , PyObject * m2 );
276
- static PyObject *
277
- array_inplace_bitwise_xor (PyArrayObject * m1 , PyObject * m2 );
278
- static PyObject *
279
- array_inplace_left_shift (PyArrayObject * m1 , PyObject * m2 );
280
- static PyObject *
281
- array_inplace_right_shift (PyArrayObject * m1 , PyObject * m2 );
282
-
283
290
static PyObject *
284
291
array_add (PyArrayObject * m1 , PyObject * m2 )
285
292
{
@@ -628,32 +635,42 @@ array_bitwise_xor(PyArrayObject *m1, PyObject *m2)
628
635
static PyObject *
629
636
array_inplace_add (PyArrayObject * m1 , PyObject * m2 )
630
637
{
638
+ INPLACE_GIVE_UP_IF_NEEDED (
639
+ m1 , m2 , nb_inplace_add , array_inplace_add );
631
640
return PyArray_GenericInplaceBinaryFunction (m1 , m2 , n_ops .add );
632
641
}
633
642
634
643
static PyObject *
635
644
array_inplace_subtract (PyArrayObject * m1 , PyObject * m2 )
636
645
{
646
+ INPLACE_GIVE_UP_IF_NEEDED (
647
+ m1 , m2 , nb_inplace_subtract , array_inplace_subtract );
637
648
return PyArray_GenericInplaceBinaryFunction (m1 , m2 , n_ops .subtract );
638
649
}
639
650
640
651
static PyObject *
641
652
array_inplace_multiply (PyArrayObject * m1 , PyObject * m2 )
642
653
{
654
+ INPLACE_GIVE_UP_IF_NEEDED (
655
+ m1 , m2 , nb_inplace_multiply , array_inplace_multiply );
643
656
return PyArray_GenericInplaceBinaryFunction (m1 , m2 , n_ops .multiply );
644
657
}
645
658
646
659
#if !defined(NPY_PY3K )
647
660
static PyObject *
648
661
array_inplace_divide (PyArrayObject * m1 , PyObject * m2 )
649
662
{
663
+ INPLACE_GIVE_UP_IF_NEEDED (
664
+ m1 , m2 , nb_inplace_divide , array_inplace_divide );
650
665
return PyArray_GenericInplaceBinaryFunction (m1 , m2 , n_ops .divide );
651
666
}
652
667
#endif
653
668
654
669
static PyObject *
655
670
array_inplace_remainder (PyArrayObject * m1 , PyObject * m2 )
656
671
{
672
+ INPLACE_GIVE_UP_IF_NEEDED (
673
+ m1 , m2 , nb_inplace_remainder , array_inplace_remainder );
657
674
return PyArray_GenericInplaceBinaryFunction (m1 , m2 , n_ops .remainder );
658
675
}
659
676
@@ -662,6 +679,9 @@ array_inplace_power(PyArrayObject *a1, PyObject *o2, PyObject *NPY_UNUSED(modulo
662
679
{
663
680
/* modulo is ignored! */
664
681
PyObject * value ;
682
+
683
+ INPLACE_GIVE_UP_IF_NEEDED (
684
+ a1 , o2 , nb_inplace_power , array_inplace_power );
665
685
value = fast_scalar_power (a1 , o2 , 1 );
666
686
if (!value ) {
667
687
value = PyArray_GenericInplaceBinaryFunction (a1 , o2 , n_ops .power );
@@ -672,30 +692,40 @@ array_inplace_power(PyArrayObject *a1, PyObject *o2, PyObject *NPY_UNUSED(modulo
672
692
static PyObject *
673
693
array_inplace_left_shift (PyArrayObject * m1 , PyObject * m2 )
674
694
{
695
+ INPLACE_GIVE_UP_IF_NEEDED (
696
+ m1 , m2 , nb_inplace_lshift , array_inplace_left_shift );
675
697
return PyArray_GenericInplaceBinaryFunction (m1 , m2 , n_ops .left_shift );
676
698
}
677
699
678
700
static PyObject *
679
701
array_inplace_right_shift (PyArrayObject * m1 , PyObject * m2 )
680
702
{
703
+ INPLACE_GIVE_UP_IF_NEEDED (
704
+ m1 , m2 , nb_inplace_rshift , array_inplace_right_shift );
681
705
return PyArray_GenericInplaceBinaryFunction (m1 , m2 , n_ops .right_shift );
682
706
}
683
707
684
708
static PyObject *
685
709
array_inplace_bitwise_and (PyArrayObject * m1 , PyObject * m2 )
686
710
{
711
+ INPLACE_GIVE_UP_IF_NEEDED (
712
+ m1 , m2 , nb_inplace_and , array_inplace_bitwise_and );
687
713
return PyArray_GenericInplaceBinaryFunction (m1 , m2 , n_ops .bitwise_and );
688
714
}
689
715
690
716
static PyObject *
691
717
array_inplace_bitwise_or (PyArrayObject * m1 , PyObject * m2 )
692
718
{
719
+ INPLACE_GIVE_UP_IF_NEEDED (
720
+ m1 , m2 , nb_inplace_or , array_inplace_bitwise_or );
693
721
return PyArray_GenericInplaceBinaryFunction (m1 , m2 , n_ops .bitwise_or );
694
722
}
695
723
696
724
static PyObject *
697
725
array_inplace_bitwise_xor (PyArrayObject * m1 , PyObject * m2 )
698
726
{
727
+ INPLACE_GIVE_UP_IF_NEEDED (
728
+ m1 , m2 , nb_inplace_xor , array_inplace_bitwise_xor );
699
729
return PyArray_GenericInplaceBinaryFunction (m1 , m2 , n_ops .bitwise_xor );
700
730
}
701
731
@@ -728,13 +758,17 @@ array_true_divide(PyArrayObject *m1, PyObject *m2)
728
758
static PyObject *
729
759
array_inplace_floor_divide (PyArrayObject * m1 , PyObject * m2 )
730
760
{
761
+ INPLACE_GIVE_UP_IF_NEEDED (
762
+ m1 , m2 , nb_inplace_floor_divide , array_inplace_floor_divide );
731
763
return PyArray_GenericInplaceBinaryFunction (m1 , m2 ,
732
764
n_ops .floor_divide );
733
765
}
734
766
735
767
static PyObject *
736
768
array_inplace_true_divide (PyArrayObject * m1 , PyObject * m2 )
737
769
{
770
+ INPLACE_GIVE_UP_IF_NEEDED (
771
+ m1 , m2 , nb_inplace_true_divide , array_inplace_true_divide );
738
772
return PyArray_GenericInplaceBinaryFunction (m1 , m2 ,
739
773
n_ops .true_divide );
740
774
}
@@ -754,8 +788,8 @@ _array_nonzero(PyArrayObject *mp)
754
788
}
755
789
else {
756
790
PyErr_SetString (PyExc_ValueError ,
757
- "The truth value of an array " \
758
- "with more than one element is ambiguous. " \
791
+ "The truth value of an array "
792
+ "with more than one element is ambiguous. "
759
793
"Use a.any() or a.all()" );
760
794
return -1 ;
761
795
}
@@ -1060,19 +1094,19 @@ NPY_NO_EXPORT PyNumberMethods array_as_number = {
1060
1094
* This code adds augmented assignment functionality
1061
1095
* that was made available in Python 2.0
1062
1096
*/
1063
- (binaryfunc )array_inplace_add , /*inplace_add */
1064
- (binaryfunc )array_inplace_subtract , /*inplace_subtract */
1065
- (binaryfunc )array_inplace_multiply , /*inplace_multiply */
1097
+ (binaryfunc )array_inplace_add , /*nb_inplace_add */
1098
+ (binaryfunc )array_inplace_subtract , /*nb_inplace_subtract */
1099
+ (binaryfunc )array_inplace_multiply , /*nb_inplace_multiply */
1066
1100
#if !defined (NPY_PY3K )
1067
- (binaryfunc )array_inplace_divide , /*inplace_divide */
1101
+ (binaryfunc )array_inplace_divide , /*nb_inplace_divide */
1068
1102
#endif
1069
- (binaryfunc )array_inplace_remainder , /*inplace_remainder */
1070
- (ternaryfunc )array_inplace_power , /*inplace_power */
1071
- (binaryfunc )array_inplace_left_shift , /*inplace_lshift */
1072
- (binaryfunc )array_inplace_right_shift , /*inplace_rshift */
1073
- (binaryfunc )array_inplace_bitwise_and , /*inplace_and */
1074
- (binaryfunc )array_inplace_bitwise_xor , /*inplace_xor */
1075
- (binaryfunc )array_inplace_bitwise_or , /*inplace_or */
1103
+ (binaryfunc )array_inplace_remainder , /*nb_inplace_remainder */
1104
+ (ternaryfunc )array_inplace_power , /*nb_inplace_power */
1105
+ (binaryfunc )array_inplace_left_shift , /*nb_inplace_lshift */
1106
+ (binaryfunc )array_inplace_right_shift , /*nb_inplace_rshift */
1107
+ (binaryfunc )array_inplace_bitwise_and , /*nb_inplace_and */
1108
+ (binaryfunc )array_inplace_bitwise_xor , /*nb_inplace_xor */
1109
+ (binaryfunc )array_inplace_bitwise_or , /*nb_inplace_or */
1076
1110
1077
1111
(binaryfunc )array_floor_divide , /*nb_floor_divide*/
1078
1112
(binaryfunc )array_true_divide , /*nb_true_divide*/
0 commit comments