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