iter.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #pragma once
  2. #include "cffi.h"
  3. #include "common.h"
  4. #include "frame.h"
  5. namespace pkpy{
  6. struct RangeIter{
  7. PY_CLASS(RangeIter, builtins, _range_iterator)
  8. Range r;
  9. i64 current;
  10. RangeIter(Range r) : r(r), current(r.start) {}
  11. static void _register(VM* vm, PyObject* mod, PyObject* type);
  12. };
  13. struct ArrayIter{
  14. PY_CLASS(ArrayIter, builtins, _array_iterator)
  15. PyObject* ref;
  16. PyObject** begin;
  17. PyObject** end;
  18. PyObject** current;
  19. ArrayIter(PyObject* ref, PyObject** begin, PyObject** end)
  20. : ref(ref), begin(begin), end(end), current(begin) {}
  21. void _gc_mark() const{ PK_OBJ_MARK(ref); }
  22. static void _register(VM* vm, PyObject* mod, PyObject* type);
  23. };
  24. struct StringIter{
  25. PY_CLASS(StringIter, builtins, _string_iterator)
  26. PyObject* ref;
  27. Str* str;
  28. int index; // byte index
  29. StringIter(PyObject* ref) : ref(ref), str(&PK_OBJ_GET(Str, ref)), index(0) {}
  30. void _gc_mark() const{ PK_OBJ_MARK(ref); }
  31. static void _register(VM* vm, PyObject* mod, PyObject* type);
  32. };
  33. struct Generator{
  34. PY_CLASS(Generator, builtins, generator)
  35. Frame frame;
  36. int state; // 0,1,2
  37. List s_backup;
  38. Generator(Frame&& frame, ArgsView buffer): frame(std::move(frame)), state(0) {
  39. for(PyObject* obj: buffer) s_backup.push_back(obj);
  40. }
  41. void _gc_mark() const{
  42. frame._gc_mark();
  43. for(PyObject* obj: s_backup) PK_OBJ_MARK(obj);
  44. }
  45. PyObject* next(VM* vm);
  46. static void _register(VM* vm, PyObject* mod, PyObject* type);
  47. };
  48. } // namespace pkpy