Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(167)

Side by Side Diff: test/cctest/test-parsing.cc

Issue 1371363006: Continuing removing deprecated function from cctest (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
11 // with the distribution. 11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its 12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived 13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission. 14 // from this software without specific prior written permission.
15 // 15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 // TODO(mythria): Remove this define after this flag is turned on globally
29 #define V8_IMMINENT_DEPRECATION_WARNINGS
30
28 #include <stdio.h> 31 #include <stdio.h>
29 #include <stdlib.h> 32 #include <stdlib.h>
30 #include <string.h> 33 #include <string.h>
31 34
32 #include "src/v8.h" 35 #include "src/v8.h"
33 36
34 #include "src/ast.h" 37 #include "src/ast.h"
35 #include "src/ast-numbering.h" 38 #include "src/ast-numbering.h"
36 #include "src/ast-value-factory.h" 39 #include "src/ast-value-factory.h"
37 #include "src/compiler.h" 40 #include "src/compiler.h"
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 " f\\u006fr: 'keyword propertyname with escape'};" 221 " f\\u006fr: 'keyword propertyname with escape'};"
219 "var v = /RegExp Literal/;" 222 "var v = /RegExp Literal/;"
220 "var w = /RegExp Literal\\u0020With Escape/gin;" 223 "var w = /RegExp Literal\\u0020With Escape/gin;"
221 "var y = { get getter() { return 42; }, " 224 "var y = { get getter() { return 42; }, "
222 " set setter(v) { this.value = v; }};" 225 " set setter(v) { this.value = v; }};"
223 "var f = a => function (b) { return a + b; };" 226 "var f = a => function (b) { return a + b; };"
224 "var g = a => b => a + b;"; 227 "var g = a => b => a + b;";
225 int source_length = i::StrLength(source); 228 int source_length = i::StrLength(source);
226 229
227 // ScriptResource will be deleted when the corresponding String is GCd. 230 // ScriptResource will be deleted when the corresponding String is GCd.
228 v8::ScriptCompiler::Source script_source(v8::String::NewExternal( 231 v8::ScriptCompiler::Source script_source(
229 isolate, new ScriptResource(source, source_length))); 232 v8::String::NewExternalOneByte(isolate,
233 new ScriptResource(source, source_length))
234 .ToLocalChecked());
230 i::FLAG_harmony_arrow_functions = true; 235 i::FLAG_harmony_arrow_functions = true;
231 i::FLAG_min_preparse_length = 0; 236 i::FLAG_min_preparse_length = 0;
232 v8::ScriptCompiler::Compile(isolate, &script_source, 237 v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &script_source,
233 v8::ScriptCompiler::kProduceParserCache); 238 v8::ScriptCompiler::kProduceParserCache)
239 .ToLocalChecked();
234 CHECK(script_source.GetCachedData()); 240 CHECK(script_source.GetCachedData());
235 241
236 // Compile the script again, using the cached data. 242 // Compile the script again, using the cached data.
237 bool lazy_flag = i::FLAG_lazy; 243 bool lazy_flag = i::FLAG_lazy;
238 i::FLAG_lazy = true; 244 i::FLAG_lazy = true;
239 v8::ScriptCompiler::Compile(isolate, &script_source, 245 v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &script_source,
240 v8::ScriptCompiler::kConsumeParserCache); 246 v8::ScriptCompiler::kConsumeParserCache)
247 .ToLocalChecked();
241 i::FLAG_lazy = false; 248 i::FLAG_lazy = false;
242 v8::ScriptCompiler::CompileUnbound(isolate, &script_source, 249 v8::ScriptCompiler::CompileUnboundScript(
243 v8::ScriptCompiler::kConsumeParserCache); 250 isolate, &script_source, v8::ScriptCompiler::kConsumeParserCache)
251 .ToLocalChecked();
244 i::FLAG_lazy = lazy_flag; 252 i::FLAG_lazy = lazy_flag;
245 } 253 }
246 254
247 255
248 TEST(PreparseFunctionDataIsUsed) { 256 TEST(PreparseFunctionDataIsUsed) {
249 // This tests that we actually do use the function data generated by the 257 // This tests that we actually do use the function data generated by the
250 // preparser. 258 // preparser.
251 259
252 // Make preparsing work for short scripts. 260 // Make preparsing work for short scripts.
253 i::FLAG_min_preparse_length = 0; 261 i::FLAG_min_preparse_length = 0;
(...skipping 12 matching lines...) Expand all
266 }; 274 };
267 275
268 // Insert a syntax error inside the lazy function. 276 // Insert a syntax error inside the lazy function.
269 const char* bad_code[] = { 277 const char* bad_code[] = {
270 "function this_is_lazy() { if ( } function foo() { return 25; } foo();", 278 "function this_is_lazy() { if ( } function foo() { return 25; } foo();",
271 "var this_is_lazy = () => { if ( }; var foo = () => 25; foo();", 279 "var this_is_lazy = () => { if ( }; var foo = () => 25; foo();",
272 }; 280 };
273 281
274 for (unsigned i = 0; i < arraysize(good_code); i++) { 282 for (unsigned i = 0; i < arraysize(good_code); i++) {
275 v8::ScriptCompiler::Source good_source(v8_str(good_code[i])); 283 v8::ScriptCompiler::Source good_source(v8_str(good_code[i]));
276 v8::ScriptCompiler::Compile(isolate, &good_source, 284 v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &good_source,
277 v8::ScriptCompiler::kProduceParserCache); 285 v8::ScriptCompiler::kProduceParserCache)
286 .ToLocalChecked();
278 287
279 const v8::ScriptCompiler::CachedData* cached_data = 288 const v8::ScriptCompiler::CachedData* cached_data =
280 good_source.GetCachedData(); 289 good_source.GetCachedData();
281 CHECK(cached_data->data != NULL); 290 CHECK(cached_data->data != NULL);
282 CHECK_GT(cached_data->length, 0); 291 CHECK_GT(cached_data->length, 0);
283 292
284 // Now compile the erroneous code with the good preparse data. If the 293 // Now compile the erroneous code with the good preparse data. If the
285 // preparse data is used, the lazy function is skipped and it should 294 // preparse data is used, the lazy function is skipped and it should
286 // compile fine. 295 // compile fine.
287 v8::ScriptCompiler::Source bad_source( 296 v8::ScriptCompiler::Source bad_source(
288 v8_str(bad_code[i]), new v8::ScriptCompiler::CachedData( 297 v8_str(bad_code[i]), new v8::ScriptCompiler::CachedData(
289 cached_data->data, cached_data->length)); 298 cached_data->data, cached_data->length));
290 v8::Local<v8::Value> result = 299 v8::Local<v8::Value> result =
291 v8::ScriptCompiler::Compile(isolate, &bad_source, 300 CompileRun(isolate->GetCurrentContext(), &bad_source,
292 v8::ScriptCompiler::kConsumeParserCache) 301 v8::ScriptCompiler::kConsumeParserCache);
293 ->Run();
294 CHECK(result->IsInt32()); 302 CHECK(result->IsInt32());
295 CHECK_EQ(25, result->Int32Value()); 303 CHECK_EQ(25, result->Int32Value(isolate->GetCurrentContext()).FromJust());
296 } 304 }
297 } 305 }
298 306
299 307
300 TEST(StandAlonePreParser) { 308 TEST(StandAlonePreParser) {
301 v8::V8::Initialize(); 309 v8::V8::Initialize();
302 310
303 CcTest::i_isolate()->stack_guard()->SetStackLimit( 311 CcTest::i_isolate()->stack_guard()->SetStackLimit(
304 i::GetCurrentStackPosition() - 128 * 1024); 312 i::GetCurrentStackPosition() - 128 * 1024);
305 313
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after
1031 {"eval('super.x')", EVAL}, 1039 {"eval('super.x')", EVAL},
1032 {"eval('this.x')", EVAL}, 1040 {"eval('this.x')", EVAL},
1033 {"eval('arguments')", EVAL}, 1041 {"eval('arguments')", EVAL},
1034 }; 1042 };
1035 // clang-format on 1043 // clang-format on
1036 1044
1037 i::Isolate* isolate = CcTest::i_isolate(); 1045 i::Isolate* isolate = CcTest::i_isolate();
1038 i::Factory* factory = isolate->factory(); 1046 i::Factory* factory = isolate->factory();
1039 1047
1040 v8::HandleScope handles(CcTest::isolate()); 1048 v8::HandleScope handles(CcTest::isolate());
1041 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); 1049 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate());
1042 v8::Context::Scope context_scope(context); 1050 v8::Context::Scope context_scope(context);
1043 1051
1044 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - 1052 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() -
1045 128 * 1024); 1053 128 * 1024);
1046 1054
1047 for (unsigned j = 0; j < arraysize(surroundings); ++j) { 1055 for (unsigned j = 0; j < arraysize(surroundings); ++j) {
1048 for (unsigned i = 0; i < arraysize(source_data); ++i) { 1056 for (unsigned i = 0; i < arraysize(source_data); ++i) {
1049 // Super property is only allowed in constructor and method. 1057 // Super property is only allowed in constructor and method.
1050 if (((source_data[i].expected & SUPER_PROPERTY) || 1058 if (((source_data[i].expected & SUPER_PROPERTY) ||
1051 (source_data[i].expected == NONE)) && j != 2) { 1059 (source_data[i].expected == NONE)) && j != 2) {
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
1338 { " 'foo';\n" 1346 { " 'foo';\n"
1339 " (function fun", "(a,b) { 'bar\360\220\220\214'; }", ")();", 1347 " (function fun", "(a,b) { 'bar\360\220\220\214'; }", ")();",
1340 i::FUNCTION_SCOPE, i::SLOPPY }, 1348 i::FUNCTION_SCOPE, i::SLOPPY },
1341 { NULL, NULL, NULL, i::EVAL_SCOPE, i::SLOPPY } 1349 { NULL, NULL, NULL, i::EVAL_SCOPE, i::SLOPPY }
1342 }; 1350 };
1343 1351
1344 i::Isolate* isolate = CcTest::i_isolate(); 1352 i::Isolate* isolate = CcTest::i_isolate();
1345 i::Factory* factory = isolate->factory(); 1353 i::Factory* factory = isolate->factory();
1346 1354
1347 v8::HandleScope handles(CcTest::isolate()); 1355 v8::HandleScope handles(CcTest::isolate());
1348 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); 1356 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate());
1349 v8::Context::Scope context_scope(context); 1357 v8::Context::Scope context_scope(context);
1350 1358
1351 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - 1359 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() -
1352 128 * 1024); 1360 128 * 1024);
1353 1361
1354 for (int i = 0; source_data[i].outer_prefix; i++) { 1362 for (int i = 0; source_data[i].outer_prefix; i++) {
1355 int kPrefixLen = Utf8LengthHelper(source_data[i].outer_prefix); 1363 int kPrefixLen = Utf8LengthHelper(source_data[i].outer_prefix);
1356 int kInnerLen = Utf8LengthHelper(source_data[i].inner_source); 1364 int kInnerLen = Utf8LengthHelper(source_data[i].inner_source);
1357 int kSuffixLen = Utf8LengthHelper(source_data[i].outer_suffix); 1365 int kSuffixLen = Utf8LengthHelper(source_data[i].outer_suffix);
1358 int kPrefixByteLen = i::StrLength(source_data[i].outer_prefix); 1366 int kPrefixByteLen = i::StrLength(source_data[i].outer_prefix);
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1474 i::Handle<i::String> FormatMessage(i::Vector<unsigned> data) { 1482 i::Handle<i::String> FormatMessage(i::Vector<unsigned> data) {
1475 i::Isolate* isolate = CcTest::i_isolate(); 1483 i::Isolate* isolate = CcTest::i_isolate();
1476 int message = data[i::PreparseDataConstants::kMessageTemplatePos]; 1484 int message = data[i::PreparseDataConstants::kMessageTemplatePos];
1477 int arg_count = data[i::PreparseDataConstants::kMessageArgCountPos]; 1485 int arg_count = data[i::PreparseDataConstants::kMessageArgCountPos];
1478 i::Handle<i::Object> arg_object; 1486 i::Handle<i::Object> arg_object;
1479 if (arg_count == 1) { 1487 if (arg_count == 1) {
1480 // Position after text found by skipping past length field and 1488 // Position after text found by skipping past length field and
1481 // length field content words. 1489 // length field content words.
1482 const char* arg = 1490 const char* arg =
1483 ReadString(&data[i::PreparseDataConstants::kMessageArgPos]); 1491 ReadString(&data[i::PreparseDataConstants::kMessageArgPos]);
1484 arg_object = 1492 arg_object = v8::Utils::OpenHandle(*v8_str(arg));
1485 v8::Utils::OpenHandle(*v8::String::NewFromUtf8(CcTest::isolate(), arg));
1486 i::DeleteArray(arg); 1493 i::DeleteArray(arg);
1487 } else { 1494 } else {
1488 CHECK_EQ(0, arg_count); 1495 CHECK_EQ(0, arg_count);
1489 arg_object = isolate->factory()->undefined_value(); 1496 arg_object = isolate->factory()->undefined_value();
1490 } 1497 }
1491 1498
1492 data.Dispose(); 1499 data.Dispose();
1493 return i::MessageTemplate::FormatMessage(isolate, message, arg_object); 1500 return i::MessageTemplate::FormatMessage(isolate, message, arg_object);
1494 } 1501 }
1495 1502
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
1756 const char* termination_data[] = { 1763 const char* termination_data[] = {
1757 "", 1764 "",
1758 ";", 1765 ";",
1759 "\n", 1766 "\n",
1760 ";\n", 1767 ";\n",
1761 "\n;", 1768 "\n;",
1762 NULL 1769 NULL
1763 }; 1770 };
1764 1771
1765 v8::HandleScope handles(CcTest::isolate()); 1772 v8::HandleScope handles(CcTest::isolate());
1766 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); 1773 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate());
1767 v8::Context::Scope context_scope(context); 1774 v8::Context::Scope context_scope(context);
1768 1775
1769 CcTest::i_isolate()->stack_guard()->SetStackLimit( 1776 CcTest::i_isolate()->stack_guard()->SetStackLimit(
1770 i::GetCurrentStackPosition() - 128 * 1024); 1777 i::GetCurrentStackPosition() - 128 * 1024);
1771 1778
1772 for (int i = 0; context_data[i][0] != NULL; ++i) { 1779 for (int i = 0; context_data[i][0] != NULL; ++i) {
1773 for (int j = 0; statement_data[j] != NULL; ++j) { 1780 for (int j = 0; statement_data[j] != NULL; ++j) {
1774 for (int k = 0; termination_data[k] != NULL; ++k) { 1781 for (int k = 0; termination_data[k] != NULL; ++k) {
1775 int kPrefixLen = i::StrLength(context_data[i][0]); 1782 int kPrefixLen = i::StrLength(context_data[i][0]);
1776 int kStatementLen = i::StrLength(statement_data[j]); 1783 int kStatementLen = i::StrLength(statement_data[j]);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1812 v8::Context::Scope context_scope( 1819 v8::Context::Scope context_scope(
1813 v8::Context::New(CcTest::isolate())); 1820 v8::Context::New(CcTest::isolate()));
1814 v8::TryCatch try_catch(CcTest::isolate()); 1821 v8::TryCatch try_catch(CcTest::isolate());
1815 const char* script = 1822 const char* script =
1816 "\"use strict\"; \n" 1823 "\"use strict\"; \n"
1817 "a = function() { \n" 1824 "a = function() { \n"
1818 " b = function() { \n" 1825 " b = function() { \n"
1819 " 01; \n" 1826 " 01; \n"
1820 " }; \n" 1827 " }; \n"
1821 "}; \n"; 1828 "}; \n";
1822 v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), script)); 1829 v8_compile(v8_str(script));
1823 CHECK(try_catch.HasCaught()); 1830 CHECK(try_catch.HasCaught());
1824 v8::String::Utf8Value exception(try_catch.Exception()); 1831 v8::String::Utf8Value exception(try_catch.Exception());
1825 CHECK_EQ(0, 1832 CHECK_EQ(0,
1826 strcmp("SyntaxError: Octal literals are not allowed in strict mode.", 1833 strcmp("SyntaxError: Octal literals are not allowed in strict mode.",
1827 *exception)); 1834 *exception));
1828 } 1835 }
1829 1836
1830 1837
1831 void RunParserSyncTest(const char* context_data[][2], 1838 void RunParserSyncTest(const char* context_data[][2],
1832 const char* statement_data[], 1839 const char* statement_data[],
1833 ParserSyncTestResult result, 1840 ParserSyncTestResult result,
1834 const ParserFlag* flags = NULL, 1841 const ParserFlag* flags = NULL,
1835 int flags_len = 0, 1842 int flags_len = 0,
1836 const ParserFlag* always_true_flags = NULL, 1843 const ParserFlag* always_true_flags = NULL,
1837 int always_true_len = 0, 1844 int always_true_len = 0,
1838 const ParserFlag* always_false_flags = NULL, 1845 const ParserFlag* always_false_flags = NULL,
1839 int always_false_len = 0) { 1846 int always_false_len = 0) {
1840 v8::HandleScope handles(CcTest::isolate()); 1847 v8::HandleScope handles(CcTest::isolate());
1841 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); 1848 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate());
1842 v8::Context::Scope context_scope(context); 1849 v8::Context::Scope context_scope(context);
1843 1850
1844 CcTest::i_isolate()->stack_guard()->SetStackLimit( 1851 CcTest::i_isolate()->stack_guard()->SetStackLimit(
1845 i::GetCurrentStackPosition() - 128 * 1024); 1852 i::GetCurrentStackPosition() - 128 * 1024);
1846 1853
1847 // Experimental feature flags should not go here; pass the flags as 1854 // Experimental feature flags should not go here; pass the flags as
1848 // always_true_flags if the test needs them. 1855 // always_true_flags if the test needs them.
1849 static const ParserFlag default_flags[] = { 1856 static const ParserFlag default_flags[] = {
1850 kAllowLazy, 1857 kAllowLazy,
1851 kAllowNatives, 1858 kAllowNatives,
(...skipping 1360 matching lines...) Expand 10 before | Expand all | Expand 10 after
3212 v8::Isolate* isolate = CcTest::isolate(); 3219 v8::Isolate* isolate = CcTest::isolate();
3213 v8::HandleScope scope(isolate); 3220 v8::HandleScope scope(isolate);
3214 LocalContext env; 3221 LocalContext env;
3215 uint16_t* two_byte_source = AsciiToTwoByteString( 3222 uint16_t* two_byte_source = AsciiToTwoByteString(
3216 "var obj1 = { oXj2 : { foo1: function() {} } }; " 3223 "var obj1 = { oXj2 : { foo1: function() {} } }; "
3217 "%FunctionGetInferredName(obj1.oXj2.foo1)"); 3224 "%FunctionGetInferredName(obj1.oXj2.foo1)");
3218 uint16_t* two_byte_name = AsciiToTwoByteString("obj1.oXj2.foo1"); 3225 uint16_t* two_byte_name = AsciiToTwoByteString("obj1.oXj2.foo1");
3219 // Make it really non-Latin1 (replace the Xs with a non-Latin1 character). 3226 // Make it really non-Latin1 (replace the Xs with a non-Latin1 character).
3220 two_byte_source[14] = two_byte_source[78] = two_byte_name[6] = 0x010d; 3227 two_byte_source[14] = two_byte_source[78] = two_byte_name[6] = 0x010d;
3221 v8::Local<v8::String> source = 3228 v8::Local<v8::String> source =
3222 v8::String::NewFromTwoByte(isolate, two_byte_source); 3229 v8::String::NewFromTwoByte(isolate, two_byte_source,
3230 v8::NewStringType::kNormal)
3231 .ToLocalChecked();
3223 v8::Local<v8::Value> result = CompileRun(source); 3232 v8::Local<v8::Value> result = CompileRun(source);
3224 CHECK(result->IsString()); 3233 CHECK(result->IsString());
3225 v8::Local<v8::String> expected_name = 3234 v8::Local<v8::String> expected_name =
3226 v8::String::NewFromTwoByte(isolate, two_byte_name); 3235 v8::String::NewFromTwoByte(isolate, two_byte_name,
3227 CHECK(result->Equals(expected_name)); 3236 v8::NewStringType::kNormal)
3237 .ToLocalChecked();
3238 CHECK(result->Equals(isolate->GetCurrentContext(), expected_name).FromJust());
3228 i::DeleteArray(two_byte_source); 3239 i::DeleteArray(two_byte_source);
3229 i::DeleteArray(two_byte_name); 3240 i::DeleteArray(two_byte_name);
3230 } 3241 }
3231 3242
3232 3243
3233 TEST(FuncNameInferrerEscaped) { 3244 TEST(FuncNameInferrerEscaped) {
3234 // The same as FuncNameInferrerTwoByte, except that we express the two-byte 3245 // The same as FuncNameInferrerTwoByte, except that we express the two-byte
3235 // character as a unicode escape. 3246 // character as a unicode escape.
3236 i::FLAG_allow_natives_syntax = true; 3247 i::FLAG_allow_natives_syntax = true;
3237 v8::Isolate* isolate = CcTest::isolate(); 3248 v8::Isolate* isolate = CcTest::isolate();
3238 v8::HandleScope scope(isolate); 3249 v8::HandleScope scope(isolate);
3239 LocalContext env; 3250 LocalContext env;
3240 uint16_t* two_byte_source = AsciiToTwoByteString( 3251 uint16_t* two_byte_source = AsciiToTwoByteString(
3241 "var obj1 = { o\\u010dj2 : { foo1: function() {} } }; " 3252 "var obj1 = { o\\u010dj2 : { foo1: function() {} } }; "
3242 "%FunctionGetInferredName(obj1.o\\u010dj2.foo1)"); 3253 "%FunctionGetInferredName(obj1.o\\u010dj2.foo1)");
3243 uint16_t* two_byte_name = AsciiToTwoByteString("obj1.oXj2.foo1"); 3254 uint16_t* two_byte_name = AsciiToTwoByteString("obj1.oXj2.foo1");
3244 // Fix to correspond to the non-ASCII name in two_byte_source. 3255 // Fix to correspond to the non-ASCII name in two_byte_source.
3245 two_byte_name[6] = 0x010d; 3256 two_byte_name[6] = 0x010d;
3246 v8::Local<v8::String> source = 3257 v8::Local<v8::String> source =
3247 v8::String::NewFromTwoByte(isolate, two_byte_source); 3258 v8::String::NewFromTwoByte(isolate, two_byte_source,
3259 v8::NewStringType::kNormal)
3260 .ToLocalChecked();
3248 v8::Local<v8::Value> result = CompileRun(source); 3261 v8::Local<v8::Value> result = CompileRun(source);
3249 CHECK(result->IsString()); 3262 CHECK(result->IsString());
3250 v8::Local<v8::String> expected_name = 3263 v8::Local<v8::String> expected_name =
3251 v8::String::NewFromTwoByte(isolate, two_byte_name); 3264 v8::String::NewFromTwoByte(isolate, two_byte_name,
3252 CHECK(result->Equals(expected_name)); 3265 v8::NewStringType::kNormal)
3266 .ToLocalChecked();
3267 CHECK(result->Equals(isolate->GetCurrentContext(), expected_name).FromJust());
3253 i::DeleteArray(two_byte_source); 3268 i::DeleteArray(two_byte_source);
3254 i::DeleteArray(two_byte_name); 3269 i::DeleteArray(two_byte_name);
3255 } 3270 }
3256 3271
3257 3272
3258 TEST(RegressionLazyFunctionWithErrorWithArg) { 3273 TEST(RegressionLazyFunctionWithErrorWithArg) {
3259 // The bug occurred when a lazy function had an error which requires a 3274 // The bug occurred when a lazy function had an error which requires a
3260 // parameter (such as "unknown label" here). The error message was processed 3275 // parameter (such as "unknown label" here). The error message was processed
3261 // before the AstValueFactory containing the error message string was 3276 // before the AstValueFactory containing the error message string was
3262 // internalized. 3277 // internalized.
(...skipping 2251 matching lines...) Expand 10 before | Expand all | Expand 10 after
5514 "import { for as f } from 'm.js';", 5529 "import { for as f } from 'm.js';",
5515 "import { yield as y } from 'm.js';", 5530 "import { yield as y } from 'm.js';",
5516 "import { static as s } from 'm.js';", 5531 "import { static as s } from 'm.js';",
5517 "import { let as l } from 'm.js';", 5532 "import { let as l } from 'm.js';",
5518 }; 5533 };
5519 5534
5520 i::Isolate* isolate = CcTest::i_isolate(); 5535 i::Isolate* isolate = CcTest::i_isolate();
5521 i::Factory* factory = isolate->factory(); 5536 i::Factory* factory = isolate->factory();
5522 5537
5523 v8::HandleScope handles(CcTest::isolate()); 5538 v8::HandleScope handles(CcTest::isolate());
5524 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); 5539 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate());
5525 v8::Context::Scope context_scope(context); 5540 v8::Context::Scope context_scope(context);
5526 5541
5527 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - 5542 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() -
5528 128 * 1024); 5543 128 * 1024);
5529 5544
5530 for (unsigned i = 0; i < arraysize(kSources); ++i) { 5545 for (unsigned i = 0; i < arraysize(kSources); ++i) {
5531 i::Handle<i::String> source = 5546 i::Handle<i::String> source =
5532 factory->NewStringFromAsciiChecked(kSources[i]); 5547 factory->NewStringFromAsciiChecked(kSources[i]);
5533 5548
5534 // Show that parsing as a module works 5549 // Show that parsing as a module works
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
5631 5646
5632 // TODO(ES6): These two forms should be supported 5647 // TODO(ES6): These two forms should be supported
5633 "export default function() {};", 5648 "export default function() {};",
5634 "export default class {};" 5649 "export default class {};"
5635 }; 5650 };
5636 5651
5637 i::Isolate* isolate = CcTest::i_isolate(); 5652 i::Isolate* isolate = CcTest::i_isolate();
5638 i::Factory* factory = isolate->factory(); 5653 i::Factory* factory = isolate->factory();
5639 5654
5640 v8::HandleScope handles(CcTest::isolate()); 5655 v8::HandleScope handles(CcTest::isolate());
5641 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); 5656 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate());
5642 v8::Context::Scope context_scope(context); 5657 v8::Context::Scope context_scope(context);
5643 5658
5644 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - 5659 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() -
5645 128 * 1024); 5660 128 * 1024);
5646 5661
5647 for (unsigned i = 0; i < arraysize(kErrorSources); ++i) { 5662 for (unsigned i = 0; i < arraysize(kErrorSources); ++i) {
5648 i::Handle<i::String> source = 5663 i::Handle<i::String> source =
5649 factory->NewStringFromAsciiChecked(kErrorSources[i]); 5664 factory->NewStringFromAsciiChecked(kErrorSources[i]);
5650 5665
5651 i::Handle<i::Script> script = factory->NewScript(source); 5666 i::Handle<i::Script> script = factory->NewScript(source);
5652 i::Zone zone; 5667 i::Zone zone;
5653 i::ParseInfo info(&zone, script); 5668 i::ParseInfo info(&zone, script);
5654 i::Parser parser(&info); 5669 i::Parser parser(&info);
5655 info.set_module(); 5670 info.set_module();
5656 CHECK(!parser.Parse(&info)); 5671 CHECK(!parser.Parse(&info));
5657 } 5672 }
5658 } 5673 }
5659 5674
5660 5675
5661 TEST(ModuleParsingInternals) { 5676 TEST(ModuleParsingInternals) {
5662 i::FLAG_harmony_modules = true; 5677 i::FLAG_harmony_modules = true;
5663 5678
5664 i::Isolate* isolate = CcTest::i_isolate(); 5679 i::Isolate* isolate = CcTest::i_isolate();
5665 i::Factory* factory = isolate->factory(); 5680 i::Factory* factory = isolate->factory();
5666 v8::HandleScope handles(CcTest::isolate()); 5681 v8::HandleScope handles(CcTest::isolate());
5667 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); 5682 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate());
5668 v8::Context::Scope context_scope(context); 5683 v8::Context::Scope context_scope(context);
5669 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - 5684 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() -
5670 128 * 1024); 5685 128 * 1024);
5671 5686
5672 static const char kSource[] = 5687 static const char kSource[] =
5673 "let x = 5;" 5688 "let x = 5;"
5674 "export { x as y };" 5689 "export { x as y };"
5675 "import { q as z } from 'm.js';" 5690 "import { q as z } from 'm.js';"
5676 "import n from 'n.js';" 5691 "import n from 'n.js';"
5677 "export { a as b } from 'm.js';" 5692 "export { a as b } from 'm.js';"
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
5789 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, 5804 RunParserSyncTest(context_data, statement_data, kError, NULL, 0,
5790 always_flags, arraysize(always_flags)); 5805 always_flags, arraysize(always_flags));
5791 } 5806 }
5792 5807
5793 5808
5794 void TestLanguageMode(const char* source, 5809 void TestLanguageMode(const char* source,
5795 i::LanguageMode expected_language_mode) { 5810 i::LanguageMode expected_language_mode) {
5796 i::Isolate* isolate = CcTest::i_isolate(); 5811 i::Isolate* isolate = CcTest::i_isolate();
5797 i::Factory* factory = isolate->factory(); 5812 i::Factory* factory = isolate->factory();
5798 v8::HandleScope handles(CcTest::isolate()); 5813 v8::HandleScope handles(CcTest::isolate());
5799 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); 5814 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate());
5800 v8::Context::Scope context_scope(context); 5815 v8::Context::Scope context_scope(context);
5801 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - 5816 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() -
5802 128 * 1024); 5817 128 * 1024);
5803 5818
5804 i::Handle<i::Script> script = 5819 i::Handle<i::Script> script =
5805 factory->NewScript(factory->NewStringFromAsciiChecked(source)); 5820 factory->NewScript(factory->NewStringFromAsciiChecked(source));
5806 i::Zone zone; 5821 i::Zone zone;
5807 i::ParseInfo info(&zone, script); 5822 i::ParseInfo info(&zone, script);
5808 i::Parser parser(&info); 5823 i::Parser parser(&info);
5809 parser.set_allow_strong_mode(true); 5824 parser.set_allow_strong_mode(true);
(...skipping 673 matching lines...) Expand 10 before | Expand all | Expand 10 after
6483 CHECK(!try_catch.HasCaught()); 6498 CHECK(!try_catch.HasCaught());
6484 6499
6485 // But not in strong mode. 6500 // But not in strong mode.
6486 { 6501 {
6487 const char* script2 = 6502 const char* script2 =
6488 "\"use strong\"; \n" 6503 "\"use strong\"; \n"
6489 "if (false) { \n" 6504 "if (false) { \n"
6490 " not_there2; \n" 6505 " not_there2; \n"
6491 "} \n"; 6506 "} \n";
6492 v8::TryCatch try_catch2(CcTest::isolate()); 6507 v8::TryCatch try_catch2(CcTest::isolate());
6493 v8::Script::Compile(v8_str(script2)); 6508 v8_compile(v8_str(script2));
6494 CHECK(try_catch2.HasCaught()); 6509 CHECK(try_catch2.HasCaught());
6495 v8::String::Utf8Value exception(try_catch2.Exception()); 6510 v8::String::Utf8Value exception(try_catch2.Exception());
6496 CHECK_EQ(0, 6511 CHECK_EQ(0,
6497 strcmp( 6512 strcmp(
6498 "ReferenceError: In strong mode, using an undeclared global " 6513 "ReferenceError: In strong mode, using an undeclared global "
6499 "variable 'not_there2' is not allowed", 6514 "variable 'not_there2' is not allowed",
6500 *exception)); 6515 *exception));
6501 } 6516 }
6502 6517
6503 // Check that the variable reference is detected inside a strong function too, 6518 // Check that the variable reference is detected inside a strong function too,
6504 // even if the script scope is not strong. 6519 // even if the script scope is not strong.
6505 { 6520 {
6506 const char* script3 = 6521 const char* script3 =
6507 "(function not_lazy() { \n" 6522 "(function not_lazy() { \n"
6508 " \"use strong\"; \n" 6523 " \"use strong\"; \n"
6509 " if (false) { \n" 6524 " if (false) { \n"
6510 " not_there3; \n" 6525 " not_there3; \n"
6511 " } \n" 6526 " } \n"
6512 "})(); \n"; 6527 "})(); \n";
6513 v8::TryCatch try_catch2(CcTest::isolate()); 6528 v8::TryCatch try_catch2(CcTest::isolate());
6514 v8::Script::Compile(v8_str(script3)); 6529 v8_compile(v8_str(script3));
6515 CHECK(try_catch2.HasCaught()); 6530 CHECK(try_catch2.HasCaught());
6516 v8::String::Utf8Value exception(try_catch2.Exception()); 6531 v8::String::Utf8Value exception(try_catch2.Exception());
6517 CHECK_EQ(0, 6532 CHECK_EQ(0,
6518 strcmp( 6533 strcmp(
6519 "ReferenceError: In strong mode, using an undeclared global " 6534 "ReferenceError: In strong mode, using an undeclared global "
6520 "variable 'not_there3' is not allowed", 6535 "variable 'not_there3' is not allowed",
6521 *exception)); 6536 *exception));
6522 } 6537 }
6523 } 6538 }
6524 6539
(...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after
7231 "for (let in {}) {}", 7246 "for (let in {}) {}",
7232 NULL 7247 NULL
7233 }; 7248 };
7234 // clang-format on 7249 // clang-format on
7235 7250
7236 static const ParserFlag always_flags[] = {kAllowHarmonySloppy, 7251 static const ParserFlag always_flags[] = {kAllowHarmonySloppy,
7237 kAllowHarmonySloppyLet}; 7252 kAllowHarmonySloppyLet};
7238 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags, 7253 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags,
7239 arraysize(always_flags)); 7254 arraysize(always_flags));
7240 } 7255 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698