flex-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andy Dufilie <andy.dufi...@gmail.com>
Subject Re: [FALCONJX][FLEXJS] "as" keyword handling
Date Fri, 08 Jan 2016 01:24:24 GMT
On Thu, Jan 7, 2016 at 4:55 PM, Alex Harui <aharui@adobe.com> wrote:

> How many of you use the "as" keyword as part of a test?

I have a huge code base and I use "as" / "is" everywhere (
https://github.com/WeaveTeam/Weave). My code depends on it behaving the
same way it does in ActionScript.  IMO, being able to easily check if an
object extends or implements a class/interface is a huge advantage AS has
over JS.

> The reason I'm asking is because the use of "as" as become a negative
> factor in several cases:
> 1) In JS, it results in a function call

Yes. In ActionScript, using "as" actually sped up the code in certain
situations, but in JS it is a performance hit.  This is a very common
pattern in my code:

if (obj is Thing1)
    (obj as Thing1).foo(a,b);
else if (obj is Thing2)
    (obj as Thing2).bar(x,y);

Each pair of is/as results in redundant processing since Language.as()
calls Language.is() internally, so I've been changing my code like this to
improve performance:

var thing1:Thing1 = obj as Thing1;
var thing2:Thing2 = obj as Thing2;
if (thing1)
else if (thing2)

> 2) As Om noted yesterday, it doesn't work for Native JS types

It does work with native types:

-> true

> 3) It causes unnecessary class dependencies which complicates the
> goog.requires list

The class dependency is necessary if you need the "as" keyword to behave
the same way it does in ActionScript (like I do).

> Currently there is an @flexjsignorecoercion hack you can use to tell
> FalconJX to skip code-generation for an "as" operation.  However, we are
> adding more and more of these, and they are more frequently the cause of
> something not working, so I am thinking about flipping the logic and not
> generating code for any "as" operation unless you specifically ask for it
> via @flexjsgeneratecoercion or something like that.
> Thoughts?
> -Alex
I see "is" and "as" as highly useful features, and I think it would be a
mistake to make the code cross-compile into something that behaves
differently by default.  IMO if cross-compiled code behaves differently
than the original then it's being mangled and can't be trusted.

A related issue is when setting a typed variable or passing in a parameter
to a function, it will do type coercion automatically in AS but that
behavior is lost when cross-compiling to JS.  For example, I have
situations like this where I now have to add manual type casting, and I
wish the compiler would do that automatically:

var str:String = value_which_may_be_a_number;

  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message