Next batch of spec-compliance and compatibility issues
André Bargull
andrebargull at googlemail.com
Mon Apr 8 03:04:09 PDT 2013
And some bugs in JSONFunctions.
typeof JSON.parse('{}',function(){})
=> expected "undefined" instead of "object"
=> JSONFunctions#walk() looks a bit wrong.
Object.defineProperty(Object.prototype,"",{set:
function(v){print("called set")}})
JSON.parse('{}',function(){})
=> should not call the setter (use [[DefineOwnProperty]] instead of [[Put]])
Object.defineProperty(Object.prototype,"foo",{set:
function(v){print("called set")}})
JSON.parse('{"foo": 1}')
=> should not call the setter (use [[DefineOwnProperty]] instead of [[Put]])
On 4/8/2013 11:28 AM, André Bargull wrote:
> Instead of performance tips, some more bugs in NativeArray ;-)
>
> - André
>
>
> Object.defineProperty([],"length",{writable:false}).push(0)
> => should throw an exception (strict = true!)
>
> Object.defineProperty([],"length",{writable:false}).pop()
> => should throw an exception (strict = true!)
>
> Object.defineProperty([,,],"0",{writable:false}).reverse()
> => should throw an exception (strict = true!)
>
> Object.defineProperty([],"length",{writable:false}).shift()
> => should throw an exception (strict = true!)
>
> Array.prototype.sort() also calls ScriptObject#isStrictContext(), but
> implementations are allowed to use a custom behaviour if array index
> properties are non-writable/non-configurable. Nevertheless, I'd still
> remove isStrictContext() from this method...
>
> Object.defineProperty([],"length",{writable:false}).splice(0)
> => should throw an exception (strict = true!)
>
> Object.defineProperty([],"length",{writable:false}).unshift()
> => should throw an exception (strict = true!)
>
> [].concat([,]).hasOwnProperty("0")
> => should return false instead of true
>
> a = []; a[0x7fffffff]=1; a.sort()[0]
> => should return 1 instead of undefined
> (Unchecked conversion from long to int also present in
> NativeArray#splice() and NativeArray#slice())
>
> [2,1].sort(null)
> => should throw an exception (comparefn != undefined && not callable)
>
> [2,1].sort(function(x,y){return x<y?-Infinity:x>y?Infinity:0})+""
> => should return "1,2" instead of "2,1"
>
>
>
> On 4/8/2013 10:15 AM, Marcus Lagergren wrote:
>> Great. You are helping us a lot.
>>
>> Sundar is working on integrating everything you do as unit tests
>> after bugfixing.
>>
>> Another thing that we might point out at this time is that everything
>> in the "object" package is pretty much implemented according to
>> conform to spec, and just by messing around with the Java in there, I
>> believe there are significant speedups to be achieved in places. We
>> are continuously working to add performance here, so if you see
>> anything that's decidedly suboptimal while going through the builtin
>> object classes, performance fixes are of course also more than
>> welcome ;-) ;-)
>>
>> (Also, we are hiring :-D)
>>
>> /M
>>
>> On Apr 8, 2013, at 10:08 AM, André Bargull
>> <andrebargull at googlemail.com> wrote:
>>
>>> Hmm, actually this time it was just reviewing the source code and
>>> doing experience[1] based testing. For the mentioned ES6 test
>>> implementation, I'm using, in addition to the test262 test suite,
>>> also the SpiderMonkey test suites [2,3].
>>>
>>> - André
>>>
>>> [1] Rhino and more recently a custom ECMAScript6 test implementation
>>> [2] http://mxr.mozilla.org/mozilla-central/source/js/src/tests/
>>> [3] http://mxr.mozilla.org/mozilla-central/source/js/src/jit-test/
>>>
>>> On 4/8/2013 9:41 AM, Marcus Lagergren wrote:
>>>> You are a champion, André! Keep these tests coming :) If you are
>>>> using any particular test suite, we would definitely be interested
>>>> in using it. If you complete a third party contributor's agreement
>>>> we can help you get OpenJDK credit for fixes that result from this.
>>>>
>>>> Regards
>>>> Marcus
>>>>
>>>>
>>>> On Apr 8, 2013, at 9:33 AM, André Bargull
>>>> <andrebargull at googlemail.com> wrote:
>>>>
>>>>> Here are some more test cases which don't yet work as expected in
>>>>> Nashorn.
>>>>>
>>>>> - André
>>>>>
>>>>>
>>>>> var o = {a:1,b:2,c:3}; for (var x in o) {if (x=='a')delete o.b;
>>>>> print(x)}
>>>>> => should only print "a" and "b"
>>>>>
>>>>> 9223372036854775807|0
>>>>> => should return 0
>>>>>
>>>>> 9223372036854775807>>>0
>>>>> => should return 0 instead of 4294967295
>>>>>
>>>>> Also visible in other places where ToUint32() is used, e.g.
>>>>> Array.prototype.map.call({length: 9223372036854775807, get
>>>>> 0(){print("get 0")}}, function(){}).length
>>>>> => should return 0 instead of 4294967295
>>>>>
>>>>> parseInt("10",9223372036854775807)
>>>>> => should return 10 instead of NaN
>>>>>
>>>>> Array.prototype.map.call({length: -1, get 0(){throw 0}},
>>>>> function(){}).length
>>>>> => should throw instead of returning 4294967295
>>>>>
>>>>> parseInt("90071992547409990",10) === 90071992547409990
>>>>> => should return true
>>>>>
>>>>> escape("\0")
>>>>> => should return "%00" instead of "%0"
>>>>>
>>>>> "\471".charCodeAt(0)
>>>>> => should return 39 instead of 313
>>>>>
>>>>> 08in {}
>>>>> => should throw a syntax error
>>>>>
>>>>> "aa".split(undefined,0).length
>>>>> => should return 0 instead of 1
>>>>>
>>>>> "aa".split(/(a)/, 1).length
>>>>> => should return 1 instead of 2
>>>>>
>>>>> "abc".split("", 1).length
>>>>> => should return 1 instead of 3
>>>>>
>>>>> "aa".split((r = /a/, r.lastIndex = {valueOf:function(){throw 2}}, r))
>>>>> => should not throw an exception
>>>>>
>>>>> (function(a){ Object.defineProperty(arguments,"0",{get
>>>>> value(){print("get value"); return 0}}); return a })(1)
>>>>> => should print "get value" only once
>>>>>
>>>>> (function(k){ arguments[0]=1; return k })()
>>>>> => should return `undefined` instead of `1`
>>>>>
>>>>> (function(k){var a=eval("arguments"); return a[0]})(1)
>>>>> => should return `1` instead of `undefined`
>>>>>
>>>>> "abc".replace("c", function(){return "$&"})
>>>>> => should return "a$&c" instead of "abc"
>>>>>
>>>>>
>>>>> And some miscellaneous RegExp compatibility issues:
>>>>>
>>>>> /\471/.test("\x271")
>>>>> => should return true
>>>>>
>>>>> /\08/.test("\x008")
>>>>> => should return true instead of throwing an exception
>>>>>
>>>>> /\8/.test("\\8")
>>>>> => should return true instead of false
>>>>>
>>>>> /[]|[^]/.test("a")
>>>>> => should return true instead of false
>>>>>
>>>>> /(?![])/.test("")
>>>>> => should return true instead of false
>>>>>
>>>>> /(?=a){2}aa/.test("aaa")
>>>>> => web compatibility issue (quantifier allowed after positive
>>>>> lookahead)
>>>>>
>>>>> /(?!a){2}bb/.test("bbb")
>>>>> => web compatibility issue (quantifier allowed after negative
>>>>> lookahead)
>>>>>
>>>>> /(?!(a))(?!\1)b/.test("b")
>>>>> => returns true but should return false
>>>>>
>>>>> /\cı/.test("\x09")
>>>>> => should return false instead of true
>>>>>
>>>>> /\cſ/.test("\x13")
>>>>> => should return false instead of true
>>>>>
>>>>> /[\c0]/.test("\x10")
>>>>> => should return true instead of false
>>>>>
>>>>> /[\c_]/.test("\x1F")
>>>>> => should return true instead of false
>>>>>
>>>>> /[\c#]/.test("\\")
>>>>> => should return true instead of false
>>>>>
>>>>> RegExp("[\0]").test("\0")
>>>>> => should not throw SyntaxError
>>>>>
>>>>> /[&&]/.test("&")
>>>>> => should not throw SyntaxError
>>>>>
>>>>> /[[&[]/.test("&")
>>>>> => should return true instead of false
>>>>>
>>>>> /[ [^]/.test("a")
>>>>> => should return false instead of true
>>>>>
>>>>> /[^\S\s]/.test(" ")
>>>>> => should return false instead of true
>>>>>
>>>>> /[\2]/.test("\x02")
>>>>> => should return true instead of false
>>>>>
>>>>> /[\0-\s]/.test("\x01")
>>>>> => should throw a SyntaxError (given that /[a-\d]/ also throws a
>>>>> SyntaxError in Nashorn, but compare SpiderMonkey vs. JSC/V8)
>>>>>
>>>>>
>>>>> And two more less easy to fix RegExp bugs:
>>>>>
>>>>> /(?:(f)(o)(o)|(b)(a)(r))*/.exec("foobar").toString()
>>>>> => should return "foobar,,,,b,a,r" instead of "foobar,f,o,o,b,a,r"
>>>>>
>>>>> /(a|b*)*/.exec("aab").toString()
>>>>> => should return "aab,b" instead of "aab,"
>>
>
More information about the nashorn-dev
mailing list