From 3a96cc7c514d6bb0866a3340ca321cd5cdd6665f Mon Sep 17 00:00:00 2001 From: Alex Hoppen Date: Mon, 8 Nov 2021 21:10:36 +0100 Subject: [PATCH] [SourceKit] Use a deep stack to perform syntactic parsing Othwerise we were performing the syntactic parsing on a background queue that had a reduced stack size which could result in stack overflows. rdar://84474387 --- test/SourceKit/Misc/parser-cutoff.swift | 792 ++++++++++++++++++ tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp | 13 +- 2 files changed, 803 insertions(+), 2 deletions(-) create mode 100644 test/SourceKit/Misc/parser-cutoff.swift diff --git a/test/SourceKit/Misc/parser-cutoff.swift b/test/SourceKit/Misc/parser-cutoff.swift new file mode 100644 index 0000000000000..1f6f830e5b527 --- /dev/null +++ b/test/SourceKit/Misc/parser-cutoff.swift @@ -0,0 +1,792 @@ +func foo(a: Int) { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { +if a > 1 { + +// This used to stack overflow because syntactic parsing was performed on a background queue with reduced stack size. +// RUN: %sourcekitd-test -req=syntax-map %s -- %s \ No newline at end of file diff --git a/tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp b/tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp index 4a40ff412fc1f..72e8d078599f7 100644 --- a/tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp +++ b/tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp @@ -735,8 +735,17 @@ class SwiftDocumentSyntaxInfo { void parseIfNeeded() { if (!IsParsed) { - Parser->parse(); - IsParsed = true; + // Perform parsing on a deep stack that's the same size as the main thread + // during normal compilation to avoid stack overflows. + static WorkQueue BigStackQueue{ + WorkQueue::Dequeuing::Concurrent, + "SwiftDocumentSyntaxInfo::parseIfNeeded.BigStackQueue"}; + BigStackQueue.dispatchSync( + [this]() { + Parser->parse(); + IsParsed = true; + }, + /*isStackDeep=*/true); } }