← All issues

[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보다 더 오래 생존해야 하기 때문입니다.

CommonJS module wrapper나 legacy bundle처럼 IIFE가 많은 코드는 parse 단계에서 성능 향상을 얻을 수 있습니다. 한편 arena lifetime에 대한 refactor는 parser의 핵심 데이터 구조를 다루는 만만치 않은 변경입니다.

🔒

The arena ownership refactor and new AST cache introduce lifetime and state-restoration edge cases worth auditing.

더 확인하려면 구독해 주세요