/* For now we hard-code this to a value for which we are confident
all the static builtin types will fit (for all builds). */
-#define _Py_MAX_MANAGED_STATIC_BUILTIN_TYPES 200
+#define _Py_MAX_MANAGED_STATIC_BUILTIN_TYPES 201
#define _Py_MAX_MANAGED_STATIC_EXT_TYPES 10
#define _Py_MAX_MANAGED_STATIC_TYPES \
(_Py_MAX_MANAGED_STATIC_BUILTIN_TYPES + _Py_MAX_MANAGED_STATIC_EXT_TYPES)
self.assert_specialized(contains_op_dict, "CONTAINS_OP_DICT")
self.assert_no_opcode(contains_op_dict, "CONTAINS_OP")
+ def contains_op_frozen_dict():
+ for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
+ a, b = 1, frozendict({1: 2, 2: 5})
+ self.assertTrue(a in b)
+ self.assertFalse(3 in b)
+
+ contains_op_frozen_dict()
+ self.assert_specialized(contains_op_frozen_dict, "CONTAINS_OP_DICT")
+ self.assert_no_opcode(contains_op_frozen_dict, "CONTAINS_OP")
+
+ def contains_op_frozen_dict_subclass():
+ class MyFrozenDict(frozendict):
+ pass
+ for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
+ a, b = 1, MyFrozenDict({1: 2, 2: 5})
+ self.assertTrue(a in b)
+ self.assertFalse(3 in b)
+
+ contains_op_frozen_dict_subclass()
+ self.assert_no_opcode(contains_op_frozen_dict_subclass, "CONTAINS_OP_DICT")
+
def contains_op_set():
for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
a, b = 1, {1, 2}
self.assert_specialized(binary_subscr_dict, "BINARY_OP_SUBSCR_DICT")
self.assert_no_opcode(binary_subscr_dict, "BINARY_OP")
+ def binary_subscr_frozen_dict():
+ for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
+ a = frozendict({1: 2, 2: 3})
+ self.assertEqual(a[1], 2)
+ self.assertEqual(a[2], 3)
+
+ binary_subscr_frozen_dict()
+ self.assert_specialized(binary_subscr_frozen_dict, "BINARY_OP_SUBSCR_DICT")
+ self.assert_no_opcode(binary_subscr_frozen_dict, "BINARY_OP")
+
+ def binary_subscr_frozen_dict_subclass():
+ class MyFrozenDict(frozendict):
+ pass
+ for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
+ a = MyFrozenDict({1: 2, 2: 3})
+ self.assertEqual(a[1], 2)
+ self.assertEqual(a[2], 3)
+
+ binary_subscr_frozen_dict_subclass()
+ self.assert_no_opcode(binary_subscr_frozen_dict_subclass, "BINARY_OP_SUBSCR_DICT")
+
def binary_subscr_str_int():
for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
a = "foobar"
--- /dev/null
+Update specializer to support frozendict. Patch by Donghee Na.
{
nos = stack_pointer[-2];
PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
- if (!PyDict_CheckExact(o)) {
+ if (!PyAnyDict_CheckExact(o)) {
UPDATE_MISS_STATS(BINARY_OP);
assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
JUMP_TO_PREDICTED(BINARY_OP);
dict_st = nos;
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st);
- assert(PyDict_CheckExact(dict));
+ assert(PyAnyDict_CheckExact(dict));
STAT_INC(BINARY_OP, hit);
PyObject *res_o;
_PyFrame_SetStackPointer(frame, stack_pointer);
{
tos = stack_pointer[-1];
PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
- if (!PyDict_CheckExact(o)) {
+ if (!PyAnyDict_CheckExact(o)) {
UPDATE_MISS_STATS(CONTAINS_OP);
assert(_PyOpcode_Deopt[opcode] == (CONTAINS_OP));
JUMP_TO_PREDICTED(CONTAINS_OP);
left = stack_pointer[-2];
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
- assert(PyDict_CheckExact(right_o));
+ assert(PyAnyDict_CheckExact(right_o));
STAT_INC(CONTAINS_OP, hit);
_PyFrame_SetStackPointer(frame, stack_pointer);
int res = PyDict_Contains(right_o, left_o);
{
nos = stack_pointer[-2];
PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
- if (!PyDict_CheckExact(o)) {
+ if (!PyAnyDict_CheckExact(o)) {
UPDATE_MISS_STATS(STORE_SUBSCR);
assert(_PyOpcode_Deopt[opcode] == (STORE_SUBSCR));
JUMP_TO_PREDICTED(STORE_SUBSCR);
op(_GUARD_NOS_DICT, (nos, unused -- nos, unused)) {
PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
- EXIT_IF(!PyDict_CheckExact(o));
+ EXIT_IF(!PyAnyDict_CheckExact(o));
}
op(_GUARD_TOS_DICT, (tos -- tos)) {
PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
- EXIT_IF(!PyDict_CheckExact(o));
+ EXIT_IF(!PyAnyDict_CheckExact(o));
}
macro(BINARY_OP_SUBSCR_DICT) =
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st);
- assert(PyDict_CheckExact(dict));
+ assert(PyAnyDict_CheckExact(dict));
STAT_INC(BINARY_OP, hit);
PyObject *res_o;
int rc = PyDict_GetItemRef(dict, sub, &res_o);
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
- assert(PyDict_CheckExact(right_o));
+ assert(PyAnyDict_CheckExact(right_o));
STAT_INC(CONTAINS_OP, hit);
int res = PyDict_Contains(right_o, left_o);
if (res < 0) {
_PyStackRef nos;
nos = stack_pointer[-2];
PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
- if (!PyDict_CheckExact(o)) {
+ if (!PyAnyDict_CheckExact(o)) {
UOP_STAT_INC(uopcode, miss);
SET_CURRENT_CACHED_VALUES(0);
JUMP_TO_JUMP_TARGET();
_PyStackRef _stack_item_0 = _tos_cache0;
nos = stack_pointer[-1];
PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
- if (!PyDict_CheckExact(o)) {
+ if (!PyAnyDict_CheckExact(o)) {
UOP_STAT_INC(uopcode, miss);
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(1);
_PyStackRef _stack_item_1 = _tos_cache1;
nos = _stack_item_0;
PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
- if (!PyDict_CheckExact(o)) {
+ if (!PyAnyDict_CheckExact(o)) {
UOP_STAT_INC(uopcode, miss);
_tos_cache1 = _stack_item_1;
_tos_cache0 = nos;
_PyStackRef _stack_item_2 = _tos_cache2;
nos = _stack_item_1;
PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
- if (!PyDict_CheckExact(o)) {
+ if (!PyAnyDict_CheckExact(o)) {
UOP_STAT_INC(uopcode, miss);
_tos_cache2 = _stack_item_2;
_tos_cache1 = nos;
_PyStackRef tos;
tos = stack_pointer[-1];
PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
- if (!PyDict_CheckExact(o)) {
+ if (!PyAnyDict_CheckExact(o)) {
UOP_STAT_INC(uopcode, miss);
SET_CURRENT_CACHED_VALUES(0);
JUMP_TO_JUMP_TARGET();
_PyStackRef _stack_item_0 = _tos_cache0;
tos = _stack_item_0;
PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
- if (!PyDict_CheckExact(o)) {
+ if (!PyAnyDict_CheckExact(o)) {
UOP_STAT_INC(uopcode, miss);
_tos_cache0 = tos;
SET_CURRENT_CACHED_VALUES(1);
_PyStackRef _stack_item_1 = _tos_cache1;
tos = _stack_item_1;
PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
- if (!PyDict_CheckExact(o)) {
+ if (!PyAnyDict_CheckExact(o)) {
UOP_STAT_INC(uopcode, miss);
_tos_cache1 = tos;
_tos_cache0 = _stack_item_0;
_PyStackRef _stack_item_2 = _tos_cache2;
tos = _stack_item_2;
PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
- if (!PyDict_CheckExact(o)) {
+ if (!PyAnyDict_CheckExact(o)) {
UOP_STAT_INC(uopcode, miss);
_tos_cache2 = tos;
_tos_cache1 = _stack_item_1;
dict_st = _stack_item_0;
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st);
- assert(PyDict_CheckExact(dict));
+ assert(PyAnyDict_CheckExact(dict));
STAT_INC(BINARY_OP, hit);
PyObject *res_o;
stack_pointer[0] = dict_st;
left = _stack_item_0;
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
- assert(PyDict_CheckExact(right_o));
+ assert(PyAnyDict_CheckExact(right_o));
STAT_INC(CONTAINS_OP, hit);
stack_pointer[0] = left;
stack_pointer[1] = right;
{
nos = stack_pointer[-2];
PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
- if (!PyDict_CheckExact(o)) {
+ if (!PyAnyDict_CheckExact(o)) {
UPDATE_MISS_STATS(BINARY_OP);
assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
JUMP_TO_PREDICTED(BINARY_OP);
dict_st = nos;
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st);
- assert(PyDict_CheckExact(dict));
+ assert(PyAnyDict_CheckExact(dict));
STAT_INC(BINARY_OP, hit);
PyObject *res_o;
_PyFrame_SetStackPointer(frame, stack_pointer);
{
tos = stack_pointer[-1];
PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
- if (!PyDict_CheckExact(o)) {
+ if (!PyAnyDict_CheckExact(o)) {
UPDATE_MISS_STATS(CONTAINS_OP);
assert(_PyOpcode_Deopt[opcode] == (CONTAINS_OP));
JUMP_TO_PREDICTED(CONTAINS_OP);
left = stack_pointer[-2];
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
- assert(PyDict_CheckExact(right_o));
+ assert(PyAnyDict_CheckExact(right_o));
STAT_INC(CONTAINS_OP, hit);
_PyFrame_SetStackPointer(frame, stack_pointer);
int res = PyDict_Contains(right_o, left_o);
{
nos = stack_pointer[-2];
PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
- if (!PyDict_CheckExact(o)) {
+ if (!PyAnyDict_CheckExact(o)) {
UPDATE_MISS_STATS(STORE_SUBSCR);
assert(_PyOpcode_Deopt[opcode] == (STORE_SUBSCR));
JUMP_TO_PREDICTED(STORE_SUBSCR);
}
}
}
- if (PyDict_CheckExact(lhs)) {
+ if (PyAnyDict_CheckExact(lhs)) {
specialize(instr, BINARY_OP_SUBSCR_DICT);
return;
}
assert(ENABLE_SPECIALIZATION);
assert(_PyOpcode_Caches[CONTAINS_OP] == INLINE_CACHE_ENTRIES_COMPARE_OP);
- if (PyDict_CheckExact(value)) {
+ if (PyAnyDict_CheckExact(value)) {
specialize(instr, CONTAINS_OP_DICT);
return;
}