One possibility is to use hidden method parameters.
Let L = {the set of all method parameters which are referenced by
GWT.isLiteral() in the body}
For each parameter P in L, add a new parameter to the method, PiL (P
is Literal).
that is, in Vitali's example:
void addParameter (HashMap h, int size, String key, Object value)
becomes
void addParameter (HashMap h, int size, String key, Object value,
boolean hIL, boolean sizeIL)
now for each GWT.isLiteral/isConstanValue call, replace with the
corresponding hidden parameter
void addParameter (HashMap h, int size, String key, Object value,
boolean hIL, boolean sizeIL) {
if(hIl) {
if(sizeIL) {
...
}
}
}
finally, for each callsite C that invokes the method, if any parameter
P evaluates to a literal, replace the callsite with the hidden
parameters statically evaluated
addParameter(h, size, value)
with
(e.g)
addParameter(h, size, value, true, false)
-Ray
On Mon, Apr 27, 2009 at 9:23 AM, Bruce Johnson <[email protected]> wrote:
> It seems like the general functionality (i.e. GWT.isLiteral()) ought to be
> implemented at the same time as method cloning. That's what makes me excited
> about the whole thing. Otherwise, at least for me, it's hard to wrap my head
> around how you could usefully emit different code for the same method for
> different call sites. Maybe I'm missing something.
>
> A similar but related concept that I think would be the best first step is a
> parameter annotation called @MustBeLiteral. Then any method could become a
> "GWT.create()" indirectly because you'd be able to write:
>
> public <T> T myFactory(@MustBeLiteral Class<? extends T> classLit) {
> T t = GWT.create(classLit);
> // do some stuff to tweak the t instance
> return t;
> }
>
> That seems way useful and perhaps the easiest of everything to implement.
>
> On Mon, Apr 27, 2009 at 9:30 AM, Joel Webber <[email protected]> wrote:
>>
>> Cool, I had no idea GCC provided that information. I won't claim to be one
>> of the compiler gurus, but this sounds pretty feasible to me, and to Ray's
>> point, might be a useful way of loosening the GWT.create() magic a bit.
>>
>> @Lex, Scott: What do you think? Is this relatively easy and useful?
>> On Mon, Apr 27, 2009 at 4:49 AM, Vitali Lovich <[email protected]> wrote:
>>>
>>> Yeah, probably from a compiler's perspective, the value check may be more
>>> complicated (the value may only be available after the AST stage depending
>>> on when optimization is done)
>>>
>>> It can possibly bloat the resultant code (since I believe you may have to
>>> build different implementations of each function and you may get overhead,
>>> even if you inline). However, I think this might be an OK tradeoff since
>>> the assumption would be that you are optimizing for speed as opposed to size
>>> if you use something like GWT.isLiteral.
>>>
>>> On Mon, Apr 27, 2009 at 3:45 AM, Ray Cromwell <[email protected]>
>>> wrote:
>>>>
>>>> +1
>>>>
>>>> I suggested a similar feature a few days ago privately, I called it
>>>> GWT.isLiteral(), since the underlying check is if its an AST literal
>>>> in the compiler, although in my example, you can't do value
>>>> comparisons, just assertions on the literal. The value checks would be
>>>> done via traditional operators.
>>>>
>>>>
>>>>
>>>>
>>>> On Mon, Apr 27, 2009 at 12:33 AM, Vitali Lovich <[email protected]>
>>>> wrote:
>>>> > Kinda like with GCC, allow detection of constant values (i.e.
>>>> > __builtin_constant_p). This way, you could do something like
>>>> >
>>>> > void addParameter (HashMap h, int size, String key, Object value)
>>>> > {
>>>> > if (GWT.isConstantValue(h, null)) {
>>>> > if (GWT.isConstantValue(size, 0))
>>>> > size = 10;
>>>> > h = new HashMap(size);
>>>> > }
>>>> > h.put(key, value).
>>>> > }
>>>> >
>>>> > & you could have the performance of
>>>> >
>>>> > void addParameter (HashMap h?, int size?, String key, Object value)
>>>> >
>>>> > as if you wrote overloaded methods without needing to write several
>>>> > different methods that just supply default values back & forth.
>>>> > Sometimes,
>>>> > it's also possible to use a better algorithm if parameters have a
>>>> > known
>>>> > constant value.
>>>> >
>>>> > >
>>>> >
>>>>
>>>>
>>>
>>>
>>>
>>
>>
>>
>
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---