]> granicus.if.org Git - python/commitdiff
The real suport for augmented assignment: new opcodes, new PyNumber and
authorThomas Wouters <thomas@python.org>
Thu, 24 Aug 2000 20:09:45 +0000 (20:09 +0000)
committerThomas Wouters <thomas@python.org>
Thu, 24 Aug 2000 20:09:45 +0000 (20:09 +0000)
PySequence methods and functions, new tokens.

Include/abstract.h
Include/classobject.h
Include/graminit.h
Include/object.h
Include/opcode.h
Include/token.h

index fe1fa4bf2c8659eaa1ad26c970c7d0b25ff1ee52..9c18bbd42f5057cfdc7c0c728444130c740d1310 100644 (file)
@@ -664,6 +664,108 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
         float(o).
        */
         
+/*  In-place variants of (some of) the above number protocol functions */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceAdd(PyObject *o1, PyObject *o2);
+
+       /*
+        Returns the result of adding o2 to o1, possibly in-place, or null
+        on failure.  This is the equivalent of the Python expression:
+        o1 += o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceSubtract(PyObject *o1, PyObject *o2);
+
+       /*
+        Returns the result of subtracting o2 from o1, possibly in-place or
+        null on failure.  This is the equivalent of the Python expression:
+        o1 -= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceMultiply(PyObject *o1, PyObject *o2);
+
+       /*
+        Returns the result of multiplying o1 by o2, possibly in-place, or
+        null on failure.  This is the equivalent of the Python expression:
+        o1 *= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceDivide(PyObject *o1, PyObject *o2);
+
+       /*
+        Returns the result of dividing o1 by o2, possibly in-place, or null
+        on failure.  This is the equivalent of the Python expression:
+        o1 /= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2);
+
+       /*
+        Returns the remainder of dividing o1 by o2, possibly in-place, or
+        null on failure.  This is the equivalent of the Python expression:
+        o1 %= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlacePower(PyObject *o1, PyObject *o2,
+                                                PyObject *o3);
+
+       /*
+        Returns the result of raising o1 to the power of o2, possibly
+        in-place, or null on failure.  This is the equivalent of the Python
+        expression: o1 **= o2, or pow(o1, o2, o3) if o3 is present.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceLshift(PyObject *o1, PyObject *o2);
+
+       /*
+        Returns the result of left shifting o1 by o2, possibly in-place, or
+        null on failure.  This is the equivalent of the Python expression:
+        o1 <<= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceRshift(PyObject *o1, PyObject *o2);
+
+       /*
+        Returns the result of right shifting o1 by o2, possibly in-place or
+        null on failure.  This is the equivalent of the Python expression:
+        o1 >>= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceAnd(PyObject *o1, PyObject *o2);
+
+       /*
+        Returns the result of bitwise and of o1 and o2, possibly in-place,
+        or null on failure. This is the equivalent of the Python
+        expression: o1 &= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceXor(PyObject *o1, PyObject *o2);
+
+       /*
+        Returns the bitwise exclusive or of o1 by o2, possibly in-place, or
+        null on failure.  This is the equivalent of the Python expression:
+        o1 ^= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceOr(PyObject *o1, PyObject *o2);
+
+       /*
+        Returns the result of bitwise or or o1 and o2, possibly in-place,
+        or null on failure.  This is the equivalent of the Python
+        expression: o1 |= o2.
+
+       */
+
 
 /*  Sequence protocol:*/
 
@@ -824,6 +926,26 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
         expression: o.index(value).
        */
 
+/* In-place versions of some of the above Sequence functions. */
+
+     DL_IMPORT(PyObject *) PySequence_InPlaceConcat(PyObject *o1, PyObject *o2);
+
+       /*
+        Append o2 to o1, in-place when possible. Return the resulting
+        object, which could be o1, or NULL on failure.  This is the
+        equivalent of the Python expression: o1 += o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PySequence_InPlaceRepeat(PyObject *o, int count);
+
+       /*
+        Repeat o1 by count, in-place when possible. Return the resulting
+        object, which could be o1, or NULL on failure.  This is the
+        equivalent of the Python expression: o1 *= count.
+
+       */
+
 /*  Mapping protocol:*/
 
      DL_IMPORT(int) PyMapping_Check(PyObject *o);
