I thought we (you) already wrote one.  If not, we won't we need one?

-Alex

On 7/17/17, 12:01 PM, "Harbs" <harbs.li...@gmail.com> wrote:

>Thanks for the pointer.
>
>I changed the emitter to output indexed access. It seems to work. :-)
>(committed)
>
>I’m not sure what you mean about the top level XML function. How does
>that work in Javascript?
>
>> On Jul 17, 2017, at 7:47 PM, Alex Harui <aha...@adobe.com.INVALID>
>>wrote:
>> 
>> You can try #2 by changing ForEachEmitter.java.
>> 
>> For the general problem, we should probably just use the XML() top-level
>> function to "coerce" XMLList to XML.
>> 
>> My 2 cents,
>> -Alex
>> 
>> On 7/17/17, 9:23 AM, "Harbs" <harbs.li...@gmail.com> wrote:
>> 
>>> That is a fourth option.
>>> 
>>> In terms of overhead, option #2 is probably cheapest and option #4 is
>>> probably most expensive.
>>> 
>>> What’s the difference in terms of difficulty of changing the compiler?
>>> 
>>> I agree with the general problem. It could be that we should to a
>>> function to XMLList toXML() (or something like that) where it would
>>> return an XML element if it’s a single and throw an error otherwise.
>>>Then
>>> anytime there is an XMLList assignment to XML, the compiler could add
>>> .toXML().
>>> 
>>> Harbs
>>> 
>>>> On Jul 17, 2017, at 7:11 PM, Alex Harui <aha...@adobe.com.INVALID>
>>>> wrote:
>>>> 
>>>> IMO, this points out a generic problem where in ActionScript:
>>>> 
>>>> var harbs:XML = SomeXMLListWithOneElement;
>>>> 
>>>> would auto-coerce the XMLList to XML by grabbing the one element.  So
>>>>we
>>>> have to deal with that some day.  But there is probably a quick fix in
>>>> the
>>>> generated code for "for each" where we just generate:
>>>> 
>>>> var foo = foreachiter57_target.child(foreachiter57)[0];
>>>> 
>>>> 
>>>> Thoughts?
>>>> -Alex
>>>> 
>>>> On 7/17/17, 3:40 AM, "Harbs" <harbs.li...@gmail.com> wrote:
>>>> 
>>>>> I discovered an issue with “for each” in the XML classes:
>>>>> 
>>>>> Currently, for each does the following:
>>>>> 
>>>>> The following AS code:
>>>>> 
>>>>> var fooList:XMLList = getFooList();
>>>>> for each(var foo:XML in fooList){
>>>>>   doSomethingWithFoo(foo);
>>>>> }
>>>>> 
>>>>> outputs the following JS:
>>>>> 
>>>>> var /** @type {XMLList} */ fooList = this.getFooList();
>>>>> var foreachiter57_target = fooList;
>>>>> for (var foreachiter57 in foreachiter57_target.elementNames())
>>>>> {
>>>>> var foo = foreachiter57_target.child(foreachiter57);
>>>>> {
>>>>> this.doSomethingWithFoo(foo);
>>>>> }}
>>>>> 
>>>>> The problem is with the line:
>>>>> var foo = foreachiter57_target.child(foreachiter57);
>>>>> 
>>>>> foo should be of type XML. According to the ECMA spec for E4X,
>>>>> XML.prototype.child and XMLList.prototype.child both ALWAYS return an
>>>>> XMLList and not an XML object. This is true even if the argument fed
>>>>> into
>>>>> child is an integer. So myXMLList.child(“0”) will return an XMLList
>>>>> with
>>>>> one XML element which is the first element of the original XMLList.
>>>>>We
>>>>> need the actual XML object at the specified index without the XMLList
>>>>> wrapper.
>>>>> 
>>>>> There are three ways I can see to fix this problem:
>>>>> 
>>>>> 1. Ignore the spec and return an XML object when the argument is an
>>>>> integer.
>>>>> 2. Change the compiler output to: var foo =
>>>>> foreachiter57_target[foreachiter57]; Bracket access to XMLList
>>>>>returns
>>>>> an
>>>>> XML object.
>>>>> 3. Add a new function to use instead of child() (i.e. getChild()).
>>>>> 
>>>>> Thoughts?
>>>>> 
>>>>> Harbs
>>>> 
>>> 
>> 
>

Reply via email to