Commit 9c5f4985 authored by Marius Wachtler's avatar Marius Wachtler

add __iter__ runtime IC

parent 67635043
...@@ -456,7 +456,7 @@ struct _typeobject { ...@@ -456,7 +456,7 @@ struct _typeobject {
void* _hcls; void* _hcls;
void* _hcattrs; void* _hcattrs;
char _ics[32]; char _ics[40];
void* _gcvisit_func; void* _gcvisit_func;
int _attrs_offset; int _attrs_offset;
char _flags[7]; // These are bools in C++ char _flags[7]; // These are bools in C++
......
...@@ -1273,7 +1273,6 @@ void setupList() { ...@@ -1273,7 +1273,6 @@ void setupList() {
static PyMappingMethods list_as_mapping; static PyMappingMethods list_as_mapping;
list_cls->tp_as_mapping = &list_as_mapping; list_cls->tp_as_mapping = &list_as_mapping;
list_cls->tp_iter = listIter;
list_iterator_cls = BoxedClass::create(type_cls, object_cls, &BoxedListIterator::gcHandler, 0, 0, list_iterator_cls = BoxedClass::create(type_cls, object_cls, &BoxedListIterator::gcHandler, 0, 0,
sizeof(BoxedListIterator), false, "listiterator"); sizeof(BoxedListIterator), false, "listiterator");
list_reverse_iterator_cls = BoxedClass::create(type_cls, object_cls, &BoxedListIterator::gcHandler, 0, 0, list_reverse_iterator_cls = BoxedClass::create(type_cls, object_cls, &BoxedListIterator::gcHandler, 0, 0,
...@@ -1356,6 +1355,7 @@ void setupList() { ...@@ -1356,6 +1355,7 @@ void setupList() {
list_cls->giveAttr("__hash__", None); list_cls->giveAttr("__hash__", None);
list_cls->freeze(); list_cls->freeze();
list_cls->tp_iter = listIter;
list_cls->tp_as_sequence->sq_length = list_length; list_cls->tp_as_sequence->sq_length = list_length;
list_cls->tp_as_sequence->sq_concat = (binaryfunc)list_concat; list_cls->tp_as_sequence->sq_concat = (binaryfunc)list_concat;
......
...@@ -5728,8 +5728,7 @@ Box* getiter(Box* o) { ...@@ -5728,8 +5728,7 @@ Box* getiter(Box* o) {
if (PyType_HasFeature(type, Py_TPFLAGS_HAVE_ITER) && type->tp_iter != slot_tp_iter && type->tp_iter) { if (PyType_HasFeature(type, Py_TPFLAGS_HAVE_ITER) && type->tp_iter != slot_tp_iter && type->tp_iter) {
r = type->tp_iter(o); r = type->tp_iter(o);
} else { } else {
static BoxedString* iter_str = internStringImmortal("__iter__"); r = type->callIterIC(o);
r = callattrInternal0<CXX, NOT_REWRITABLE>(o, iter_str, LookupScope::CLASS_ONLY, NULL, ArgPassSpec(0));
} }
if (r) { if (r) {
if (!PyIter_Check(r)) { if (!PyIter_Check(r)) {
......
...@@ -290,6 +290,20 @@ Box* BoxedClass::callReprIC(Box* obj) { ...@@ -290,6 +290,20 @@ Box* BoxedClass::callReprIC(Box* obj) {
return ic->call(obj, repr_str, callattr_flags, nullptr, nullptr, nullptr, nullptr, nullptr); return ic->call(obj, repr_str, callattr_flags, nullptr, nullptr, nullptr, nullptr, nullptr);
} }
Box* BoxedClass::callIterIC(Box* obj) {
assert(obj->cls == this);
auto ic = iter_ic.get();
if (!ic) {
ic = new CallattrIC();
iter_ic.reset(ic);
}
static BoxedString* iter_str = internStringImmortal("__iter__");
CallattrFlags callattr_flags{.cls_only = true, .null_on_nonexistent = true, .argspec = ArgPassSpec(0) };
return ic->call(obj, iter_str, callattr_flags, nullptr, nullptr, nullptr, nullptr, nullptr);
}
bool BoxedClass::callNonzeroIC(Box* obj) { bool BoxedClass::callNonzeroIC(Box* obj) {
assert(obj->cls == this); assert(obj->cls == this);
......
...@@ -194,11 +194,12 @@ public: ...@@ -194,11 +194,12 @@ public:
// TODO: these don't actually get deallocated right now // TODO: these don't actually get deallocated right now
std::unique_ptr<CallattrCapiIC> next_ic; std::unique_ptr<CallattrCapiIC> next_ic;
std::unique_ptr<CallattrIC> hasnext_ic, repr_ic; std::unique_ptr<CallattrIC> hasnext_ic, repr_ic, iter_ic;
std::unique_ptr<NonzeroIC> nonzero_ic; std::unique_ptr<NonzeroIC> nonzero_ic;
Box* callHasnextIC(Box* obj, bool null_on_nonexistent); Box* callHasnextIC(Box* obj, bool null_on_nonexistent);
Box* call_nextIC(Box* obj) noexcept; Box* call_nextIC(Box* obj) noexcept;
Box* callReprIC(Box* obj); Box* callReprIC(Box* obj);
Box* callIterIC(Box* obj);
bool callNonzeroIC(Box* obj); bool callNonzeroIC(Box* obj);
gcvisit_func gc_visit; gcvisit_func gc_visit;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment