My test case covered what I found (assertEquals("" + xml.Baz.text(), "","An
empty node should return an empty string”);)
Here’s another case which I did not retest after my changes:
var xml = <xml><Properties name="baz"><foo/></Properties></xml>;
var props:XMLList = xml.Properties;
trace(props.length())// 1
var bar:XMLList = xml.Bar;
if(bar && bar != ""){
trace("bar should not be undefined and we should not get here!!!");
}
> On Jul 4, 2022, at 4:56 PM, Greg Dove <[email protected]> wrote:
>
> Thanks Harbs. By coincidence, I was actually intending to work on exactly
> the same thing tomorrow local time, because Yishay encountered something
> similar and I also wanted to create a failing test to fix.
>
> It's definitely a bit tricky. iirc it was something like this:
>
> var list:XMLList;
>
> list == null ; // not surprising
> var node:XML = <xml/>;
> list = node.@nonexistent;
>
> list == undefined // true
> list == null // false, failing I think at the moment in js
> 'test' + list +'test' == 'testtest'//this I had captured in prep also and
> I think this is what you covered? There was another case where
> Language.string was causing it I think also, which I had asked Yishay for
> the example of just a few hours ago.
>
> If you see any more related to this please feel free to add failing tests
> marked with ignore Metadata for now and I will happily work on them.
>
>
>
>
> On Tue, 5 Jul 2022, 12:32 am Harbs, <[email protected]> wrote:
>
>> I just made a commit which should do the right thing vis a vis both
>> undefined and empty strings.
>>
>> I added a test for the additional case and all existing tests still pass...
>>
>>> On Jul 4, 2022, at 2:28 PM, Harbs <[email protected]> wrote:
>>>
>>> It’s because valueOf of XMLList was changed.
>>>
>>> For reference, this passed in Flash and fails in JS:
>>>
>>> public function emptyStringify():void{
>>> var xml:XML = <Foo><Baz/></Foo>;
>>> assertEquals("" + xml.Baz.text(), "","An empty node should
>> return an empty string");
>>> }
>>>
>>>
>>>
>>>
>>>> On Jul 4, 2022, at 2:01 PM, Harbs <[email protected]> wrote:
>>>>
>>>> There’s more xml problems.
>>>>
>>>> Coercing empty xml to a string used to result in an empty string. It
>> now results in “undefined”.
>>>>
>>>> i.e.
>>>>
>>>> var xml:XML = <Foo><Baz/></Foo>;
>>>> '' + xml.Baz.text()
>>>>
>>>> I believe we used to get “”, and now we get “undefined”.
>>>>
>>>>> On Jun 27, 2022, at 6:44 AM, Greg Dove <[email protected]> wrote:
>>>>>
>>>>> Sorry about that, Harbs.
>>>>>
>>>>> "I’m guessing XML(_children[i]) really was meant to be: (_children[i]
>> as
>>>>> XML)..."
>>>>>
>>>>> That was some time ago, but I also think you are correct with the
>> guess.
>>>>>
>>>>> I probably had a momentary lapse of thought and forgot that
>>>>> XML(something) ]
>>>>> does not get ignored by @royaleignorecoercion XML, and that you need
>>>>> instead to always use
>>>>> "as XML"
>>>>> for @royaleignorecoercion to work with XML. I think Array is similar in
>>>>> this regard, with the native 'class' being a top level function.
>>>>>
>>>>> In general I have added more of these explicit coercions because the
>>>>> framework has a lot of compiler switch tweaks which sometimes makes it
>>>>> unworkable to copy and paste the framework code as a monkey patch
>> alongside
>>>>> external project code. By adding the explicit coercion and the
>>>>> "royaleignoring" it, there is no implicit coercion code generated under
>>>>> default compiler behaviour, for example, so it makes a default compiler
>>>>> settings build closer to the framework settings build of it.
>>>>> I find this use of monkey patching to be any easy way to test changes
>> to
>>>>> many framework classes in the context of their actual usage, as it
>> avoids
>>>>> recompiling the library first to test small changes each time, before
>>>>> ultimately bringing the changes back into the library code.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Mon, Jun 27, 2022 at 3:19 AM Harbs <[email protected]> wrote:
>>>>>
>>>>>> I changed the class to allow subclassing.
>>>>>>
>>>>>> I don’t think I messed anything up. I’m guessing XML(_children[i])
>> really
>>>>>> was meant to be: (_children[i] as XML)...
>>>>>>
>>>>>> Harbs
>>>>>>
>>>>>>> On Jun 26, 2022, at 6:09 PM, Harbs <[email protected]> wrote:
>>>>>>>
>>>>>>> I just noticed that the changes to XML using XML.conversion broke my
>> app.
>>>>>>>
>>>>>>> I have an optimization where I subclass XML and override toString and
>>>>>> toXMLString so there’s no need to create, parse and convert many
>> parts of
>>>>>> XML which don’t need that.
>>>>>>>
>>>>>>> I call it StringXML.
>>>>>>>
>>>>>>> This code:
>>>>>>>
>>>>>>
>> strArr.push(XML.conversion(this._children[i])._toXMLString(nextIndentLevel,
>>>>>> declarations.concat(ancestors)));
>>>>>>>
>>>>>>> causes my instance to go through XML.conversion and ends up with
>> this:
>>>>>> return new XML(xml); where xml is a StringXML.
>>>>>>>
>>>>>>> That obviously does not work.
>>>>>>>
>>>>>>> What is the purpose of calling conversion on an XML node?
>>>>>>>
>>>>>>> That’s caused by
>>>>>>
>> strArr.push(XML(_children[i])._toXMLString(nextIndentLevel,declarations.concat(ancestors)));
>>>>>>>
>>>>>>> The compiler changes XML to XML.conversion.
>>>>>>>
>>>>>>> I don’t understand why that change was made.
>>>>>>>
>>>>>>> The code originally looked like:
>>>>>>>
>>>>>>>
>>>>>>
>> strArr.push(_children[i].toXMLString(nextIndentLevel,ancestors.concat(declarations)));
>>>>>>>
>>>>>>> Greg, any input?
>>>>>>
>>>>>>
>>>>
>>>
>>
>>