[webkit-changes] [WebKit/WebKit] 3a9af6: [JSC] JSON.parse should use simple recursion until...

Yusuke Suzuki noreply at github.com
Fri May 5 19:35:08 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 3a9af61361977e1f775f847136d0cf239182c526
      https://github.com/WebKit/WebKit/commit/3a9af61361977e1f775f847136d0cf239182c526
  Author: Yusuke Suzuki <ysuzuki at apple.com>
  Date:   2023-05-05 (Fri, 05 May 2023)

  Changed paths:
    A JSTests/stress/JSON-parse-should-cache-array-lengths-complex.js
    A JSTests/stress/json-parse-256-complex.js
    A JSTests/stress/json-parse-array-prototype-is-array-assert-complex.js
    A JSTests/stress/json-parse-big-object-complex.js
    A JSTests/stress/json-parse-empty-objects-complex.js
    A JSTests/stress/json-parse-empty-objects.js
    A JSTests/stress/json-parse-on-frozen-object-complex.js
    A JSTests/stress/json-parse-reviver-array-proxy-complex.js
    A JSTests/stress/json-parse-reviver-revoked-proxy-complex.js
    A JSTests/stress/json-parse-syntax-complex.js
    A JSTests/stress/json-parse-very-nested-complex.js
    A JSTests/stress/json-parse-very-nested.js
    A LayoutTests/js/JSON-parse-reviver-complex-expected.txt
    A LayoutTests/js/JSON-parse-reviver-complex.html
    M LayoutTests/js/JSON-parse-reviver.html
    A LayoutTests/js/dom/JSON-parse-complex-expected.txt
    A LayoutTests/js/dom/JSON-parse-complex.html
    M LayoutTests/js/dom/JSON-parse.html
    M Source/JavaScriptCore/runtime/LiteralParser.cpp
    M Source/JavaScriptCore/runtime/LiteralParser.h
    M Source/JavaScriptCore/runtime/OptionsList.h
    M Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py

  Log Message:
  -----------
  [JSC] JSON.parse should use simple recursion until it hits soft-recursion threshold
https://bugs.webkit.org/show_bug.cgi?id=256349
rdar://108930906

Reviewed by Alexey Shvayka and Alexey Proskuryakov.

Let's do super simple JSON.parse until it hits soft-recursion threshold. Our existing code
handles JSON.parse without recursion, this is great, but it is very complicated. And most of
JSON can be parsed with recursion with the current stack capacity. Let's start with super
simple recursion path, and check soft stack limit carefully. And if we hit, then stop the
recursion and fallback to our generic code. Good thing is that JSON's leaf object creation
is isolated, so we can start this generic code at any time. We can repeatedly enter and exit
this.

                                                         ToT                     Patched

    vanilla-es2015-babel-webpack-todomvc-json-parse
                                                   63.0883+-0.1159     ^     58.6921+-0.1383        ^ definitely 1.0749x faster
    flight-todomvc-json-parse                      28.3211+-0.0977     ^     25.8927+-0.1618        ^ definitely 1.0938x faster
    vanilla-es2015-todomvc-json-parse              63.1916+-0.2224     ^     58.8631+-0.2339        ^ definitely 1.0735x faster
    vanilla-todomvc-json-parse                     46.7609+-0.1348     ^     43.9075+-0.1779        ^ definitely 1.0650x faster

* Source/JavaScriptCore/runtime/LiteralParser.cpp:
(JSC::LiteralParser<CharType>::tryJSONPParse):
(JSC::LiteralParser<CharType>::Lexer::next):
(JSC::LiteralParser<CharType>::parseRecursivelyEntry):
(JSC::LiteralParser<CharType>::parseRecursively):
(JSC::LiteralParser<CharType>::parse):
* Source/JavaScriptCore/runtime/LiteralParser.h:
(JSC::LiteralParser::tryLiteralParse):

Canonical link: https://commits.webkit.org/263744@main




More information about the webkit-changes mailing list