After I sent that message, I peeked into EqualityNormalizer which is  
basically pre-munging all the equality operators that compare against  
null to Cast.isNull() and Cast.isNotNull() as I described below.

On 10-Jun-09, at 8:16 PM, Matt Mastracci wrote:

> That construct isn't a generically safe JS optimization, unless you  
> have additional type info at the JS level to tell you what Java type  
> the ifExpr was.  I don't know for sure whether that information is  
> available after the transition to JS (does SOYC make this available?).
>
> I believe that GenerateJavaScriptAST could be a bit smarter and not  
> generate "== null" and "!= null" for binary equality ops where the  
> operand is known to be a reference type that isn't a string.
>
> One example failure case where null equality is not equivalent to  
> binary coersion is the following:
>
> var a = false;
> if (a != null) { alert('blah'); }
>
> and
>
> var a = false;
> a && alert('blah')
>
>
> BTW, this quick test shows that the problematic values are 0  
> (numeric zero), "" (the empty string), NaN and false:
>
> <table>
> <script>
> tests = [ [], {}, 0, null, undefined, "", "0", "null", "undefined",  
> NaN, "NaN", true, false ]
> for (i = 0; i < tests.length; i++) {
>  document.write("<tr><td>" + ("" + tests[i]) + "</td><td>" + (! 
> tests[i]) + "</td><td>" + (tests[i] == null) + "</td></tr>");
> }
> </script>
>
>
> On 10-Jun-09, at 5:20 PM, Scott Blum wrote:
>
>> Ultimately that'd be great, whether that's a one step operation or  
>> a two-step.
>>
>> On Wed, Jun 10, 2009 at 7:16 PM, Ray Cromwell  
>> <cromwell...@gmail.com> wrote:
>>
>> Scott, do you mean replacing
>>
>> if(a != null) { expr; }
>>
>> with
>>
>> a && expr?
>>
>> -Ray
>>
>>
>> On Thu, Jun 11, 2009 at 4:56 AM, <sco...@google.com> wrote:
>> >
>> > LGTM.  Want to point out that we can optimize some of these even  
>> better
>> > in cases where the nested code is an expression statement.
>> >
>> >
>> > http://gwt-code-reviews.appspot.com/33845/diff/1/2
>> > File dev/core/test/com/google/gwt/dev/js/JsStaticEvalTest.java  
>> (right):
>> >
>> > http://gwt-code-reviews.appspot.com/33845/diff/1/2#newcode37
>> > Line 37: assertEquals("if(!a()){b()}", optimize("if (a()) { }  
>> else {
>> > b(); }"));
>> > a()||b()
>> >
>> > http://gwt-code-reviews.appspot.com/33845/diff/1/2#newcode45
>> > Line 45: assertEquals("if(a()){b()}", optimize("if (a()) { b() }  
>> else {
>> > }"));
>> > a()&&b()
>> >
>> > http://gwt-code-reviews.appspot.com/33845
>> >
>> > >
>> >
>>
>> >>
>>
>


--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to