The real suport for augmented assignment: new opcodes, new PyNumber and

PySequence methods and functions, new tokens.
This commit is contained in:
Thomas Wouters 2000-08-24 20:09:45 +00:00
parent e289e0bd0c
commit dd8dbdb717
6 changed files with 223 additions and 58 deletions

View 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);

View 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

View File

@ -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

View 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)

View 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 */

View 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 */