You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
The text was updated successfully, but these errors were encountered:
We should be able to do this now, without general support for tagged ints.
The only instructions that would see the tagged index would be FOR_ITER and its specializations, and they should be able to handle tagged integers just fine.
The GC and frame clearing code already ignores immortal objects, so should need only minimal modification, if any.
This would also make specializing GET_ITER more profitable, as GET_ITER_TUPLE and GET_ITER_LIST would simply push 0.
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 pushesNULL func
orfunc self
to the stack, the latter being a representation of the bound-methodtypes.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 pushseq 0
.The behavior of
FOR_ITER
would depend on whetherSECOND
isNULL
.NULL
: Pushnext(iter)
NULL
: Pop index; pushindex+1
; pushseq[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.
The text was updated successfully, but these errors were encountered: