Yes, very strange. The AVM2 spec says the jump instruction does not change the stack either (as you would expect).
On Wed, Oct 2, 2013 at 6:23 PM, Alex Harui <aha...@adobe.com> wrote: > When I look at the output, the sequence of ABC instructions generated by > MXMLC should be: > > Constructprop > Coerce_a > Jump > SetProperty > > And for Falcon > > ConstructProp > Jump > Coerce_a > SetProperty > > In x86 asm, a jump only moves the IP and doesn't change anything else. But > for some reason, AIR (and not FlashPlayer) is sensitive to that > difference. Very strange bug in AIR, IMO. Anyway, I do have Falcon > generating the coerce_a where MXMLC outputs it. > > On 10/2/13 3:13 PM, "Darrell Loverin" <darrell.love...@gmail.com> wrote: > > >Nice job figuring this out! Does your change now generate the coerce_a > >code in the same positions as the MXML compiler? The only difference I > >saw in byte code with respect to coerce_a was a "jump L1" instruction > >after (Falcon) a coerce_a instead before (mxmlc). > > > >mxmlc > >>>>>> constructprop private:SomeClass (1) > >>>>>> coerce_a > >>>>>> jump L1 > > > >Falcon > >>>>>> constructprop private:SomeClass (1) > >>>>>> jump L1 > >>>>>> L0: findpropstrict private:SomeOtherClass > >>>>>> getlocal1 > >>>>>> constructprop private:SomeOtherClass (1) > >>>>>> L1: coerce_a > > > >Was the "jump L1" instruction before the coerce_a the issue? > > > > > >-Darrell > > > >On Oct 2, 2013, at 4:24 PM, Alex Harui <aha...@adobe.com> wrote: > > > >> The reducer method now calls > >>getAncestorOfType(IBinaryOperatorNode.class) > >> and then checks if the operator is OoperatorType.ASSIGNMENT and further > >> that the left node is a DynamicAccessNodel > >> > >> I think just checking parent isn't good enough for nested ternary > >> expressions. > >> > >> Coerce is being called in a few other reduction methods that may take > >>care > >> of the other scenarios you mention. If not, we'll add calls as needed. > >> > >> -Alex > >> > >> > >> On 10/2/13 1:18 PM, "Gordon Smith" <gosm...@adobe.com> wrote: > >> > >>> 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 > >>>>>>>>> > >>>>>>>>> > >>>>>>>> > >>>>>> > >>>>> > >>>> > >>> > >> > > > >