Revision: 9657
Author: [email protected]
Date: Mon Oct 17 04:59:08 2011
Log: Disallow function declarations in statement positions in harmony
mode.
Review URL: http://codereview.chromium.org/8306025
http://code.google.com/p/v8/source/detail?r=9657
Modified:
/branches/bleeding_edge/src/parser.cc
/branches/bleeding_edge/src/preparser.cc
/branches/bleeding_edge/test/mjsunit/harmony/block-let-declaration.js
=======================================
--- /branches/bleeding_edge/src/parser.cc Mon Oct 17 02:29:37 2011
+++ /branches/bleeding_edge/src/parser.cc Mon Oct 17 04:59:08 2011
@@ -1334,7 +1334,7 @@
// FunctionDeclaration
// Common language extension is to allow function declaration in
place
// 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",
Vector<const char*>::empty());
*ok = false;
=======================================
--- /branches/bleeding_edge/src/preparser.cc Wed Oct 12 05:23:06 2011
+++ /branches/bleeding_edge/src/preparser.cc Mon Oct 17 04:59:08 2011
@@ -240,7 +240,7 @@
i::Scanner::Location start_location = scanner_->peek_location();
Statement statement = ParseFunctionDeclaration(CHECK_OK);
i::Scanner::Location end_location = scanner_->location();
- if (strict_mode()) {
+ if (strict_mode() || harmony_scoping_) {
ReportMessageAt(start_location.beg_pos, end_location.end_pos,
"strict_function", NULL);
*ok = false;
=======================================
--- /branches/bleeding_edge/test/mjsunit/harmony/block-let-declaration.js
Wed Oct 12 05:23:06 2011
+++ /branches/bleeding_edge/test/mjsunit/harmony/block-let-declaration.js
Mon Oct 17 04:59:08 2011
@@ -93,24 +93,15 @@
{
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();
// Test function declarations in statement position in strict mode.
-TestLocalThrows("function f() { 'use strict'; if (true) function g() {}",
SyntaxError);
-TestLocalThrows("function f() { 'use strict'; if (true) {} else function
g() {}", SyntaxError);
-TestLocalThrows("function f() { 'use strict'; do function g() {} while
(false)", SyntaxError);
-TestLocalThrows("function f() { 'use strict'; while (false) function g()
{}", SyntaxError);
-TestLocalThrows("function f() { 'use strict'; label: function g() {}",
SyntaxError);
-TestLocalThrows("function f() { 'use strict'; for (;false;) function g()
{}", SyntaxError);
-TestLocalThrows("function f() { 'use strict'; switch (true) { case true:
function g() {} }", SyntaxError);
-TestLocalThrows("function f() { 'use strict'; switch (true) { default:
function g() {} }", SyntaxError);
+TestLocalThrows("function f() { if (true) function g() {}", SyntaxError);
+TestLocalThrows("function f() { if (true) {} else function g() {}",
SyntaxError);
+TestLocalThrows("function f() { do function g() {} while (false)",
SyntaxError);
+TestLocalThrows("function f() { while (false) function g() {}",
SyntaxError);
+TestLocalThrows("function f() { label: function g() {}", SyntaxError);
+TestLocalThrows("function f() { for (;false;) function g() {}",
SyntaxError);
+TestLocalThrows("function f() { switch (true) { case true: function g() {}
}", SyntaxError);
+TestLocalThrows("function f() { switch (true) { default: function g() {}
}", SyntaxError);
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev