ASSERTION FAILED: "We should only declare a function as a lexically scoped variable...
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 3 Jun 2017 11:24:45 +0000 (11:24 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 3 Jun 2017 11:24:45 +0000 (11:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=168844

Reviewed by Saam Barati.

JSTests:

* modules/async-function-export.js: Added.
(f):
(export.async.f):

Source/JavaScriptCore:

As the same to the exported function declaration, we should set statementDepth = 1 for exported async function declaration.

* parser/Parser.cpp:
(JSC::DepthManager::DepthManager):
(JSC::Parser<LexerType>::parseExportDeclaration):
* parser/Parser.h:
(JSC::Parser::DepthManager::DepthManager): Deleted.
(JSC::Parser::DepthManager::~DepthManager): Deleted.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@217755 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JSTests/ChangeLog
JSTests/modules/async-function-export.js [new file with mode: 0644]
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/parser/Parser.cpp
Source/JavaScriptCore/parser/Parser.h

index 4314251..22994ef 100644 (file)
@@ -1,5 +1,16 @@
 2017-06-02  Yusuke Suzuki  <utatane.tea@gmail.com>
 
+        ASSERTION FAILED: "We should only declare a function as a lexically scoped variable in scopes where var declarations aren't allowed. ..." for function redeclaration with async function module export
+        https://bugs.webkit.org/show_bug.cgi?id=168844
+
+        Reviewed by Saam Barati.
+
+        * modules/async-function-export.js: Added.
+        (f):
+        (export.async.f):
+
+2017-06-02  Yusuke Suzuki  <utatane.tea@gmail.com>
+
         ES2015 modules - Export default function hoisting
         https://bugs.webkit.org/show_bug.cgi?id=170174
 
diff --git a/JSTests/modules/async-function-export.js b/JSTests/modules/async-function-export.js
new file mode 100644 (file)
index 0000000..e00d3b1
--- /dev/null
@@ -0,0 +1,5 @@
+function f()
+{
+}
+
+export async function f() { }
index 72af8a2..2421a94 100644 (file)
@@ -1,3 +1,19 @@
+2017-06-02  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        ASSERTION FAILED: "We should only declare a function as a lexically scoped variable in scopes where var declarations aren't allowed. ..." for function redeclaration with async function module export
+        https://bugs.webkit.org/show_bug.cgi?id=168844
+
+        Reviewed by Saam Barati.
+
+        As the same to the exported function declaration, we should set statementDepth = 1 for exported async function declaration.
+
+        * parser/Parser.cpp:
+        (JSC::DepthManager::DepthManager):
+        (JSC::Parser<LexerType>::parseExportDeclaration):
+        * parser/Parser.h:
+        (JSC::Parser::DepthManager::DepthManager): Deleted.
+        (JSC::Parser::DepthManager::~DepthManager): Deleted.
+
 2017-06-02  Keith Miller  <keith_miller@apple.com>
 
         Defer installing mach breakpoint handler until watchdog is actually called
index 9b45da7..645525b 100644 (file)
@@ -170,6 +170,14 @@ public:
         : SetForScope<bool>(scope->m_isGenerator, shouldParseAsGenerator) { }
 };
 
+struct DepthManager : private SetForScope<int> {
+public:
+    DepthManager(int* depth)
+        : SetForScope<int>(*depth, *depth)
+    {
+    }
+};
+
 template <typename LexerType>
 Parser<LexerType>::~Parser()
 {
@@ -3319,11 +3327,14 @@ template <class TreeBuilder> TreeStatement Parser<LexerType>::parseExportDeclara
             result = parseClassDeclaration(context, ExportType::Exported);
             break;
 
-        case ASYNC:
+        case ASYNC: {
             next();
             semanticFailIfFalse(match(FUNCTION) && !m_lexer->prevTerminator(), "Expected 'function' keyword following 'async' keyword with no preceding line terminator");
+            DepthManager statementDepth(&m_statementDepth);
+            m_statementDepth = 1;
             result = parseAsyncFunctionDeclaration(context, ExportType::Exported);
             break;
+        }
 
         default:
             failWithMessage("Expected either a declaration or a variable statement");
index 2a6c256..29173ab 100644 (file)
@@ -1808,23 +1808,6 @@ private:
     RefPtr<ModuleScopeData> m_moduleScopeData;
     DebuggerParseData* m_debuggerParseData;
     CallOrApplyDepthScope* m_callOrApplyDepthScope { nullptr };
-
-    struct DepthManager {
-        DepthManager(int* depth)
-        : m_originalDepth(*depth)
-        , m_depth(depth)
-        {
-        }
-        
-        ~DepthManager()
-        {
-            *m_depth = m_originalDepth;
-        }
-        
-    private:
-        int m_originalDepth;
-        int* m_depth;
-    };
 };