Skip to content

Virtual iterators #724

@markshannon

Description

@markshannon

Discussed in #392

Originally posted by markshannon May 20, 2022
Much like we have "virtual bound-methods" for calls to methods, we could have "virtual iterators" for iteration over sequences.

The LOAD_METHOD instruction pushes NULL func or func self to the stack, the latter being a representation of the bound-method types.MethodType(func, self).
We could do something similar for GET_ITER.
For non-sequence iterators, like range, generators etc, it would push NULL iter. For sequences, it would push seq 0.
The behavior of FOR_ITER would depend on whether SECOND is NULL.

  • NULL: Push next(iter)
  • Not NULL: Pop index; push index+1; push seq[index]

If we allow unboxed integers on the stack, then this could be reasonably efficient with specialization.
For this to be useful, we would need have tagged integers on the stack.
I doubt it would be worth implementing tagged ints just for this, but if we had tagged values for another reason, e.g. deferred reference counts, then it could be a worthwhile enhancement.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions