self.assertNotIn("_GUARD_TOS_INT", uops)
self.assertIn("_POP_TOP_NOP", uops)
+ def test_check_is_not_py_callable(self):
+ def testfunc(n):
+ total = 0
+ f = len
+ xs = (1, 2, 3)
+ for _ in range(n):
+ total += f(xs)
+ return total
+
+ res, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD)
+ self.assertEqual(res, 3 * TIER2_THRESHOLD)
+ self.assertIsNotNone(ex)
+ uops = get_opnames(ex)
+ self.assertNotIn("_CHECK_IS_NOT_PY_CALLABLE", uops)
+
def test_call_len_string(self):
def testfunc(n):
for _ in range(n):
(void)framesize;
}
+ op(_CHECK_IS_NOT_PY_CALLABLE, (callable, unused, unused[oparg] -- callable, unused, unused[oparg])) {
+ PyTypeObject *type = sym_get_type(callable);
+ if (type && type != &PyFunction_Type && type != &PyMethod_Type) {
+ ADD_OP(_NOP, 0, 0);
+ }
+ }
+
op(_PUSH_FRAME, (new_frame -- )) {
SYNC_SP();
if (!CURRENT_FRAME_IS_INIT_SHIM()) {
}
case _CHECK_IS_NOT_PY_CALLABLE: {
+ JitOptRef callable;
+ callable = stack_pointer[-2 - oparg];
+ PyTypeObject *type = sym_get_type(callable);
+ if (type && type != &PyFunction_Type && type != &PyMethod_Type) {
+ ADD_OP(_NOP, 0, 0);
+ }
break;
}