mirror of
https://github.com/python/cpython.git
synced 2025-09-07 01:11:26 +00:00
Added shift and mask ops.
This commit is contained in:
parent
7a6dfa7d79
commit
7928cd7636
5 changed files with 426 additions and 45 deletions
170
Python/ceval.c
170
Python/ceval.c
|
@ -51,6 +51,12 @@ static object *rem();
|
|||
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 @@ eval_code(co, globals, locals, arg)
|
|||
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 @@ eval_code(co, globals, locals, arg)
|
|||
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:
|
||||
|
@ -1001,6 +1059,106 @@ testbool(v)
|
|||
return 1;
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -1127,6 +1285,18 @@ pos(v)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue