Collaboration on Standards in JSC: A Cross-Organizational Update
by Ross Kirsling (Sony), Yusuke Suzuki (Apple), Caio Lima (Igalia), and Alexey Shvayka (Igalia) Deck
This has been a very fruitful year of community-wide collaboration within JSC. We’ll give you the latest on how we’ve been working together, the features and improvements we’ve implemented in 2020, and what we hope to accomplish in the year to come.
Ross: I think we had a successful contributing with standards and trying to be as conformant as possible.
Ross: We have had a more balanced participation in Source/JavaScriptCore in 2019-2020 in the last year. In the last year more contributions have been done by non-apple contributors. Slack has been great for our communication on the JSC part of the project. There’s also a biweekly OSS staff meeting.
Ross: The rest of the presentation is focused on standards-related work in the JSC team.
Ross: But there are cases where we use our knowledge and work in JSC to help contribute to standards work.
Alexey: Today we have an all time high on test262 (JS spec test suite)
Alexey: Overall we have an 85% pass rate up from 80% in 2019
Alexey: There have been a number of notable fixes in the last year. Keith (me) fixei unescaped astral literals in indentifiers. Saam fixed Array.prototype to work with indicies beyond 232
Alexey: ProxyObject has been improved such as trap failures, relection, in the prototype chain, etc.
Alexey: Early errors for unicode RegExps
Alexey: DefineOwnProperty no longer corrupts property name order (for-in)
Alexey: Classes no longer rely on `_proto_ ops handle IsHTMLDDA correctly
Alexey: Array.prototype.sort was aligned with the new tightened spec.
Alexey: Ross aligned TypedArray internal and prototype methods with the spec (while at the same time fixing the spec)
Caio: Public and private fields are currently a stage 3 proposal in TC-39
Caio: In the last year Safari shipped with public fields
Caio: With fields the constructor of a class will install each of the fields in the class onto the object it creates
Caio: Private fields are a bit different because the identifier is only accessible from inside the lexical scope of the class definition
Caio: Igalia has been working on this and has also been working on other class features.
Ross: Were you also gonig to tell us about BigInt?
Caio: Robin and I have been working on BigInt over the last year
Caio: BigInts are similar to numbers in JS but they have infinite precision. i.e. when you go over 253 with BigInt you will not lose precision.
Ross: New 262 features.
Yusuke: WeakRef and FinalizationRegistry, implemented by Keith (me)
Yususke: With WeakRef, it’s now possible to create a weak map where the values are held weakly
Yusuke: In fact we are already using WeakRef in the WebInspector
Ross: Short-circuiting assignment operators.
Ross: This proposal was delayed until the nullish coalesing feature has been shipped.
Ross: short ciruiting assignment was implemented by Devin
Ross: String.prototype.replaceAll does what you would have expected replace all along.
Ross: Previously if you didn’t use the global flag on a regexp or used a string regexp replace would only replace the first occurrance
Ross: Array.prototype.at (originally, proposed as Array.prototype.item)
Ross: has an advantage for access because it works with negative indicies
Yusuke: Intl
Yusuke: We went from 37% conformance to 98% conformance
Yusuke: Ross and I worked closely on getting everything working. Included work with ICU, perf, and new feature work.
Yusuke: * describes all the new Intl features we have shipped *
Yusuke: New Webassembly features this year are mutable Globals
Ross: Looking ahead to 2021 we want to get to 90% pass rate on test262. The important part here isn’t just to get 90% but rather that we want to establish 90% as our new baseline and continually improve on that
Caio: We also want to continue our class properties work to implement private methods
Caio: Not limited to just functions but also can include private getters and setters
Caio: Last but not least we also want to add static class fields and static private methods
Yusuke: We have also re-enabled SharedArrayBuffer and Atomics in the build and in testers
Yusuke: We also want to add Top-level await. This lets us put the await expression at the top level of module code.
Yusuke: Another module feature we want is to have modules in workers
Yusuke: And many more features all coming soon!
Yusuke: We also hope to have more collaboration and build on the progress we have made this year
Questions & Comments
Saam: Where are we at in test262 conformance again?
Ross: Roughly we are at 85%
Ryosuke: Is private class fields enabled in safari 14
Yusuke: Private fields just landed a few minutes ago so no
Ryosuke: I’m excited for this feature so I hope we can get it done soon
Caio: We still needed to add some JIT work for private fields and hopefully we can get that done soon
Saam: We should just turn it on
Yusuke: This is a good time to enable it because it gives us a chance to get feedback
Caio: We need to do some work on field initialization but it shouldn’t block private fields because it didn’t block public fields
Ryosuke: In order for the fuzzer to run with it we need to enable it somewhere e.g. WebKitTestRunner
Yusuke: We need to add support private fields syntax in the fuzzer but shouldn’t be too hard
Ryosuke: For each JSC feature we now want to have significant fuzzing for each new feature before shipping
Yusuke: We can also enable the feature in our fuzzers without enabling by default
Ryosuke: To clarify on what we want to fuzz we want to fuzz everything that could be used to exploit JSC
Saam: Fortunately, for most features outside syntax, fuzzer will just test it
Yusuke: Yeah, for things like changes to DFG the fuzzer will find it because it will build off all the JSC tests