index 2902e771e88c4b9fbc36d46de7bcd7945b40aadf..67416e49b29aeb404551ba4f0a872fc3397fda38 100644 (file)
@@ -73,6 +73,10 @@ extern DL_IMPORT(PyObject *) PyInstance_DoBinOp(PyObject *, PyObject *,
                                                 PyObject * (*)(PyObject *,
                                                                PyObject *));
 
+extern DL_IMPORT(int)
+PyInstance_HalfBinOp(PyObject *, PyObject *, char *, PyObject **,
+                       PyObject * (*)(PyObject *, PyObject *), int);
+
 #ifdef __cplusplus
 }
 #endif
index e0f2c2a39591d7a0eec1acb32829ae7e1d62ea2c..350df3522cae08df4d366500fecd7ce5a0f624ad 100644 (file)
 #define simple_stmt 265
 #define small_stmt 266
 #define expr_stmt 267
-#define print_stmt 268
-#define del_stmt 269
-#define pass_stmt 270
-#define flow_stmt 271
-#define break_stmt 272
-#define continue_stmt 273
-#define return_stmt 274
-#define raise_stmt 275
-#define import_stmt 276
-#define import_as_name 277
-#define dotted_as_name 278
-#define dotted_name 279
-#define global_stmt 280
-#define exec_stmt 281
-#define assert_stmt 282
-#define compound_stmt 283
-#define if_stmt 284
-#define while_stmt 285
-#define for_stmt 286
-#define try_stmt 287
-#define except_clause 288
-#define suite 289
-#define test 290
-#define and_test 291
-#define not_test 292
-#define comparison 293
-#define comp_op 294
-#define expr 295
-#define xor_expr 296
-#define and_expr 297
-#define shift_expr 298
-#define arith_expr 299
-#define term 300
-#define factor 301
-#define power 302
-#define atom 303
-#define listmaker 304
-#define lambdef 305
-#define trailer 306
-#define subscriptlist 307
-#define subscript 308
-#define sliceop 309
-#define exprlist 310
-#define testlist 311
-#define dictmaker 312
-#define classdef 313
-#define arglist 314
-#define argument 315
-#define list_iter 316
-#define list_for 317
-#define list_if 318
+#define augassign 268
+#define print_stmt 269
+#define del_stmt 270
+#define pass_stmt 271
+#define flow_stmt 272
+#define break_stmt 273
+#define continue_stmt 274
+#define return_stmt 275
+#define raise_stmt 276
+#define import_stmt 277
+#define import_as_name 278
+#define dotted_as_name 279
+#define dotted_name 280
+#define global_stmt 281
+#define exec_stmt 282
+#define assert_stmt 283
+#define compound_stmt 284
+#define if_stmt 285
+#define while_stmt 286
+#define for_stmt 287
+#define try_stmt 288
+#define except_clause 289
+#define suite 290
+#define test 291
+#define and_test 292
+#define not_test 293
+#define comparison 294
+#define comp_op 295
+#define expr 296
+#define xor_expr 297
+#define and_expr 298
+#define shift_expr 299
+#define arith_expr 300
+#define term 301
+#define factor 302
+#define power 303
+#define atom 304
+#define listmaker 305
+#define lambdef 306
+#define trailer 307
+#define subscriptlist 308
+#define subscript 309
+#define sliceop 310
+#define exprlist 311
+#define testlist 312
+#define dictmaker 313
+#define classdef 314
+#define arglist 315
+#define argument 316
+#define list_iter 317
+#define list_for 318
+#define list_if 319
index 72a52826042b00ddff191e1a881c668ccdf0a587..0cfa179e10a5466fe9c14aa4986b69f5fe141bea 100644 (file)
@@ -151,6 +151,17 @@ typedef struct {
        unaryfunc nb_float;
        unaryfunc nb_oct;
        unaryfunc nb_hex;
+       binaryfunc nb_inplace_add;
+       binaryfunc nb_inplace_subtract;
+       binaryfunc nb_inplace_multiply;
+       binaryfunc nb_inplace_divide;
+       binaryfunc nb_inplace_remainder;
+       ternaryfunc nb_inplace_power;
+       binaryfunc nb_inplace_lshift;
+       binaryfunc nb_inplace_rshift;
+       binaryfunc nb_inplace_and;
+       binaryfunc nb_inplace_xor;
+       binaryfunc nb_inplace_or;
 } PyNumberMethods;
 
 typedef struct {
@@ -162,6 +173,8 @@ typedef struct {
        intobjargproc sq_ass_item;
        intintobjargproc sq_ass_slice;
        objobjproc sq_contains;
+       binaryfunc sq_inplace_concat;
+       intargfunc sq_inplace_repeat;
 } PySequenceMethods;
 
 typedef struct {
@@ -315,8 +328,12 @@ given type object has a specified feature.
 #define Py_TPFLAGS_GC 0
 #endif
 
+/* PySequenceMethods and PyNumberMethods contain in-place operators */
+#define Py_TPFLAGS_HAVE_INPLACEOPS (1L<<3)
+
 #define Py_TPFLAGS_DEFAULT  (Py_TPFLAGS_HAVE_GETCHARBUFFER | \
-                             Py_TPFLAGS_HAVE_SEQUENCE_IN)
+                             Py_TPFLAGS_HAVE_SEQUENCE_IN | \
+                             Py_TPFLAGS_HAVE_INPLACEOPS)
 
 #define PyType_HasFeature(t,f)  (((t)->tp_flags & (f)) != 0)
 
