Does that work for ternary expressions and left-hand-sides with other types, such as
var i:int = true ? 1 : 2; ? - Gordon On 10/2/13 11:01 AM, "Alex Harui" <aha...@adobe.com> wrote: >Update: Changing Falcon to generate the coerce_a in the ternary clauses >allowed it to work for AIR. The code change is only in ternary expression >reduction so I think it won't hurt performance too much. > >-Alex > >On 10/1/13 10:09 PM, "Alex Harui" <aha...@adobe.com> wrote: > >>So, I added code to add the coerce_a and it did not help. I get the same >>corrupted output. >> >>Here is the AS: >>package { >>public class foo { >>private var dict:Dictionary = new Dictionary(); >>public function addInstance(instance:ISomeInterface):void >>{ >> dict[instance.uid] = (instance.someBoolean ? new SomeClass(instance) : >>new SomeOtherClass(instance)); >> ... >>} >>} >> >>//internal class >>class SomeClass{ >>public function SomeClass(instance:ISomeInterface) >>{ >>} >>//internal class >>class SomeOtherClass{ >>public function SomeOtherClass(instance:ISomeInterface) >>{ >>} >> >> >> >>Here is the ABC from MXMLC that works: >> >> >> getlocal0 >> pushscope >> getlocal0 >> getproperty private:dict >> getlocal1 >> getproperty ISomeInterface:uid >> getlocal1 >> getproperty ISomeInterface:someBoolean >> iffalse L0 >> >> findpropstrict private:SomeClass >> getlocal1 >> constructprop private:SomeClass (1) >> coerce_a >> jump L1 >> L0: findpropstrict private:SomeOtherClass >> getlocal1 >> constructprop private:SomeOtherClass (1) >> coerce_a >> L1: setproperty >> private,private,,http://adobe.com/AS3/2006/builtin:null >> >>Here is the ABC from Falcon that doesn't work: >> >> getlocal0 >> pushscope >> getlex private:dict >> getlocal1 >> getproperty ISomeInterface:uid >> getlocal1 >> getproperty ISomeInterface:someBoolean >> iffalse L0 >> >> findpropstrict private:SomeClass >> getlocal1 >> constructprop private:SomeClass (1) >> jump L1 >> L0: findpropstrict private:SomeOtherClass >> getlocal1 >> constructprop private:SomeOtherClass (1) >> L1: coerce_a >> setproperty >> private,flash.events:EventDispatcher,Object,private,,http://adobe.com/AS >>3 >>/ >>2006/builtin:null >> >>I'm beginning to think this is an AIR bug since the Falcon ABC runs fine >>on Flash. I'm going to try to replicate the MXMLC's placement of >>coerce_a >>and see if that gets the code to work in AIR. >> >> >>Thanks, >>-Alex >> >> >> >>On 9/30/13 10:50 PM, "Alex Harui" <aha...@adobe.com> wrote: >> >>>There's no error, the Dictionary value appears be a Number instead of an >>>instance. >>> >>>Are you sure that Vector access doesn't come through this code? I think >>>I'll start by testing only for ANY_TYPE and adding a coerce_a instead of >>>calling coerce() which would also coerce to any destination type. >>> >>>Thanks for the advice, >>>-Alex >>>________________________________________ >>>From: Darrell Loverin [darrell.love...@gmail.com] >>>Sent: Monday, September 30, 2013 6:11 PM >>>To: dev@flex.apache.org >>>Subject: Re: [FALCON] using coerce_a >>> >>>I generally agree. I don't think I'd try to do anything inside the >>>ternary >>>expression reduce. >>> >>>I'd look at the coerce() method in ABCGeneratingReducer to try to figure >>>out why it is not being called. >>> >>> >>>Question for Alex. What error are you seeing on AIR? A TypeError, a >>>ReferenceError? >>> >>>-Darrell >>> >>> >>>On Mon, Sep 30, 2013 at 8:00 PM, Gordon Smith <gosm...@adobe.com> wrote: >>> >>>> Thanks Darrell. >>>> >>>> Here are my answers to Alex's questions: >>>> >>>> > Should a complex assignment statement like the above know about the >>>> destination type as the clauses of the ternary statement are being >>>>reduced? >>>> >>>> No. >>>> >>>> > Is it safe to add a coerce_a before an assignment to a Dictionary? >>>> >>>> Yes. >>>> >>>> > If so, what would be the recommended way to determine the assignment >>>>is >>>> to a Dictionary? >>>> >>>> The compile-time type of foo[bar], where foo has any type (not just >>>> Dictionary), is type *. So I think it is OK to codegen coerce_a before >>>> assignment to any foo[bar] expression. >>>> >>>> Darrell, do you agree or disagree? >>>> >>>> - Gordon >>>> >>>> >>>> -----Original Message----- >>>> From: Darrell Loverin [mailto:darrell.love...@gmail.com] >>>> Sent: Monday, September 30, 2013 3:41 PM >>>> To: dev@flex.apache.org >>>> Subject: Re: [FALCON] using coerce_a >>>> >>>> coerce_a Operation >>>> >>>> Coerce a value to the any type. >>>> >>>> Format >>>> >>>> coerce_a >>>> >>>> Forms >>>> >>>> Stack >>>> >>>> ..., value => ..., value Description >>>> >>>> Indicates to the verifier that the value on the stack is of the any >>>>type >>>> (*). Does nothing to value. >>>> >>>> >>>> On Mon, Sep 30, 2013 at 6:03 PM, Gordon Smith <gosm...@adobe.com> >>>>wrote: >>>> >>>> > Can you remind me what the "a" in coerce_a means? >>>> > >>>> > - Gordon >>>> > >>>> > -----Original Message----- >>>> > From: Alex Harui [mailto:aha...@adobe.com] >>>> > Sent: Monday, September 30, 2013 2:43 PM >>>> > To: dev@flex.apache.org >>>> > Subject: [FALCON] using coerce_a >>>> > >>>> > Gordon, Darrell (mostly) >>>> > >>>> > My latest problem appears to be in assigning to a Dictionary. For >>>>the >>>> > following code: >>>> > >>>> > var dict:Dictionary = new Dictionary(); Var i:int; Dict["foo"] = (i >>>>== >>>> > 0 ? new SomeClass() : new SomeOtherClass()); >>>> > >>>> > MXMLC generates a coerce_a after the constructProp for both >>>>SomeClass >>>> > and SomeOtherClass. >>>> > For some reason, FlashPlayer doesn't care if the coerce_a is >>>>missing, >>>> > but AIR seems to. >>>> > >>>> > The question is, should a complex assignment statement like the >>>>above >>>> > know about the destination type as the clauses of the ternary >>>> > statement are being reduced? And if so, how would we get that >>>>knowledge >>>> into the reducer. >>>> > >>>> > Alternatively, is it safe to add a coerce_a before an assignment to >>>>a >>>> > Dictionary? If so, what would be the recommended way to determine >>>>the >>>> > assignment is to a Dictionary? >>>> > >>>> > Thanks, >>>> > -Alex >>>> > >>>> > >>>> >> >