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/AS3/ 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 >> > >> > >>