I don’t think so. Write one where? How? We already have a top level XML 
constructor.

Wouldn’t the compiler output:
XML(myXML)

as:
org.apache.flex.utils.Language.as(myXML,XML)?

I’m pretty sure the only way to instantiate an XML object is to use new.

Well, I just tried XML(myXMLList) and it does not call Language.as. It keeps 
the code exactly as it was and invokes the XML constructor with the XMLList as 
the parameter.

Of course that goes totally haywire this refers to window and none of the code 
makes any sense. I have no idea if a constructor can return something else in 
the middle of it. (i.e. if an XMLList is fed to the XML constructor, call 
toXML() on the XMLList and return that.)

Harbs

> On Jul 17, 2017, at 10:08 PM, Alex Harui <aha...@adobe.com.INVALID> wrote:
> 
> 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