[JSC] Eagerly build AST for likely IIFEs
709e4e7
Source/JavaScriptCore/parser/ParserArena.h
-class ParserArenaRoot {
- ParserArenaRoot(ParserArena&&);
- ParserArena m_arena;
+class ParserArenaRoot {
+ explicit ParserArenaRoot(Ref<ParserArena>&&);
+ Ref<ParserArena> m_arena;
JSC의 parser는 두 단계 전략을 채택하고 있습니다. 초기에는 빠른 syntax 검사만 수행하고 AST 전체 구성을 생략합니다. Full AST가 생성되는 시점은 함수가 실제로 컴파일될 때뿐입니다. IIFE는 이 전략에 맞지 않습니다. 즉시 호출되는 특성상 초기 scan이 순수한 overhead에 그치기 때문입니다.
이 commit은 새로운 heuristic을 도입했습니다. function 키워드 앞에 ( 또는 !가 오는 경우, parser는 즉시 full AST를 생성하고 source offset을 키로 하는 새로운 EagerIIFERegistry에 저장합니다. 이후 Parser::parse()가 호출되면 먼저 registry를 조회하고, 일치하는 항목이 있을 경우 re-parsing을 생략합니다.
이를 위한 supporting refactor로 ParserArena의 소유 방식도 변경되었습니다. 기존에는 각 ParserArenaRoot가 arena를 독점 소유했지만, 이제는 ref-counted shared 방식(Ref<ParserArena>)으로 전환되었습니다. eagerly 생성된 IIFE FunctionNode는 이를 촉발한 outer parse의 arena보다 더 오래 생존해야 하기 때문입니다.
Significance
CommonJS module wrapper나 legacy bundle처럼 IIFE가 많은 코드는 parse 단계에서 성능 향상을 얻을 수 있습니다. 한편 arena lifetime에 대한 refactor는 parser의 핵심 데이터 구조를 다루는 만만치 않은 변경입니다.
Audit directions
a Aaaaaaaaaaaaaaa Aaaaaaaaaaaa Aaaaaaaaaaaaaa Aaaaaaaaaaaa Aaaaaaaaaa Aaaaaaaaaaaaaaaaa Aaaaaaaaaa Aaa Aaaaaaaa Aaa Aaa a Aa Aaaaaa Aa Aaa Aaaa Aaa a Aa Aaa Aaaa Aaa Aaaa Aaaaaa Aaaa Aaa Aaaa Aaa Aaaa Aaaaa
a Aaaaaaaaaaaaaaaaaaaaa Aaaaa Aaaaaaaaaaaaaa Aaaaaaaaa Aaaaaa Aaaaaaa Aaaaaaaaa Aaaaaaaaaaaaaaa Aaaaaa Aaaaaaaaaa Aa Aaaa Aaa Aa a Aaaaa Aa Aa Aaaaa Aa Aa Aaa Aa Aaaa Aa Aaaaaa Aa Aa Aaa Aa Aaa Aaaa Aaaa Aaaa Aaaaa Aa Aaaaa Aaaa Aaaa Aaaa Aaaaaaaa Aa Aaa Aaaa Aaaaa Aaa Aa Aa Aa Aaa Aaaa Aaaa Aaaa
a Aaaaaaaaaaaaaaaaaaaaaaa Aaaaa Aaaaaaaaaaaaaa Aaaaa Aaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaa Aaa a Aaaaaa Aaa Aaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aa Aa Aaaa Aaaaaaaaaaa Aaaaa Aaaaaa Aaa Aaaaa Aaaaaaaa Aaaa Aaaaa Aaaa Aaaa
🔒The arena ownership refactor and new AST cache introduce lifetime and state-restoration edge cases worth auditing.
더 확인하려면 구독해 주세요