puniverse / quasar

Fibers, Channels and Actors for the JVM
http://docs.paralleluniverse.co/quasar/
Other
4.56k stars 575 forks source link

Add instrumentation to enhanced for when iterating suspendable Iterables #285

Open FroMage opened 7 years ago

FroMage commented 7 years ago

Hi,

I'm trying a suspendable Iterable and I can't get it to work in enhanced for loops, probably due to the instrumentation not detecting that the Iterator has @Suspendable in its next() method definition.

Would it be possible to add support in instrumenting for loops, where the iterated element has a suspendable iterator as determined statically?

In my case, I'm doing:

class SuspendableIterable<T> implements Iterable<T> {
 @Override
 public SuspendableIterator<T> iterator() {
  return new SuspendableIterator<>(...);
 }
}
class SuspendableIterator<T> implements Iterator<T> {
 @Override
 @Suspendable
 public T next() {
  ...
 }
 @Override
 @Suspendable
 public boolean hasNext() {
  ...
 }
 ...
}

SuspendableIterable<Integer> it = ...;
for(int i : it){
}

And this breaks because the instrumentation does not detect that the for loop will call hasNext/next which are suspendable. I think this can be determined statically, no?

FroMage commented 7 years ago

Especially since the following works, and should be equivalent in the bytecode, no?

for(SuspendableIterator<Integer> it2 = it.iterator(); it2.hasNext() ; ){
 int i = it2.next();
 System.err.println("Got item: "+i);
}
FroMage commented 6 years ago

I've added a PR for this in #297