);
return new_object(tp_ref, std::forward(value));
}
@@ -533,6 +537,18 @@ public:
return static_cast(obj->value());
}
+ template
+ inline PyVar PyIter(P&& value) {
+ static_assert(std::is_base_of_v);
+ return new_object(tp_native_iterator, std::forward(value));
+ }
+
+ inline BaseIter* PyIter_AS_C(const PyVar& obj)
+ {
+ check_type(obj, tp_native_iterator);
+ return static_cast(obj->value());
+ }
+
inline const Str& PyStr_AS_C(const PyVar& obj) {
check_type(obj, tp_str);
return OBJ_GET(Str, obj);
@@ -587,7 +603,6 @@ public:
DEF_NATIVE(Tuple, pkpy::Tuple, tp_tuple)
DEF_NATIVE(Function, pkpy::Function, tp_function)
DEF_NATIVE(NativeFunc, pkpy::NativeFunc, tp_native_function)
- DEF_NATIVE(Iter, pkpy::shared_ptr, tp_native_iterator)
DEF_NATIVE(BoundMethod, pkpy::BoundMethod, tp_bound_method)
DEF_NATIVE(Range, pkpy::Range, tp_range)
DEF_NATIVE(Slice, pkpy::Slice, tp_slice)
@@ -860,7 +875,7 @@ PyVar TupleRef::get(VM* vm, Frame* frame) const{
void TupleRef::set(VM* vm, Frame* frame, PyVar val) const{
val = vm->asIter(val);
- pkpy::shared_ptr iter = vm->PyIter_AS_C(val);
+ BaseIter* iter = vm->PyIter_AS_C(val);
for(int i=0; itp_star_wrapper)){