Ray, I think we can improve the class over time -- any reasonable starting point (even without iterators or with non-optimal iterators) would help significantly.
Stefan On Sat, Jun 13, 2009 at 4:21 AM, Ray Cromwell <cromwell...@gmail.com> wrote: > BTW, the last proposal is very unsafe with some form of escape > analysis since it is unsafe to pass references to classes which > reference local scope to other scopes. Another possibility is a form > of 'destructuring' of Iterator classes by inlining them completely > into local scope vs escape analysis and then forgoing separate > construction. > > A simpler way to maintain for-each with JRE collections without > creating objects is to change the way that for-each deals with > Iterable<T> when T is a List. > > The compiler could change: > for(T x : foo) { ... } > > where foo is a List<T> > > into > > for(int i=0; i<foo.size(); ++i) { > T x = foo.get(i); > } > > instead of calling foo.iterator() and using Iterator methods. > > -Ray > > On Fri, Jun 12, 2009 at 7:31 PM, Ray Cromwell<cromwell...@gmail.com> > wrote: > > I'm in the process of some final tweaks on GQuery, so I'll look at how > > much of my private JSArray class I can move over as a patch. > > > > One possibility for avoiding Iterator object creation without using > > flyweights is to introduce a new Iterator type which contains methods > > which are parameterized by the collection and which use my Extension > > Method/Category method JSO trick. > > > > public class FastIterator<T> extends JavaScriptObject { > > protected FastIterator() {} > > public <S, T extends List<S>> FastIterator<S> make(T<S> list) { > > return (FastIterator<S>)(GWT.isScript() ? makeWeb() : makeHosted()); > > } > > > > private final native FastIterator makeWeb() /*-{ > > return 0; > > }-*/; > > > > private final native FastIterator makeHosted() /*-{ > > return [0]; > > }-*/; > > > > public final int value() { > > return GWT.isScript() ? valueWeb() : valueHosted(); > > } > > > > public native int valueWeb() /*-{ > > return this; > > }-*/; > > > > public native int valueHosted() /*-{ > > return this[0]; > > }-*/; > > > > public native hasNext(List<T> list) { > > return value() < list.size(); > > } > > > > public native T next(List<T> list) { > > return list.get(value()++); // unsure if using value() as rvalue > > will work here > > } > > } > > > > then you should be able to write code like > > > > List<String> foo = getList(); > > FastIterator<String> iter = FastIterator.make(foo); > > > > while(iter.hasNext(foo)) { > > String s = iter.next(foo); > > } > > > > Why doesn't this create any additional objects? Because > > 'iter'/FastIterator is actually a native JS number/scalar type, and > > what this is really doing is simulating the addition of > > hasNext()/next() to the number's prototype. > > > > We could dispense with the need for an additional parameter if GWT had > > a magic method for allocating new local variables/symbols in the local > > scope. Imagine if writing > > > > Variable<T> x = GWT.createVariable(0); > > > > was a magic method that just generated a 'var x = 0' declaration, only > > it promised to always be inlined and do so in the caller's scope. > > 'Variable' would be a magic class that never creates fields on the > > actual object themselves and are pruned/removed at runtime. > > > > Then you could have FastIterator impersonate a reference to the > > underlying List<T>, and rewrite hasNext()/next() as: > > > > VariableInt x = GWT.createVariableInt(0); > > public boolean hasNext() { > > return x.get() < this.size(); > > } > > > > public T next() { > > return this.get(x.get()++); // or x.postIncrement() > > } > > > > this would produce code that would create no additional objects as > > well as maintain Iterator-like interface. > > > > -Ray > > > > > > On Thu, Jun 11, 2009 at 7:25 AM, Stefan Haustein<haust...@google.com> > wrote: > >> +1 Ray > >> Could you contribute your implementation(s)? > >> > >> On Thu, Jun 11, 2009 at 12:51 PM, Joel Webber <j...@google.com> wrote: > >>> > >>> +1 Ray. Now here's the really tricky question. Is there any way we can > >>> take advantage of Javascript's "for (x in y) { ... }" syntax (and > should we, > >>> given its spotty performance)? My intuition tells me that the only way > we > >>> could use it would be through a callback, because there's nothing like > .NET > >>> generators/yield in Javascript. > >>> On Wed, Jun 10, 2009 at 7:26 PM, Ray Cromwell <cromwell...@gmail.com> > >>> wrote: > >>>> > >>>> My take on this is that there is many places where I'd like to avoid > >>>> JRE collections, but the basic JsArray is too much of a downgrade. I > >>>> don't mind changing it to <T> if it doesn't effect performance cause > >>>> then I could subclass it, but as an example of the stuff I would like > >>>> in a 'FastArrayList' that is not a collections derivative: > >>>> > >>>> 1) add() instead of just set(length(), item) (e.g. push) > >>>> 2) addAll(anotherFastArrayList) (e.g. concat) > >>>> 3) splice > >>>> 4) toArray() (webmode is reinterpret cast op) > >>>> 5) remove > >>>> 6) shift/unshift (useful for queue when combined with pop) > >>>> > >>>> I use the following pattern all over GQuery to avoid JRE collections > >>>> but preserve for-each > >>>> > >>>> for(Foo f : fooList.elements()) { ... } > >>>> > >>>> where fooList is my own JsArray<T> class, and elements() returns T[] > >>>> via reinterpret cast in webmode. > >>>> > >>>> -Ray > >>>> > >>>> > >>>> > >>>> On Thu, Jun 11, 2009 at 2:43 AM, Lex Spoon<sp...@google.com> wrote: > >>>> > > >>>> > Bah, mis-send. What I was typing was: > >>>> > > >>>> > > >>>> >> I though the point was to get rid of JRE collections? Anyway, the > >>>> >> collection in question is used as a queue. I would hate to see its > >>>> >> performance get worse when there' > >>>> > > >>>> > ...when there's a known, straightforward alternative, and when that > >>>> > alternative provides a class people have been wanting for separate > >>>> > purposes. > >>>> > > >>>> > > >>>> > Lex > >>>> > > >>>> > > > >>>> > > >>> > >>> > >>> > >>> > >> > >> > >> > >> -- > >> Stefan Haustein > >> Google UK Limited > >> > >> Registered Office: Belgrave House, 76 Buckingham Palace Road, London > SW1W > >> 9TQ; Registered in England Number: 3977902 > >> > >> > > > -- Stefan Haustein Google UK Limited Registered Office: Belgrave House, 76 Buckingham Palace Road, London SW1W 9TQ; Registered in England Number: 3977902 --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---