This is related to the issue I discussed in another email about common subexpression elimination and wrappers.
If I had a Layer interface/delegator which delegated to a GWT.create() call which returns a JSO, the JSO would still need to implement an interface. Imagine that I want to turn this: layer.ctx.moveTo(100,100); into ctx.moveTo(100,00); I can do this today with a JSO that overlays the JS object returned from element.getContext('2d'); However, if I want to have a drawing interface that might use JSOs targeting Canvas, Flash, or SVG objects in the browser, I'm guessing you're talking about doing something like this: public class Canvas { CanvasJSO impl = GWT.create(CanvasImpl.class); public void moveTo(int x, int y) { impl.moveTo(x,y); } } Great, this will get perfectly inlined to "ctx.moveTo(x,y);" The problem is, how do I make a do I make a GWT.create() call return disjoint JSO types that are usable by a single delegator? In the above, you see that I am declaring the impl field as a CanvasJSO. But if GWT.create(CanvasImpl.class) can also return a FlashJSO or a SVGJSO, which have native canvas emulation, what do I declare the type of this impl field as? I can't make those three JSOs implement an interface, nor can I make them inherit from a abstract base class, or use overrides. The current solution is not to use JSOs but to use wrappers, which means all those methods end up looking like this: function moveTo(this$static, x, y) { this$static.ctx.moveTo(x,y); } where ultimately, the JsInliner reduces this to: localVar.ctx.moveTo(x,y); It's not terrible, but I was looking for a way to remove the wrapper references until CSE appears in the compiler. -Ray On Fri, Aug 29, 2008 at 11:47 AM, Scott Blum <[EMAIL PROTECTED]> wrote: > Ray, can you help me understand why the delegator pattern doesn't do it for > you? Take for example the 1.5 dom.client library, if you look at > Element/Node you'll notice several calls that are delegated to > dom.client.DOMImpl, which is deferred bound. > > On Fri, Aug 29, 2008 at 3:36 AM, Ray Cromwell <[EMAIL PROTECTED]> wrote: >> >> Your example looks correct. I heavily 'drank the koolaid" of Overlay >> types earlier this year and have not regretted it. To the extend that >> there are areas where I'd like to use them, but can't, because of >> their inability to implement interfaces >> >> . In particular, when using Deferred Binding to wrap native browser >> objects, sometimes I need a JSO created differently for each DB. Each >> JSO is "effectively final" because only one concrete type of the >> interface ever exists in any permutation, so theoretically it's >> possible for the JSO design to work within these restrictions, but a >> little hairy. (essentially, if type-tightening fails, you're screwed) >> >> The classic example is Canvas drawing. I have an interface which >> exports drawing methods (moveTo, lineTo, transform, etc) One >> implementation might be a wrapper around the CanvasRenderingContext2D >> from the <CANVAS> tag. Another might be a Flash, SVG, or Silverlight >> implementation. >> >> >> -Ray >> >> On Fri, Aug 29, 2008 at 12:26 AM, Ian Petersen <[EMAIL PROTECTED]> wrote: >> > >> > On Fri, Aug 29, 2008 at 3:05 AM, Reinier Zwitserloot >> > <[EMAIL PROTECTED]> wrote: >> >> I don't use GWT-Serialization to talk to my server. The server sends >> >> timestamps as milliseconds. I'd like to turn these milliseconds into >> >> javascript Date objects. >> >> >> >> How do I accomplish this? >> >> >> >> As I mentioned when long emulation was on the table, timestamps are >> >> one of those numbers which are not representable with ints, but they >> >> fit perfectly in the range where doubles still represent integral >> >> numbers without loss of precision. >> > >> > I don't think you want to use longs--someone measured them at 250 >> > times slower than JS doubles, or something like that. I think you >> > want the following: >> > >> > public final class JSDate extends JSO { >> > >> > protected JSDate() { >> > } >> > >> > public static native create(double millis) /*-{ >> > return new Date(millis); >> > }-*/; >> > >> > // implement relevant date methods here, like getYear: >> > >> > public native int getYear() /*-{ >> > return this.getYear(); >> > }-*/; >> > } >> > >> > Not sure though--I haven't used the new overlay stuff myself, and I >> > typed the above directly into the browser without testing. >> > >> > Ian >> > >> > > >> > >> >> > > > > > --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---