Python虚拟中的控制流(Python 源码剖析第十章)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 case COMPARE_OP:
2 w = POP();
3 v = TOP();
4 if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
5 /* INLINE: cmp(int, int) */
6 register long a, b;
7 register int res;
8 a = PyInt_AS_LONG(v);
9 b = PyInt_AS_LONG(w);
10 switch (oparg) {
11 case PyCmp_LT: res = a < b; break;
12 case PyCmp_LE: res = a <= b; break;
13 case PyCmp_EQ: res = a == b; break;
14 case PyCmp_NE: res = a != b; break;
15 case PyCmp_GT: res = a > b; break;
16 case PyCmp_GE: res = a >= b; break;
17 case PyCmp_IS: res = v == w; break;
18 case PyCmp_IS_NOT: res = v != w; break;
19 default: goto slow_compare;
20 }
21 x = res ? Py_True : Py_False;
22 Py_INCREF(x);
23 }
24 else {
25 slow_compare:
26 x = cmp_outcome(oparg, v, w);
27 }
28 Py_DECREF(v);
29 Py_DECREF(w);
30 SET_TOP(x);
31 if (x == NULL) break;
32 PREDICT(POP_JUMP_IF_FALSE);
33 PREDICT(POP_JUMP_IF_TRUE);
34 continue;
2 w = POP();
3 v = TOP();
4 if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
5 /* INLINE: cmp(int, int) */
6 register long a, b;
7 register int res;
8 a = PyInt_AS_LONG(v);
9 b = PyInt_AS_LONG(w);
10 switch (oparg) {
11 case PyCmp_LT: res = a < b; break;
12 case PyCmp_LE: res = a <= b; break;
13 case PyCmp_EQ: res = a == b; break;
14 case PyCmp_NE: res = a != b; break;
15 case PyCmp_GT: res = a > b; break;
16 case PyCmp_GE: res = a >= b; break;
17 case PyCmp_IS: res = v == w; break;
18 case PyCmp_IS_NOT: res = v != w; break;
19 default: goto slow_compare;
20 }
21 x = res ? Py_True : Py_False;
22 Py_INCREF(x);
23 }
24 else {
25 slow_compare:
26 x = cmp_outcome(oparg, v, w);
27 }
28 Py_DECREF(v);
29 Py_DECREF(w);
30 SET_TOP(x);
31 if (x == NULL) break;
32 PREDICT(POP_JUMP_IF_FALSE);
33 PREDICT(POP_JUMP_IF_TRUE);
34 continue;