Commit f93c6930 authored by keuchel@chromium.org's avatar keuchel@chromium.org

Disallow function declarations in statement positions in harmony mode.

Review URL: http://codereview.chromium.org/8306025

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9657 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent bbe896a3
...@@ -1334,7 +1334,7 @@ Statement* Parser::ParseStatement(ZoneStringList* labels, bool* ok) { ...@@ -1334,7 +1334,7 @@ Statement* Parser::ParseStatement(ZoneStringList* labels, bool* ok) {
// FunctionDeclaration // FunctionDeclaration
// Common language extension is to allow function declaration in place // Common language extension is to allow function declaration in place
// of any statement. This language extension is disabled in strict mode. // of any statement. This language extension is disabled in strict mode.
if (top_scope_->is_strict_mode()) { if (top_scope_->is_strict_mode() || harmony_scoping_) {
ReportMessageAt(scanner().peek_location(), "strict_function", ReportMessageAt(scanner().peek_location(), "strict_function",
Vector<const char*>::empty()); Vector<const char*>::empty());
*ok = false; *ok = false;
......
...@@ -240,7 +240,7 @@ PreParser::Statement PreParser::ParseStatement(bool* ok) { ...@@ -240,7 +240,7 @@ PreParser::Statement PreParser::ParseStatement(bool* ok) {
i::Scanner::Location start_location = scanner_->peek_location(); i::Scanner::Location start_location = scanner_->peek_location();
Statement statement = ParseFunctionDeclaration(CHECK_OK); Statement statement = ParseFunctionDeclaration(CHECK_OK);
i::Scanner::Location end_location = scanner_->location(); i::Scanner::Location end_location = scanner_->location();
if (strict_mode()) { if (strict_mode() || harmony_scoping_) {
ReportMessageAt(start_location.beg_pos, end_location.end_pos, ReportMessageAt(start_location.beg_pos, end_location.end_pos,
"strict_function", NULL); "strict_function", NULL);
*ok = false; *ok = false;
......
...@@ -93,24 +93,15 @@ function f() { ...@@ -93,24 +93,15 @@ function f() {
{ {
function g1() { } function g1() { }
} }
// Non-strict statement positions.
if (true) function g2() { }
if (true) {} else function g3() { }
do function g4() { } while (false)
while (false) function g5() { }
label: function g6() { }
for (;false;) function g7() { }
switch (true) { case true: function g8() { } }
switch (true) { default: function g9() { } }
} }
f(); f();
// Test function declarations in statement position in strict mode. // Test function declarations in statement position in strict mode.
TestLocalThrows("function f() { 'use strict'; if (true) function g() {}", SyntaxError); TestLocalThrows("function f() { if (true) function g() {}", SyntaxError);
TestLocalThrows("function f() { 'use strict'; if (true) {} else function g() {}", SyntaxError); TestLocalThrows("function f() { if (true) {} else function g() {}", SyntaxError);
TestLocalThrows("function f() { 'use strict'; do function g() {} while (false)", SyntaxError); TestLocalThrows("function f() { do function g() {} while (false)", SyntaxError);
TestLocalThrows("function f() { 'use strict'; while (false) function g() {}", SyntaxError); TestLocalThrows("function f() { while (false) function g() {}", SyntaxError);
TestLocalThrows("function f() { 'use strict'; label: function g() {}", SyntaxError); TestLocalThrows("function f() { label: function g() {}", SyntaxError);
TestLocalThrows("function f() { 'use strict'; for (;false;) function g() {}", SyntaxError); TestLocalThrows("function f() { for (;false;) function g() {}", SyntaxError);
TestLocalThrows("function f() { 'use strict'; switch (true) { case true: function g() {} }", SyntaxError); TestLocalThrows("function f() { switch (true) { case true: function g() {} }", SyntaxError);
TestLocalThrows("function f() { 'use strict'; switch (true) { default: function g() {} }", SyntaxError); TestLocalThrows("function f() { switch (true) { default: function g() {} }", SyntaxError);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment