In the reducer method for the ternary expression, how do you know whether it going to be assigned to a foo[bar] expression? Do you look at the parent node of the ternary expression? I have a feeling that that isn't how JBurg is supposed to be used, but maybe you can get away with it. You should probably have a different JBurg pattern and reduce method just for this case.
I'm also not convinced this covers all the relevant situations where a coerce_a might be necessary. For example, suppose that instead of being assigned to a left-hand-side of type *, the ternary expression is being passed as a argument to a function that has a type * parameter. That might also need a coerce_a. I'd put a comment in the code that this is questionable. But if it gets your app further towards working, it's good. - Gordon -----Original Message----- From: Alex Harui [mailto:aha...@adobe.com] Sent: Wednesday, October 02, 2013 11:52 AM To: dev@flex.apache.org Subject: Re: [FALCON] using coerce_a The code only thinks about coercing if there is a bracket [] node. It gets the type of the left hand side via resolveType and compares the resolveType of the clause node and calls coerce if it doesn't match. So your example won't have a coerce_a in the ABC. -Alex On 10/2/13 11:19 AM, "Gordon Smith" <gosm...@adobe.com> wrote: >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 >>>/A >>>S >>>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 >>>>> > >>>>> > >>>>> >>> >> >