Mercurial > cpython-lru_cache-weakref
diff Python/ceval.c @ 409:b5fe6482072f legacy-trunk
Added shift and mask ops.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Thu, 24 Oct 1991 14:59:31 +0000 |
| parents | 0c5e4e137de6 |
| children | 90300ca21200 |
line wrap: on
line diff
--- a/Python/ceval.c Thu Oct 24 14:58:18 1991 +0000 +++ b/Python/ceval.c Thu Oct 24 14:59:31 1991 +0000 @@ -51,6 +51,12 @@ static object *neg(); static object *pos(); static object *not(); +static object *invert(); +static object *lshift(); +static object *rshift(); +static object *and(); +static object *xor(); +static object *or(); static object *call_builtin(); static object *call_function(); static object *apply_subscript(); @@ -273,6 +279,13 @@ DECREF(v); PUSH(x); break; + + case UNARY_INVERT: + v = POP(); + x = invert(v); + DECREF(v); + PUSH(x); + break; case BINARY_MULTIPLY: w = POP(); @@ -340,6 +353,51 @@ PUSH(x); break; + case BINARY_LSHIFT: + w = POP(); + v = POP(); + x = lshift(v, w); + DECREF(v); + DECREF(w); + PUSH(x); + break; + + case BINARY_RSHIFT: + w = POP(); + v = POP(); + x = rshift(v, w); + DECREF(v); + DECREF(w); + PUSH(x); + break; + + case BINARY_AND: + w = POP(); + v = POP(); + x = and(v, w); + DECREF(v); + DECREF(w); + PUSH(x); + break; + + case BINARY_XOR: + w = POP(); + v = POP(); + x = xor(v, w); + DECREF(v); + DECREF(w); + PUSH(x); + break; + + case BINARY_OR: + w = POP(); + v = POP(); + x = or(v, w); + DECREF(v); + DECREF(w); + PUSH(x); + break; + case SLICE+0: case SLICE+1: case SLICE+2: @@ -1002,6 +1060,106 @@ } static object * +or(v, w) + object *v, *w; +{ + if (v->ob_type->tp_as_number != NULL) { + object *x; + object * (*f) FPROTO((object *, object *)); + if (coerce(&v, &w) != 0) + return NULL; + if ((f = v->ob_type->tp_as_number->nb_or) != NULL) + x = (*f)(v, w); + DECREF(v); + DECREF(w); + if (f != NULL) + return x; + } + err_setstr(TypeError, "bad operand type(s) for |"); + return NULL; +} + +static object * +xor(v, w) + object *v, *w; +{ + if (v->ob_type->tp_as_number != NULL) { + object *x; + object * (*f) FPROTO((object *, object *)); + if (coerce(&v, &w) != 0) + return NULL; + if ((f = v->ob_type->tp_as_number->nb_xor) != NULL) + x = (*f)(v, w); + DECREF(v); + DECREF(w); + if (f != NULL) + return x; + } + err_setstr(TypeError, "bad operand type(s) for ^"); + return NULL; +} + +static object * +and(v, w) + object *v, *w; +{ + if (v->ob_type->tp_as_number != NULL) { + object *x; + object * (*f) FPROTO((object *, object *)); + if (coerce(&v, &w) != 0) + return NULL; + if ((f = v->ob_type->tp_as_number->nb_and) != NULL) + x = (*f)(v, w); + DECREF(v); + DECREF(w); + if (f != NULL) + return x; + } + err_setstr(TypeError, "bad operand type(s) for &"); + return NULL; +} + +static object * +lshift(v, w) + object *v, *w; +{ + if (v->ob_type->tp_as_number != NULL) { + object *x; + object * (*f) FPROTO((object *, object *)); + if (coerce(&v, &w) != 0) + return NULL; + if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL) + x = (*f)(v, w); + DECREF(v); + DECREF(w); + if (f != NULL) + return x; + } + err_setstr(TypeError, "bad operand type(s) for <<"); + return NULL; +} + +static object * +rshift(v, w) + object *v, *w; +{ + if (v->ob_type->tp_as_number != NULL) { + object *x; + object * (*f) FPROTO((object *, object *)); + if (coerce(&v, &w) != 0) + return NULL; + if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL) + x = (*f)(v, w); + DECREF(v); + DECREF(w); + if (f != NULL) + return x; + } + err_setstr(TypeError, "bad operand type(s) for >>"); + return NULL; +} + +static object * add(v, w) object *v, *w; { @@ -1128,6 +1286,18 @@ } static object * +invert(v) + object *v; +{ + object * (*f) FPROTO((object *, object *)); + if (v->ob_type->tp_as_number != NULL && + (f = v->ob_type->tp_as_number->nb_invert) != NULL) + return (*f)(v); + err_setstr(TypeError, "bad operand type(s) for unary ~"); + return NULL; +} + +static object * not(v) object *v; {