index f900aa958636bd92f701ba02de49c018f03f3886..d46e5b8fde03c11a906fe6b5e4e65e723fec0141 100644 (file)
@@ -21,6 +21,7 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 #define ROT_TWO                2
 #define ROT_THREE      3
 #define DUP_TOP                4
+#define ROT_FOUR       5
 
 #define UNARY_POSITIVE 10
 #define UNARY_NEGATIVE 11
@@ -47,6 +48,11 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 #define DELETE_SLICE   50
 /* Also uses 51-53 */
 
+#define INPLACE_ADD    55
+#define INPLACE_SUBTRACT       56
+#define INPLACE_MULTIPLY       57
+#define INPLACE_DIVIDE 58
+#define INPLACE_MODULO 59
 #define STORE_SUBSCR   60
 #define DELETE_SUBSCR  61
 
@@ -55,14 +61,18 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 #define BINARY_AND     64
 #define BINARY_XOR     65
 #define BINARY_OR      66
-
+#define INPLACE_POWER  67
 
 #define PRINT_EXPR     70
 #define PRINT_ITEM     71
 #define PRINT_NEWLINE  72
 #define PRINT_ITEM_TO   73
 #define PRINT_NEWLINE_TO 74
-
+#define INPLACE_LSHIFT 75
+#define INPLACE_RSHIFT 76
+#define INPLACE_AND    77
+#define INPLACE_XOR    78
+#define INPLACE_OR     79
 #define BREAK_LOOP     80
 
 #define LOAD_LOCALS    82
@@ -84,7 +94,7 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 #define DELETE_ATTR    96      /* "" */
 #define STORE_GLOBAL   97      /* "" */
 #define DELETE_GLOBAL  98      /* "" */
-
+#define DUP_TOPX       99      /* number of items to duplicate */
 #define LOAD_CONST     100     /* Index in const list */
 #define LOAD_NAME      101     /* Index in name list */
 #define BUILD_TUPLE    102     /* Number of tuple items */
index 88ef3fcb6c04b9db6fb1318f2e8f1dee796690a8..d6bdc85cee832e459b57ce97c959bbec989398e6 100644 (file)
@@ -53,10 +53,21 @@ extern "C" {
 #define LEFTSHIFT      34
 #define RIGHTSHIFT     35
 #define DOUBLESTAR     36
+#define PLUSEQUAL      37
+#define MINEQUAL       38
+#define STAREQUAL      39
+#define SLASHEQUAL     40
+#define PERCENTEQUAL   41
+#define AMPEREQUAL     42
+#define VBAREQUAL      43
+#define CIRCUMFLEXEQUAL        44
+#define LEFTSHIFTEQUAL 45
+#define RIGHTSHIFTEQUAL        46
+#define DOUBLESTAREQUAL        47
 /* Don't forget to update the table _PyParser_TokenNames in tokenizer.c! */
-#define OP             37
-#define ERRORTOKEN     38
-#define N_TOKENS       39
+#define OP             48
+#define ERRORTOKEN     49
+#define N_TOKENS       50
 
 /* Special definitions for cooperation with parser */