OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 6640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6651 CHECK(!try_catch.HasCaught()); | 6651 CHECK(!try_catch.HasCaught()); |
6652 | 6652 |
6653 const char* script2 = | 6653 const char* script2 = |
6654 "\"use strong\"; \n" | 6654 "\"use strong\"; \n" |
6655 "my_var; \n"; | 6655 "my_var; \n"; |
6656 CompileRun(v8_str(script2)); | 6656 CompileRun(v8_str(script2)); |
6657 CHECK(!try_catch.HasCaught()); | 6657 CHECK(!try_catch.HasCaught()); |
6658 } | 6658 } |
6659 | 6659 |
6660 | 6660 |
6661 TEST(StrongModeFreeVariablesNotDeclared) { | |
6662 i::FLAG_strong_mode = true; | |
6663 v8::V8::Initialize(); | |
6664 v8::HandleScope scope(CcTest::isolate()); | |
6665 v8::Context::Scope context_scope(v8::Context::New(CcTest::isolate())); | |
6666 v8::TryCatch try_catch(CcTest::isolate()); | |
6667 | |
6668 // Test that referencing unintroduced variables in sloppy mode is ok. | |
6669 const char* script1 = | |
6670 "if (false) { \n" | |
6671 " not_there1; \n" | |
6672 "} \n"; | |
6673 CompileRun(v8_str(script1)); | |
6674 CHECK(!try_catch.HasCaught()); | |
6675 | |
6676 // But not in strong mode. | |
6677 { | |
6678 const char* script2 = | |
6679 "\"use strong\"; \n" | |
6680 "if (false) { \n" | |
6681 " not_there2; \n" | |
6682 "} \n"; | |
6683 v8::TryCatch try_catch2(CcTest::isolate()); | |
6684 v8_compile(v8_str(script2)); | |
6685 CHECK(try_catch2.HasCaught()); | |
6686 v8::String::Utf8Value exception(try_catch2.Exception()); | |
6687 CHECK_EQ(0, | |
6688 strcmp( | |
6689 "ReferenceError: In strong mode, using an undeclared global " | |
6690 "variable 'not_there2' is not allowed", | |
6691 *exception)); | |
6692 } | |
6693 | |
6694 // Check that the variable reference is detected inside a strong function too, | |
6695 // even if the script scope is not strong. | |
6696 { | |
6697 const char* script3 = | |
6698 "(function not_lazy() { \n" | |
6699 " \"use strong\"; \n" | |
6700 " if (false) { \n" | |
6701 " not_there3; \n" | |
6702 " } \n" | |
6703 "})(); \n"; | |
6704 v8::TryCatch try_catch2(CcTest::isolate()); | |
6705 v8_compile(v8_str(script3)); | |
6706 CHECK(try_catch2.HasCaught()); | |
6707 v8::String::Utf8Value exception(try_catch2.Exception()); | |
6708 CHECK_EQ(0, | |
6709 strcmp( | |
6710 "ReferenceError: In strong mode, using an undeclared global " | |
6711 "variable 'not_there3' is not allowed", | |
6712 *exception)); | |
6713 } | |
6714 } | |
6715 | |
6716 static const ParserFlag kAllDestructuringFlags[] = { | 6661 static const ParserFlag kAllDestructuringFlags[] = { |
6717 kAllowHarmonyDestructuring, kAllowHarmonyDestructuringAssignment, | 6662 kAllowHarmonyDestructuring, kAllowHarmonyDestructuringAssignment, |
6718 kAllowHarmonyDefaultParameters}; | 6663 kAllowHarmonyDefaultParameters}; |
6719 | 6664 |
6720 TEST(DestructuringPositiveTests) { | 6665 TEST(DestructuringPositiveTests) { |
6721 i::FLAG_harmony_destructuring_bind = true; | 6666 i::FLAG_harmony_destructuring_bind = true; |
6722 | 6667 |
6723 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, | 6668 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, |
6724 {"var ", " = {};"}, | 6669 {"var ", " = {};"}, |
6725 {"'use strict'; const ", " = {};"}, | 6670 {"'use strict'; const ", " = {};"}, |
(...skipping 1310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8036 { NULL, NULL } | 7981 { NULL, NULL } |
8037 }; | 7982 }; |
8038 const char* error_data[] = { | 7983 const char* error_data[] = { |
8039 "var x = new.target", | 7984 "var x = new.target", |
8040 "function f() { return new.t\\u0061rget; }", | 7985 "function f() { return new.t\\u0061rget; }", |
8041 NULL | 7986 NULL |
8042 }; | 7987 }; |
8043 // clang-format on | 7988 // clang-format on |
8044 RunParserSyncTest(context_data, error_data, kError); | 7989 RunParserSyncTest(context_data, error_data, kError); |
8045 } | 7990 } |
OLD | NEW |