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