The real suport for augmented assignment: new opcodes, new PyNumber and
PySequence methods and functions, new tokens.
This commit is contained in:
parent
e289e0bd0c
commit
dd8dbdb717
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
Loading…
Reference in New Issue