Stefan, if it's really urgent, I would suggest just forking JsArray into your own project packages for a while. They're simple enough that it won't be much trouble to unfork when something better comes along -- the collections I have in mind for core GWT are a little more ambitious, and so they will inevtiably take longer than you'll want to wait. On Wed, Jun 17, 2009 at 6:37 PM, Stefan Haustein <haust...@google.com>wrote:
> On Tue, Jun 16, 2009 at 12:54 AM, Stefan Haustein <haust...@google.com>wrote: > >> 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. > > > Ray, > > I am blocking on this for other size optimizations. Do you know when you > would have some kind of starting point ready to submit? > > If it is still a while away, I'd like to move ahead with a copy of JsArray > that is not limited to JSO content. > > Stefan > >> >> >> 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 >> >> > > > -- > 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 -~----------~----~----~----~------~----~------~--~---