summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Wouters <thomas@python.org>2000-08-24 20:09:45 (GMT)
committerThomas Wouters <thomas@python.org>2000-08-24 20:09:45 (GMT)
commitdd8dbdb7172fbafb5ffab8600e620103fc19879e (patch)
treed0706f5e94cb061057f85138e8637885c9f4cb57
parente289e0bd0c3db9755bb2ddd49b08091049bc301d (diff)
downloadcpython-dd8dbdb7172fbafb5ffab8600e620103fc19879e.zip
cpython-dd8dbdb7172fbafb5ffab8600e620103fc19879e.tar.gz
cpython-dd8dbdb7172fbafb5ffab8600e620103fc19879e.tar.bz2
The real suport for augmented assignment: new opcodes, new PyNumber and
PySequence methods and functions, new tokens.
-rw-r--r--Include/abstract.h122
-rw-r--r--Include/classobject.h4
-rw-r--r--Include/graminit.h103
-rw-r--r--Include/object.h19
-rw-r--r--Include/opcode.h16
-rw-r--r--Include/token.h17
6 files changed, 223 insertions, 58 deletions
diff --git a/Include/abstract.h b/Include/abstract.h
index fe1fa4b..9c18bbd 100644
--- a/Include/abstract.h
+++ b/Include/abstract.h
@@ -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);
diff --git a/Include/classobject.h b/Include/classobject.h
index 2902e77..67416e4 100644
--- a/Include/classobject.h
+++ b/Include/classobject.h
@@ -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
diff --git a/Include/graminit.h b/Include/graminit.h
index e0f2c2a..350df35 100644
--- a/Include/graminit.h
+++ b/Include/graminit.h
@@ -10,54 +10,55 @@
#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
diff --git a/Include/object.h b/Include/object.h
index 72a5282..0cfa179 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -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)
diff --git a/Include/opcode.h b/Include/opcode.h
index f900aa9..d46e5b8 100644
--- a/Include/opcode.h
+++ b/Include/opcode.h
@@ -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 */
diff --git a/Include/token.h b/Include/token.h
index 88ef3fc..d6bdc85 100644
--- a/Include/token.h
+++ b/Include/token.h
@@ -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 */