Index: test/cctest/test-parsing.cc |
diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc |
index 79d76546e90b117404d191bcf59bfa2f33ec5c20..7a07eab6d5afdd97ae32ef8f4e6f1a95c985ccd0 100644 |
--- a/test/cctest/test-parsing.cc |
+++ b/test/cctest/test-parsing.cc |
@@ -919,7 +919,7 @@ static int Utf8LengthHelper(const char* s) { |
} |
-TEST(ScopeUsesThisAndArguments) { |
+TEST(ScopeUsesArgumentsSuperThis) { |
static const struct { |
const char* prefix; |
const char* suffix; |
@@ -928,62 +928,66 @@ TEST(ScopeUsesThisAndArguments) { |
{ "var f = () => {", "}" }, |
}; |
+ enum Expected { |
+ NONE = 0, |
+ ARGUMENTS = 1, |
+ SUPER = 2, |
+ THIS = 4, |
+ INNER_ARGUMENTS = 8, |
+ INNER_SUPER = 16, |
+ INNER_THIS = 32 |
+ }; |
+ |
static const struct { |
const char* body; |
- bool uses_this; |
- bool uses_arguments; |
- bool inner_uses_this; |
- bool inner_uses_arguments; |
+ int expected; |
} source_data[] = { |
- { "", |
- false, false, false, false }, |
- { "return this", |
- true, false, false, false }, |
- { "return arguments", |
- false, true, false, false }, |
- { "return arguments[0]", |
- false, true, false, false }, |
- { "return this + arguments[0]", |
- true, true, false, false }, |
- { "return x => this + x", |
- false, false, true, false }, |
- { "this.foo = 42;", |
- true, false, false, false }, |
- { "this.foo();", |
- true, false, false, false }, |
- { "if (foo()) { this.f() }", |
- true, false, false, false }, |
- { "if (arguments.length) { this.f() }", |
- true, true, false, false }, |
- { "while (true) { this.f() }", |
- true, false, false, false }, |
- { "if (true) { while (true) this.foo(arguments) }", |
- true, true, false, false }, |
- // Multiple nesting levels must work as well. |
- { "while (true) { while (true) { while (true) return this } }", |
- true, false, false, false }, |
- { "if (1) { return () => { while (true) new this() } }", |
- false, false, true, false }, |
- // Note that propagation of the inner_uses_this() value does not |
- // cross boundaries of normal functions onto parent scopes. |
- { "return function (x) { return this + x }", |
- false, false, false, false }, |
- { "var x = function () { this.foo = 42 };", |
- false, false, false, false }, |
- { "if (1) { return function () { while (true) new this() } }", |
- false, false, false, false }, |
- { "return function (x) { return () => this }", |
- false, false, false, false }, |
- // Flags must be correctly set when using block scoping. |
- { "\"use strict\"; while (true) { let x; this, arguments; }", |
- false, false, true, true }, |
- { "\"use strict\"; if (foo()) { let x; this.f() }", |
- false, false, true, false }, |
- { "\"use strict\"; if (1) {" |
- " let x; return function () { return this + arguments }" |
- "}", |
- false, false, false, false }, |
- }; |
+ {"", NONE}, |
+ {"return this", THIS}, |
+ {"return arguments", ARGUMENTS}, |
+ {"return super()", SUPER}, |
+ {"return super.x", SUPER}, |
+ {"return arguments[0]", ARGUMENTS}, |
+ {"return this + arguments[0]", ARGUMENTS | THIS}, |
+ {"return this + arguments[0] + super.x", ARGUMENTS | SUPER | THIS}, |
+ {"return x => this + x", INNER_THIS}, |
+ {"return x => super() + x", INNER_SUPER}, |
+ {"this.foo = 42;", THIS}, |
+ {"this.foo();", THIS}, |
+ {"if (foo()) { this.f() }", THIS}, |
+ {"if (foo()) { super.f() }", SUPER}, |
+ {"if (arguments.length) { this.f() }", ARGUMENTS | THIS}, |
+ {"while (true) { this.f() }", THIS}, |
+ {"while (true) { super.f() }", SUPER}, |
+ {"if (true) { while (true) this.foo(arguments) }", ARGUMENTS | THIS}, |
+ // Multiple nesting levels must work as well. |
+ {"while (true) { while (true) { while (true) return this } }", THIS}, |
+ {"while (true) { while (true) { while (true) return super() } }", |
+ SUPER}, |
+ {"if (1) { return () => { while (true) new this() } }", INNER_THIS}, |
+ {"if (1) { return () => { while (true) new super() } }", INNER_SUPER}, |
+ // Note that propagation of the inner_uses_this() value does not |
+ // cross boundaries of normal functions onto parent scopes. |
+ {"return function (x) { return this + x }", NONE}, |
+ {"return function (x) { return super() + x }", NONE}, |
+ {"var x = function () { this.foo = 42 };", NONE}, |
+ {"var x = function () { super.foo = 42 };", NONE}, |
+ {"if (1) { return function () { while (true) new this() } }", NONE}, |
+ {"if (1) { return function () { while (true) new super() } }", NONE}, |
+ {"return function (x) { return () => this }", NONE}, |
+ {"return function (x) { return () => super() }", NONE}, |
+ // Flags must be correctly set when using block scoping. |
+ {"\"use strict\"; while (true) { let x; this, arguments; }", |
+ INNER_ARGUMENTS | INNER_THIS}, |
+ {"\"use strict\"; while (true) { let x; this, super(), arguments; }", |
+ INNER_ARGUMENTS | INNER_SUPER | INNER_THIS}, |
+ {"\"use strict\"; if (foo()) { let x; this.f() }", INNER_THIS}, |
+ {"\"use strict\"; if (foo()) { let x; super.f() }", INNER_SUPER}, |
+ {"\"use strict\"; if (1) {" |
+ " let x; return function () { return this + super() + arguments }" |
+ "}", |
+ NONE}, |
+ }; |
i::Isolate* isolate = CcTest::i_isolate(); |
i::Factory* factory = isolate->factory(); |
@@ -1013,6 +1017,7 @@ TEST(ScopeUsesThisAndArguments) { |
isolate->unicode_cache()}; |
i::Parser parser(&info, &parse_info); |
parser.set_allow_arrow_functions(true); |
+ parser.set_allow_classes(true); |
parser.set_allow_harmony_scoping(true); |
info.MarkAsGlobal(); |
parser.Parse(); |
@@ -1025,11 +1030,16 @@ TEST(ScopeUsesThisAndArguments) { |
CHECK_EQ(1, global_scope->inner_scopes()->length()); |
i::Scope* scope = global_scope->inner_scopes()->at(0); |
- CHECK_EQ(source_data[i].uses_this, scope->uses_this()); |
- CHECK_EQ(source_data[i].uses_arguments, scope->uses_arguments()); |
- CHECK_EQ(source_data[i].inner_uses_this, scope->inner_uses_this()); |
- CHECK_EQ(source_data[i].inner_uses_arguments, |
+ CHECK_EQ((source_data[i].expected & ARGUMENTS) != 0, |
+ scope->uses_arguments()); |
+ CHECK_EQ((source_data[i].expected & SUPER) != 0, scope->uses_super()); |
+ CHECK_EQ((source_data[i].expected & THIS) != 0, scope->uses_this()); |
+ CHECK_EQ((source_data[i].expected & INNER_ARGUMENTS) != 0, |
scope->inner_uses_arguments()); |
+ CHECK_EQ((source_data[i].expected & INNER_SUPER) != 0, |
+ scope->inner_uses_super()); |
+ CHECK_EQ((source_data[i].expected & INNER_THIS) != 0, |
+ scope->inner_uses_this()); |
} |
} |
} |