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

Reply via email to