| 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 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 uintptr_t stack_limit = CcTest::i_isolate()->stack_guard()->real_climit(); | 148 uintptr_t stack_limit = CcTest::i_isolate()->stack_guard()->real_climit(); |
| 149 for (int i = 0; tests[i]; i++) { | 149 for (int i = 0; tests[i]; i++) { |
| 150 const i::byte* source = | 150 const i::byte* source = |
| 151 reinterpret_cast<const i::byte*>(tests[i]); | 151 reinterpret_cast<const i::byte*>(tests[i]); |
| 152 i::Utf8ToUtf16CharacterStream stream(source, i::StrLength(tests[i])); | 152 i::Utf8ToUtf16CharacterStream stream(source, i::StrLength(tests[i])); |
| 153 i::CompleteParserRecorder log; | 153 i::CompleteParserRecorder log; |
| 154 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 154 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
| 155 scanner.Initialize(&stream); | 155 scanner.Initialize(&stream); |
| 156 i::PreParser preparser(&scanner, &log, stack_limit); | 156 i::PreParser preparser(&scanner, &log, stack_limit); |
| 157 preparser.set_allow_lazy(true); | 157 preparser.set_allow_lazy(true); |
| 158 preparser.set_allow_arrow_functions(true); |
| 158 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 159 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
| 159 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 160 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
| 160 i::ScriptData data(log.ExtractData()); | 161 i::ScriptData data(log.ExtractData()); |
| 161 CHECK(!data.has_error()); | 162 CHECK(!data.has_error()); |
| 162 } | 163 } |
| 163 | 164 |
| 164 for (int i = 0; fail_tests[i]; i++) { | 165 for (int i = 0; fail_tests[i]; i++) { |
| 165 const i::byte* source = | 166 const i::byte* source = |
| 166 reinterpret_cast<const i::byte*>(fail_tests[i]); | 167 reinterpret_cast<const i::byte*>(fail_tests[i]); |
| 167 i::Utf8ToUtf16CharacterStream stream(source, i::StrLength(fail_tests[i])); | 168 i::Utf8ToUtf16CharacterStream stream(source, i::StrLength(fail_tests[i])); |
| 168 i::CompleteParserRecorder log; | 169 i::CompleteParserRecorder log; |
| 169 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 170 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
| 170 scanner.Initialize(&stream); | 171 scanner.Initialize(&stream); |
| 171 i::PreParser preparser(&scanner, &log, stack_limit); | 172 i::PreParser preparser(&scanner, &log, stack_limit); |
| 172 preparser.set_allow_lazy(true); | 173 preparser.set_allow_lazy(true); |
| 174 preparser.set_allow_arrow_functions(true); |
| 173 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 175 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
| 174 // Even in the case of a syntax error, kPreParseSuccess is returned. | 176 // Even in the case of a syntax error, kPreParseSuccess is returned. |
| 175 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 177 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
| 176 i::ScriptData data(log.ExtractData()); | 178 i::ScriptData data(log.ExtractData()); |
| 177 CHECK(data.has_error()); | 179 CHECK(data.has_error()); |
| 178 } | 180 } |
| 179 } | 181 } |
| 180 | 182 |
| 181 | 183 |
| 182 class ScriptResource : public v8::String::ExternalAsciiStringResource { | 184 class ScriptResource : public v8::String::ExternalAsciiStringResource { |
| 183 public: | 185 public: |
| 184 ScriptResource(const char* data, size_t length) | 186 ScriptResource(const char* data, size_t length) |
| 185 : data_(data), length_(length) { } | 187 : data_(data), length_(length) { } |
| 186 | 188 |
| 187 const char* data() const { return data_; } | 189 const char* data() const { return data_; } |
| 188 size_t length() const { return length_; } | 190 size_t length() const { return length_; } |
| 189 | 191 |
| 190 private: | 192 private: |
| 191 const char* data_; | 193 const char* data_; |
| 192 size_t length_; | 194 size_t length_; |
| 193 }; | 195 }; |
| 194 | 196 |
| 195 | 197 |
| 196 TEST(UsingCachedData) { | 198 TEST(UsingCachedData) { |
| 199 i::FLAG_harmony_arrow_functions = true; |
| 197 v8::Isolate* isolate = CcTest::isolate(); | 200 v8::Isolate* isolate = CcTest::isolate(); |
| 198 v8::HandleScope handles(isolate); | 201 v8::HandleScope handles(isolate); |
| 199 v8::Local<v8::Context> context = v8::Context::New(isolate); | 202 v8::Local<v8::Context> context = v8::Context::New(isolate); |
| 200 v8::Context::Scope context_scope(context); | 203 v8::Context::Scope context_scope(context); |
| 201 int marker; | 204 int marker; |
| 202 CcTest::i_isolate()->stack_guard()->SetStackLimit( | 205 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
| 203 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 206 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
| 204 | 207 |
| 205 // Source containing functions that might be lazily compiled and all types | 208 // Source containing functions that might be lazily compiled and all types |
| 206 // of symbols (string, propertyName, regexp). | 209 // of symbols (string, propertyName, regexp). |
| (...skipping 27 matching lines...) Expand all Loading... |
| 234 i::FLAG_lazy = lazy_flag; | 237 i::FLAG_lazy = lazy_flag; |
| 235 } | 238 } |
| 236 | 239 |
| 237 | 240 |
| 238 TEST(PreparseFunctionDataIsUsed) { | 241 TEST(PreparseFunctionDataIsUsed) { |
| 239 // This tests that we actually do use the function data generated by the | 242 // This tests that we actually do use the function data generated by the |
| 240 // preparser. | 243 // preparser. |
| 241 | 244 |
| 242 // Make preparsing work for short scripts. | 245 // Make preparsing work for short scripts. |
| 243 i::FLAG_min_preparse_length = 0; | 246 i::FLAG_min_preparse_length = 0; |
| 247 i::FLAG_harmony_arrow_functions = true; |
| 244 | 248 |
| 245 v8::Isolate* isolate = CcTest::isolate(); | 249 v8::Isolate* isolate = CcTest::isolate(); |
| 246 v8::HandleScope handles(isolate); | 250 v8::HandleScope handles(isolate); |
| 247 v8::Local<v8::Context> context = v8::Context::New(isolate); | 251 v8::Local<v8::Context> context = v8::Context::New(isolate); |
| 248 v8::Context::Scope context_scope(context); | 252 v8::Context::Scope context_scope(context); |
| 249 int marker; | 253 int marker; |
| 250 CcTest::i_isolate()->stack_guard()->SetStackLimit( | 254 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
| 251 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 255 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
| 252 | 256 |
| 253 const char* good_code = | 257 const char* good_code[] = { |
| 254 "function this_is_lazy() { var a; } function foo() { return 25; } foo();"; | 258 "function this_is_lazy() { var a; } function foo() { return 25; } foo();", |
| 259 NULL |
| 260 }; |
| 255 | 261 |
| 256 // Insert a syntax error inside the lazy function. | 262 // Insert a syntax error inside the lazy function. |
| 257 const char* bad_code = | 263 const char* bad_code[] = { |
| 258 "function this_is_lazy() { if ( } function foo() { return 25; } foo();"; | 264 "function this_is_lazy() { if ( } function foo() { return 25; } foo();", |
| 265 NULL |
| 266 }; |
| 259 | 267 |
| 260 v8::ScriptCompiler::Source good_source(v8_str(good_code)); | 268 for (int i = 0; good_code[i]; i++) { |
| 261 v8::ScriptCompiler::Compile(isolate, &good_source, | 269 v8::ScriptCompiler::Source good_source(v8_str(good_code[i])); |
| 262 v8::ScriptCompiler::kProduceDataToCache); | 270 v8::ScriptCompiler::Compile(isolate, &good_source, |
| 271 v8::ScriptCompiler::kProduceDataToCache); |
| 263 | 272 |
| 264 const v8::ScriptCompiler::CachedData* cached_data = | 273 const v8::ScriptCompiler::CachedData* cached_data = |
| 265 good_source.GetCachedData(); | 274 good_source.GetCachedData(); |
| 266 CHECK(cached_data->data != NULL); | 275 CHECK(cached_data->data != NULL); |
| 267 CHECK_GT(cached_data->length, 0); | 276 CHECK_GT(cached_data->length, 0); |
| 268 | 277 |
| 269 // Now compile the erroneous code with the good preparse data. If the preparse | 278 // Now compile the erroneous code with the good preparse data. If the |
| 270 // data is used, the lazy function is skipped and it should compile fine. | 279 // preparse data is used, the lazy function is skipped and it should |
| 271 v8::ScriptCompiler::Source bad_source( | 280 // compile fine. |
| 272 v8_str(bad_code), new v8::ScriptCompiler::CachedData( | 281 v8::ScriptCompiler::Source bad_source( |
| 273 cached_data->data, cached_data->length)); | 282 v8_str(bad_code[i]), new v8::ScriptCompiler::CachedData( |
| 274 v8::Local<v8::Value> result = | 283 cached_data->data, cached_data->length)); |
| 275 v8::ScriptCompiler::Compile(isolate, &bad_source)->Run(); | 284 v8::Local<v8::Value> result = |
| 276 CHECK(result->IsInt32()); | 285 v8::ScriptCompiler::Compile(isolate, &bad_source)->Run(); |
| 277 CHECK_EQ(25, result->Int32Value()); | 286 CHECK(result->IsInt32()); |
| 287 CHECK_EQ(25, result->Int32Value()); |
| 288 } |
| 278 } | 289 } |
| 279 | 290 |
| 280 | 291 |
| 281 TEST(StandAlonePreParser) { | 292 TEST(StandAlonePreParser) { |
| 282 v8::V8::Initialize(); | 293 v8::V8::Initialize(); |
| 283 | 294 |
| 284 int marker; | 295 int marker; |
| 285 CcTest::i_isolate()->stack_guard()->SetStackLimit( | 296 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
| 286 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 297 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
| 287 | 298 |
| 288 const char* programs[] = { | 299 const char* programs[] = { |
| 289 "{label: 42}", | 300 "{label: 42}", |
| 290 "var x = 42;", | 301 "var x = 42;", |
| 291 "function foo(x, y) { return x + y; }", | 302 "function foo(x, y) { return x + y; }", |
| 292 "%ArgleBargle(glop);", | 303 "%ArgleBargle(glop);", |
| 293 "var x = new new Function('this.x = 42');", | 304 "var x = new new Function('this.x = 42');", |
| 305 "var f = (x, y) => x + y;", |
| 294 NULL | 306 NULL |
| 295 }; | 307 }; |
| 296 | 308 |
| 297 uintptr_t stack_limit = CcTest::i_isolate()->stack_guard()->real_climit(); | 309 uintptr_t stack_limit = CcTest::i_isolate()->stack_guard()->real_climit(); |
| 298 for (int i = 0; programs[i]; i++) { | 310 for (int i = 0; programs[i]; i++) { |
| 299 const char* program = programs[i]; | 311 const char* program = programs[i]; |
| 300 i::Utf8ToUtf16CharacterStream stream( | 312 i::Utf8ToUtf16CharacterStream stream( |
| 301 reinterpret_cast<const i::byte*>(program), | 313 reinterpret_cast<const i::byte*>(program), |
| 302 static_cast<unsigned>(strlen(program))); | 314 static_cast<unsigned>(strlen(program))); |
| 303 i::CompleteParserRecorder log; | 315 i::CompleteParserRecorder log; |
| 304 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 316 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
| 305 scanner.Initialize(&stream); | 317 scanner.Initialize(&stream); |
| 306 | 318 |
| 307 i::PreParser preparser(&scanner, &log, stack_limit); | 319 i::PreParser preparser(&scanner, &log, stack_limit); |
| 308 preparser.set_allow_lazy(true); | 320 preparser.set_allow_lazy(true); |
| 309 preparser.set_allow_natives_syntax(true); | 321 preparser.set_allow_natives_syntax(true); |
| 322 preparser.set_allow_arrow_functions(true); |
| 310 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 323 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
| 311 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 324 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
| 312 i::ScriptData data(log.ExtractData()); | 325 i::ScriptData data(log.ExtractData()); |
| 313 CHECK(!data.has_error()); | 326 CHECK(!data.has_error()); |
| 314 } | 327 } |
| 315 } | 328 } |
| 316 | 329 |
| 317 | 330 |
| 318 TEST(StandAlonePreParserNoNatives) { | 331 TEST(StandAlonePreParserNoNatives) { |
| 319 v8::V8::Initialize(); | 332 v8::V8::Initialize(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 334 i::Utf8ToUtf16CharacterStream stream( | 347 i::Utf8ToUtf16CharacterStream stream( |
| 335 reinterpret_cast<const i::byte*>(program), | 348 reinterpret_cast<const i::byte*>(program), |
| 336 static_cast<unsigned>(strlen(program))); | 349 static_cast<unsigned>(strlen(program))); |
| 337 i::CompleteParserRecorder log; | 350 i::CompleteParserRecorder log; |
| 338 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 351 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
| 339 scanner.Initialize(&stream); | 352 scanner.Initialize(&stream); |
| 340 | 353 |
| 341 // Preparser defaults to disallowing natives syntax. | 354 // Preparser defaults to disallowing natives syntax. |
| 342 i::PreParser preparser(&scanner, &log, stack_limit); | 355 i::PreParser preparser(&scanner, &log, stack_limit); |
| 343 preparser.set_allow_lazy(true); | 356 preparser.set_allow_lazy(true); |
| 357 preparser.set_allow_arrow_functions(true); |
| 344 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 358 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
| 345 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 359 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
| 346 i::ScriptData data(log.ExtractData()); | 360 i::ScriptData data(log.ExtractData()); |
| 347 // Data contains syntax error. | 361 // Data contains syntax error. |
| 348 CHECK(data.has_error()); | 362 CHECK(data.has_error()); |
| 349 } | 363 } |
| 350 } | 364 } |
| 351 | 365 |
| 352 | 366 |
| 353 TEST(PreparsingObjectLiterals) { | 367 TEST(PreparsingObjectLiterals) { |
| 354 // Regression test for a bug where the symbol stream produced by PreParser | 368 // Regression test for a bug where the symbol stream produced by PreParser |
| 355 // didn't match what Parser wanted to consume. | 369 // didn't match what Parser wanted to consume. |
| 370 i::FLAG_harmony_arrow_functions = true; |
| 356 v8::Isolate* isolate = CcTest::isolate(); | 371 v8::Isolate* isolate = CcTest::isolate(); |
| 357 v8::HandleScope handles(isolate); | 372 v8::HandleScope handles(isolate); |
| 358 v8::Local<v8::Context> context = v8::Context::New(isolate); | 373 v8::Local<v8::Context> context = v8::Context::New(isolate); |
| 359 v8::Context::Scope context_scope(context); | 374 v8::Context::Scope context_scope(context); |
| 360 int marker; | 375 int marker; |
| 361 CcTest::i_isolate()->stack_guard()->SetStackLimit( | 376 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
| 362 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 377 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
| 363 | 378 |
| 364 { | 379 { |
| 365 const char* source = "var myo = {if: \"foo\"}; myo.if;"; | 380 const char* source = "var myo = {if: \"foo\"}; myo.if;"; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 | 419 |
| 405 i::Utf8ToUtf16CharacterStream stream( | 420 i::Utf8ToUtf16CharacterStream stream( |
| 406 reinterpret_cast<const i::byte*>(program), | 421 reinterpret_cast<const i::byte*>(program), |
| 407 static_cast<unsigned>(strlen(program))); | 422 static_cast<unsigned>(strlen(program))); |
| 408 i::CompleteParserRecorder log; | 423 i::CompleteParserRecorder log; |
| 409 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 424 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
| 410 scanner.Initialize(&stream); | 425 scanner.Initialize(&stream); |
| 411 i::PreParser preparser(&scanner, &log, | 426 i::PreParser preparser(&scanner, &log, |
| 412 CcTest::i_isolate()->stack_guard()->real_climit()); | 427 CcTest::i_isolate()->stack_guard()->real_climit()); |
| 413 preparser.set_allow_lazy(true); | 428 preparser.set_allow_lazy(true); |
| 429 preparser.set_allow_arrow_functions(true); |
| 414 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 430 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
| 415 // Even in the case of a syntax error, kPreParseSuccess is returned. | 431 // Even in the case of a syntax error, kPreParseSuccess is returned. |
| 416 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 432 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
| 417 i::ScriptData data(log.ExtractData()); | 433 i::ScriptData data(log.ExtractData()); |
| 418 CHECK(data.has_error()); | 434 CHECK(data.has_error()); |
| 419 } | 435 } |
| 420 | 436 |
| 421 | 437 |
| 422 TEST(Regress928) { | 438 TEST(Regress928) { |
| 423 v8::V8::Initialize(); | 439 v8::V8::Initialize(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 438 | 454 |
| 439 v8::HandleScope handles(CcTest::isolate()); | 455 v8::HandleScope handles(CcTest::isolate()); |
| 440 i::Handle<i::String> source = factory->NewStringFromAsciiChecked(program); | 456 i::Handle<i::String> source = factory->NewStringFromAsciiChecked(program); |
| 441 i::GenericStringUtf16CharacterStream stream(source, 0, source->length()); | 457 i::GenericStringUtf16CharacterStream stream(source, 0, source->length()); |
| 442 i::CompleteParserRecorder log; | 458 i::CompleteParserRecorder log; |
| 443 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 459 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
| 444 scanner.Initialize(&stream); | 460 scanner.Initialize(&stream); |
| 445 i::PreParser preparser(&scanner, &log, | 461 i::PreParser preparser(&scanner, &log, |
| 446 CcTest::i_isolate()->stack_guard()->real_climit()); | 462 CcTest::i_isolate()->stack_guard()->real_climit()); |
| 447 preparser.set_allow_lazy(true); | 463 preparser.set_allow_lazy(true); |
| 464 preparser.set_allow_arrow_functions(true); |
| 448 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 465 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
| 449 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 466 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
| 450 i::ScriptData data(log.ExtractData()); | 467 i::ScriptData data(log.ExtractData()); |
| 451 CHECK(!data.has_error()); | 468 CHECK(!data.has_error()); |
| 452 data.Initialize(); | 469 data.Initialize(); |
| 453 | 470 |
| 454 int first_function = | 471 int first_function = |
| 455 static_cast<int>(strstr(program, "function") - program); | 472 static_cast<int>(strstr(program, "function") - program); |
| 456 int first_lbrace = first_function + i::StrLength("function () "); | 473 int first_lbrace = first_function + i::StrLength("function () "); |
| 457 CHECK_EQ('{', program[first_lbrace]); | 474 CHECK_EQ('{', program[first_lbrace]); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 485 | 502 |
| 486 i::Utf8ToUtf16CharacterStream stream( | 503 i::Utf8ToUtf16CharacterStream stream( |
| 487 reinterpret_cast<const i::byte*>(program.get()), | 504 reinterpret_cast<const i::byte*>(program.get()), |
| 488 static_cast<unsigned>(kProgramSize)); | 505 static_cast<unsigned>(kProgramSize)); |
| 489 i::CompleteParserRecorder log; | 506 i::CompleteParserRecorder log; |
| 490 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 507 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
| 491 scanner.Initialize(&stream); | 508 scanner.Initialize(&stream); |
| 492 | 509 |
| 493 i::PreParser preparser(&scanner, &log, stack_limit); | 510 i::PreParser preparser(&scanner, &log, stack_limit); |
| 494 preparser.set_allow_lazy(true); | 511 preparser.set_allow_lazy(true); |
| 512 preparser.set_allow_arrow_functions(true); |
| 495 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 513 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
| 496 CHECK_EQ(i::PreParser::kPreParseStackOverflow, result); | 514 CHECK_EQ(i::PreParser::kPreParseStackOverflow, result); |
| 497 } | 515 } |
| 498 | 516 |
| 499 | 517 |
| 500 class TestExternalResource: public v8::String::ExternalStringResource { | 518 class TestExternalResource: public v8::String::ExternalStringResource { |
| 501 public: | 519 public: |
| 502 explicit TestExternalResource(uint16_t* data, int length) | 520 explicit TestExternalResource(uint16_t* data, int length) |
| 503 : data_(data), length_(static_cast<size_t>(length)) { } | 521 : data_(data), length_(static_cast<size_t>(length)) { } |
| 504 | 522 |
| (...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 960 " }", "\n" | 978 " }", "\n" |
| 961 " more;", i::BLOCK_SCOPE, i::STRICT }, | 979 " more;", i::BLOCK_SCOPE, i::STRICT }, |
| 962 { " start;\n" | 980 { " start;\n" |
| 963 " function fun", "(a,b) { infunction; }", " more;", | 981 " function fun", "(a,b) { infunction; }", " more;", |
| 964 i::FUNCTION_SCOPE, i::SLOPPY }, | 982 i::FUNCTION_SCOPE, i::SLOPPY }, |
| 965 { " start;\n" | 983 { " start;\n" |
| 966 " function fun", "(a,b) {\n" | 984 " function fun", "(a,b) {\n" |
| 967 " infunction;\n" | 985 " infunction;\n" |
| 968 " }", "\n" | 986 " }", "\n" |
| 969 " more;", i::FUNCTION_SCOPE, i::SLOPPY }, | 987 " more;", i::FUNCTION_SCOPE, i::SLOPPY }, |
| 970 { " (function fun", "(a,b) { infunction; }", ")();", | 988 // TODO(aperez): Change to use i::ARROW_SCOPE when implemented |
| 989 { " start;\n", "(a,b) => a + b", "; more;", |
| 990 i::FUNCTION_SCOPE, i::SLOPPY }, |
| 991 { " start;\n", "(a,b) => { return a+b; }", "\nmore;", |
| 992 i::FUNCTION_SCOPE, i::SLOPPY }, |
| 993 { " start;\n" |
| 994 " (function fun", "(a,b) { infunction; }", ")();", |
| 971 i::FUNCTION_SCOPE, i::SLOPPY }, | 995 i::FUNCTION_SCOPE, i::SLOPPY }, |
| 972 { " for ", "(let x = 1 ; x < 10; ++ x) { block; }", " more;", | 996 { " for ", "(let x = 1 ; x < 10; ++ x) { block; }", " more;", |
| 973 i::BLOCK_SCOPE, i::STRICT }, | 997 i::BLOCK_SCOPE, i::STRICT }, |
| 974 { " for ", "(let x = 1 ; x < 10; ++ x) { block; }", "; more;", | 998 { " for ", "(let x = 1 ; x < 10; ++ x) { block; }", "; more;", |
| 975 i::BLOCK_SCOPE, i::STRICT }, | 999 i::BLOCK_SCOPE, i::STRICT }, |
| 976 { " for ", "(let x = 1 ; x < 10; ++ x) {\n" | 1000 { " for ", "(let x = 1 ; x < 10; ++ x) {\n" |
| 977 " block;\n" | 1001 " block;\n" |
| 978 " }", "\n" | 1002 " }", "\n" |
| 979 " more;", i::BLOCK_SCOPE, i::STRICT }, | 1003 " more;", i::BLOCK_SCOPE, i::STRICT }, |
| 980 { " for ", "(let x = 1 ; x < 10; ++ x) statement;", " more;", | 1004 { " for ", "(let x = 1 ; x < 10; ++ x) statement;", " more;", |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1115 | 1139 |
| 1116 // Parse program source. | 1140 // Parse program source. |
| 1117 i::Handle<i::String> source = factory->NewStringFromUtf8( | 1141 i::Handle<i::String> source = factory->NewStringFromUtf8( |
| 1118 i::CStrVector(program.start())).ToHandleChecked(); | 1142 i::CStrVector(program.start())).ToHandleChecked(); |
| 1119 CHECK_EQ(source->length(), kProgramSize); | 1143 CHECK_EQ(source->length(), kProgramSize); |
| 1120 i::Handle<i::Script> script = factory->NewScript(source); | 1144 i::Handle<i::Script> script = factory->NewScript(source); |
| 1121 i::CompilationInfoWithZone info(script); | 1145 i::CompilationInfoWithZone info(script); |
| 1122 i::Parser parser(&info); | 1146 i::Parser parser(&info); |
| 1123 parser.set_allow_lazy(true); | 1147 parser.set_allow_lazy(true); |
| 1124 parser.set_allow_harmony_scoping(true); | 1148 parser.set_allow_harmony_scoping(true); |
| 1149 parser.set_allow_arrow_functions(true); |
| 1125 info.MarkAsGlobal(); | 1150 info.MarkAsGlobal(); |
| 1126 info.SetStrictMode(source_data[i].strict_mode); | 1151 info.SetStrictMode(source_data[i].strict_mode); |
| 1127 parser.Parse(); | 1152 parser.Parse(); |
| 1128 CHECK(info.function() != NULL); | 1153 CHECK(info.function() != NULL); |
| 1129 | 1154 |
| 1130 // Check scope types and positions. | 1155 // Check scope types and positions. |
| 1131 i::Scope* scope = info.function()->scope(); | 1156 i::Scope* scope = info.function()->scope(); |
| 1132 CHECK(scope->is_global_scope()); | 1157 CHECK(scope->is_global_scope()); |
| 1133 CHECK_EQ(scope->start_position(), 0); | 1158 CHECK_EQ(scope->start_position(), 0); |
| 1134 CHECK_EQ(scope->end_position(), kProgramSize); | 1159 CHECK_EQ(scope->end_position(), kProgramSize); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1192 void SetParserFlags(i::ParserBase<Traits>* parser, | 1217 void SetParserFlags(i::ParserBase<Traits>* parser, |
| 1193 i::EnumSet<ParserFlag> flags) { | 1218 i::EnumSet<ParserFlag> flags) { |
| 1194 parser->set_allow_lazy(flags.Contains(kAllowLazy)); | 1219 parser->set_allow_lazy(flags.Contains(kAllowLazy)); |
| 1195 parser->set_allow_natives_syntax(flags.Contains(kAllowNativesSyntax)); | 1220 parser->set_allow_natives_syntax(flags.Contains(kAllowNativesSyntax)); |
| 1196 parser->set_allow_harmony_scoping(flags.Contains(kAllowHarmonyScoping)); | 1221 parser->set_allow_harmony_scoping(flags.Contains(kAllowHarmonyScoping)); |
| 1197 parser->set_allow_modules(flags.Contains(kAllowModules)); | 1222 parser->set_allow_modules(flags.Contains(kAllowModules)); |
| 1198 parser->set_allow_generators(flags.Contains(kAllowGenerators)); | 1223 parser->set_allow_generators(flags.Contains(kAllowGenerators)); |
| 1199 parser->set_allow_for_of(flags.Contains(kAllowForOf)); | 1224 parser->set_allow_for_of(flags.Contains(kAllowForOf)); |
| 1200 parser->set_allow_harmony_numeric_literals( | 1225 parser->set_allow_harmony_numeric_literals( |
| 1201 flags.Contains(kAllowHarmonyNumericLiterals)); | 1226 flags.Contains(kAllowHarmonyNumericLiterals)); |
| 1227 parser->set_allow_arrow_functions(i::FLAG_harmony_arrow_functions); |
| 1202 } | 1228 } |
| 1203 | 1229 |
| 1204 | 1230 |
| 1205 void TestParserSyncWithFlags(i::Handle<i::String> source, | 1231 void TestParserSyncWithFlags(i::Handle<i::String> source, |
| 1206 i::EnumSet<ParserFlag> flags, | 1232 i::EnumSet<ParserFlag> flags, |
| 1207 ParserSyncTestResult result) { | 1233 ParserSyncTestResult result) { |
| 1208 i::Isolate* isolate = CcTest::i_isolate(); | 1234 i::Isolate* isolate = CcTest::i_isolate(); |
| 1209 i::Factory* factory = isolate->factory(); | 1235 i::Factory* factory = isolate->factory(); |
| 1210 | 1236 |
| 1211 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); | 1237 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1310 i::EnumSet<ParserFlag> flags; | 1336 i::EnumSet<ParserFlag> flags; |
| 1311 for (size_t flag_index = 0; flag_index < flag_list_length; flag_index++) { | 1337 for (size_t flag_index = 0; flag_index < flag_list_length; flag_index++) { |
| 1312 if ((bits & (1 << flag_index)) != 0) flags.Add(flag_list[flag_index]); | 1338 if ((bits & (1 << flag_index)) != 0) flags.Add(flag_list[flag_index]); |
| 1313 } | 1339 } |
| 1314 TestParserSyncWithFlags(str, flags, result); | 1340 TestParserSyncWithFlags(str, flags, result); |
| 1315 } | 1341 } |
| 1316 } | 1342 } |
| 1317 | 1343 |
| 1318 | 1344 |
| 1319 TEST(ParserSync) { | 1345 TEST(ParserSync) { |
| 1346 i::FLAG_harmony_arrow_functions = true; |
| 1347 |
| 1320 const char* context_data[][2] = { | 1348 const char* context_data[][2] = { |
| 1321 { "", "" }, | 1349 { "", "" }, |
| 1322 { "{", "}" }, | 1350 { "{", "}" }, |
| 1323 { "if (true) ", " else {}" }, | 1351 { "if (true) ", " else {}" }, |
| 1324 { "if (true) {} else ", "" }, | 1352 { "if (true) {} else ", "" }, |
| 1325 { "if (true) ", "" }, | 1353 { "if (true) ", "" }, |
| 1326 { "do ", " while (false)" }, | 1354 { "do ", " while (false)" }, |
| 1327 { "while (false) ", "" }, | 1355 { "while (false) ", "" }, |
| 1328 { "for (;;) ", "" }, | 1356 { "for (;;) ", "" }, |
| 1329 { "with ({})", "" }, | 1357 { "with ({})", "" }, |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1431 | 1459 |
| 1432 static const ParserFlag flags3[] = { kAllowNativesSyntax }; | 1460 static const ParserFlag flags3[] = { kAllowNativesSyntax }; |
| 1433 TestParserSync("%DebugPrint(123)", flags3, ARRAY_SIZE(flags3)); | 1461 TestParserSync("%DebugPrint(123)", flags3, ARRAY_SIZE(flags3)); |
| 1434 } | 1462 } |
| 1435 | 1463 |
| 1436 | 1464 |
| 1437 TEST(StrictOctal) { | 1465 TEST(StrictOctal) { |
| 1438 // Test that syntax error caused by octal literal is reported correctly as | 1466 // Test that syntax error caused by octal literal is reported correctly as |
| 1439 // such (issue 2220). | 1467 // such (issue 2220). |
| 1440 v8::V8::Initialize(); | 1468 v8::V8::Initialize(); |
| 1469 i::FLAG_harmony_arrow_functions = true; |
| 1470 |
| 1441 v8::HandleScope scope(CcTest::isolate()); | 1471 v8::HandleScope scope(CcTest::isolate()); |
| 1442 v8::Context::Scope context_scope( | 1472 v8::Context::Scope context_scope( |
| 1443 v8::Context::New(CcTest::isolate())); | 1473 v8::Context::New(CcTest::isolate())); |
| 1444 v8::TryCatch try_catch; | 1474 v8::TryCatch try_catch; |
| 1445 const char* script = | 1475 const char* script = |
| 1446 "\"use strict\"; \n" | 1476 "\"use strict\"; \n" |
| 1447 "a = function() { \n" | 1477 "a = function() { \n" |
| 1448 " b = function() { \n" | 1478 " b = function() { \n" |
| 1449 " 01; \n" | 1479 " 01; \n" |
| 1450 " }; \n" | 1480 " }; \n" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1519 "var foo, eval;", | 1549 "var foo, eval;", |
| 1520 "var foo, arguments;", | 1550 "var foo, arguments;", |
| 1521 "try { } catch (eval) { }", | 1551 "try { } catch (eval) { }", |
| 1522 "try { } catch (arguments) { }", | 1552 "try { } catch (arguments) { }", |
| 1523 "function eval() { }", | 1553 "function eval() { }", |
| 1524 "function arguments() { }", | 1554 "function arguments() { }", |
| 1525 "function foo(eval) { }", | 1555 "function foo(eval) { }", |
| 1526 "function foo(arguments) { }", | 1556 "function foo(arguments) { }", |
| 1527 "function foo(bar, eval) { }", | 1557 "function foo(bar, eval) { }", |
| 1528 "function foo(bar, arguments) { }", | 1558 "function foo(bar, arguments) { }", |
| 1559 "(eval) => { }", |
| 1560 "(arguments) => { }", |
| 1561 "(foo, eval) => { }", |
| 1562 "(foo, arguments) => { }", |
| 1529 "eval = 1;", | 1563 "eval = 1;", |
| 1530 "arguments = 1;", | 1564 "arguments = 1;", |
| 1531 "var foo = eval = 1;", | 1565 "var foo = eval = 1;", |
| 1532 "var foo = arguments = 1;", | 1566 "var foo = arguments = 1;", |
| 1533 "++eval;", | 1567 "++eval;", |
| 1534 "++arguments;", | 1568 "++arguments;", |
| 1535 "eval++;", | 1569 "eval++;", |
| 1536 "arguments++;", | 1570 "arguments++;", |
| 1537 NULL | 1571 NULL |
| 1538 }; | 1572 }; |
| 1539 | 1573 |
| 1574 i::FLAG_harmony_arrow_functions = true; |
| 1540 RunParserSyncTest(context_data, statement_data, kError); | 1575 RunParserSyncTest(context_data, statement_data, kError); |
| 1541 } | 1576 } |
| 1542 | 1577 |
| 1543 | 1578 |
| 1544 TEST(NoErrorsEvalAndArgumentsSloppy) { | 1579 TEST(NoErrorsEvalAndArgumentsSloppy) { |
| 1545 // Tests that both preparsing and parsing accept "eval" and "arguments" as | 1580 // Tests that both preparsing and parsing accept "eval" and "arguments" as |
| 1546 // identifiers when needed. | 1581 // identifiers when needed. |
| 1547 const char* context_data[][2] = { | 1582 const char* context_data[][2] = { |
| 1548 { "", "" }, | 1583 { "", "" }, |
| 1549 { "function test_func() {", "}"}, | 1584 { "function test_func() {", "}"}, |
| 1550 { NULL, NULL } | 1585 { NULL, NULL } |
| 1551 }; | 1586 }; |
| 1552 | 1587 |
| 1553 const char* statement_data[] = { | 1588 const char* statement_data[] = { |
| 1554 "var eval;", | 1589 "var eval;", |
| 1555 "var arguments", | 1590 "var arguments", |
| 1556 "var foo, eval;", | 1591 "var foo, eval;", |
| 1557 "var foo, arguments;", | 1592 "var foo, arguments;", |
| 1558 "try { } catch (eval) { }", | 1593 "try { } catch (eval) { }", |
| 1559 "try { } catch (arguments) { }", | 1594 "try { } catch (arguments) { }", |
| 1560 "function eval() { }", | 1595 "function eval() { }", |
| 1561 "function arguments() { }", | 1596 "function arguments() { }", |
| 1562 "function foo(eval) { }", | 1597 "function foo(eval) { }", |
| 1563 "function foo(arguments) { }", | 1598 "function foo(arguments) { }", |
| 1564 "function foo(bar, eval) { }", | 1599 "function foo(bar, eval) { }", |
| 1565 "function foo(bar, arguments) { }", | 1600 "function foo(bar, arguments) { }", |
| 1601 "(eval) => { }", |
| 1602 "(arguments) => { }", |
| 1603 "(bar, eval) => { }", |
| 1604 "(bar, arguments) => { }", |
| 1566 "eval = 1;", | 1605 "eval = 1;", |
| 1567 "arguments = 1;", | 1606 "arguments = 1;", |
| 1568 "var foo = eval = 1;", | 1607 "var foo = eval = 1;", |
| 1569 "var foo = arguments = 1;", | 1608 "var foo = arguments = 1;", |
| 1570 "++eval;", | 1609 "++eval;", |
| 1571 "++arguments;", | 1610 "++arguments;", |
| 1572 "eval++;", | 1611 "eval++;", |
| 1573 "arguments++;", | 1612 "arguments++;", |
| 1574 NULL | 1613 NULL |
| 1575 }; | 1614 }; |
| 1576 | 1615 |
| 1616 i::FLAG_harmony_arrow_functions = true; |
| 1577 RunParserSyncTest(context_data, statement_data, kSuccess); | 1617 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 1578 } | 1618 } |
| 1579 | 1619 |
| 1580 | 1620 |
| 1581 TEST(NoErrorsEvalAndArgumentsStrict) { | 1621 TEST(NoErrorsEvalAndArgumentsStrict) { |
| 1582 const char* context_data[][2] = { | 1622 const char* context_data[][2] = { |
| 1583 { "\"use strict\";", "" }, | 1623 { "\"use strict\";", "" }, |
| 1584 { "function test_func() { \"use strict\";", "}" }, | 1624 { "function test_func() { \"use strict\";", "}" }, |
| 1625 { "() => { \"use strict\"; ", "}" }, |
| 1585 { NULL, NULL } | 1626 { NULL, NULL } |
| 1586 }; | 1627 }; |
| 1587 | 1628 |
| 1588 const char* statement_data[] = { | 1629 const char* statement_data[] = { |
| 1589 "eval;", | 1630 "eval;", |
| 1590 "arguments;", | 1631 "arguments;", |
| 1591 "var foo = eval;", | 1632 "var foo = eval;", |
| 1592 "var foo = arguments;", | 1633 "var foo = arguments;", |
| 1593 "var foo = { eval: 1 };", | 1634 "var foo = { eval: 1 };", |
| 1594 "var foo = { arguments: 1 };", | 1635 "var foo = { arguments: 1 };", |
| 1595 "var foo = { }; foo.eval = {};", | 1636 "var foo = { }; foo.eval = {};", |
| 1596 "var foo = { }; foo.arguments = {};", | 1637 "var foo = { }; foo.arguments = {};", |
| 1597 NULL | 1638 NULL |
| 1598 }; | 1639 }; |
| 1599 | 1640 |
| 1641 i::FLAG_harmony_arrow_functions = true; |
| 1600 RunParserSyncTest(context_data, statement_data, kSuccess); | 1642 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 1601 } | 1643 } |
| 1602 | 1644 |
| 1603 | 1645 |
| 1604 TEST(ErrorsFutureStrictReservedWords) { | 1646 TEST(ErrorsFutureStrictReservedWords) { |
| 1605 // Tests that both preparsing and parsing produce the right kind of errors for | 1647 // Tests that both preparsing and parsing produce the right kind of errors for |
| 1606 // using future strict reserved words as identifiers. Without the strict mode, | 1648 // using future strict reserved words as identifiers. Without the strict mode, |
| 1607 // it's ok to use future strict reserved words as identifiers. With the strict | 1649 // it's ok to use future strict reserved words as identifiers. With the strict |
| 1608 // mode, it isn't. | 1650 // mode, it isn't. |
| 1609 const char* context_data[][2] = { | 1651 const char* context_data[][2] = { |
| 1610 { "\"use strict\";", "" }, | 1652 { "\"use strict\";", "" }, |
| 1611 { "function test_func() {\"use strict\"; ", "}"}, | 1653 { "function test_func() {\"use strict\"; ", "}"}, |
| 1654 { "() => { \"use strict\"; ", "}" }, |
| 1612 { NULL, NULL } | 1655 { NULL, NULL } |
| 1613 }; | 1656 }; |
| 1614 | 1657 |
| 1615 const char* statement_data[] = { | 1658 const char* statement_data[] = { |
| 1616 "var interface;", | 1659 "var interface;", |
| 1617 "var foo, interface;", | 1660 "var foo, interface;", |
| 1618 "try { } catch (interface) { }", | 1661 "try { } catch (interface) { }", |
| 1619 "function interface() { }", | 1662 "function interface() { }", |
| 1620 "function foo(interface) { }", | 1663 "function foo(interface) { }", |
| 1621 "function foo(bar, interface) { }", | 1664 "function foo(bar, interface) { }", |
| 1665 "(interface) => { }", |
| 1666 "(bar, interface) => { }", |
| 1622 "interface = 1;", | 1667 "interface = 1;", |
| 1623 "var foo = interface = 1;", | 1668 "var foo = interface = 1;", |
| 1624 "++interface;", | 1669 "++interface;", |
| 1625 "interface++;", | 1670 "interface++;", |
| 1626 NULL | 1671 NULL |
| 1627 }; | 1672 }; |
| 1628 | 1673 |
| 1674 i::FLAG_harmony_arrow_functions = true; |
| 1629 RunParserSyncTest(context_data, statement_data, kError); | 1675 RunParserSyncTest(context_data, statement_data, kError); |
| 1630 } | 1676 } |
| 1631 | 1677 |
| 1632 | 1678 |
| 1633 TEST(NoErrorsFutureStrictReservedWords) { | 1679 TEST(NoErrorsFutureStrictReservedWords) { |
| 1634 const char* context_data[][2] = { | 1680 const char* context_data[][2] = { |
| 1635 { "", "" }, | 1681 { "", "" }, |
| 1636 { "function test_func() {", "}"}, | 1682 { "function test_func() {", "}"}, |
| 1683 { "() => {", "}" }, |
| 1637 { NULL, NULL } | 1684 { NULL, NULL } |
| 1638 }; | 1685 }; |
| 1639 | 1686 |
| 1640 const char* statement_data[] = { | 1687 const char* statement_data[] = { |
| 1641 "var interface;", | 1688 "var interface;", |
| 1642 "var foo, interface;", | 1689 "var foo, interface;", |
| 1643 "try { } catch (interface) { }", | 1690 "try { } catch (interface) { }", |
| 1644 "function interface() { }", | 1691 "function interface() { }", |
| 1645 "function foo(interface) { }", | 1692 "function foo(interface) { }", |
| 1646 "function foo(bar, interface) { }", | 1693 "function foo(bar, interface) { }", |
| 1694 "(interface) => { }", |
| 1695 "(bar, interface) => { }", |
| 1647 "interface = 1;", | 1696 "interface = 1;", |
| 1648 "var foo = interface = 1;", | 1697 "var foo = interface = 1;", |
| 1649 "++interface;", | 1698 "++interface;", |
| 1650 "interface++;", | 1699 "interface++;", |
| 1651 NULL | 1700 NULL |
| 1652 }; | 1701 }; |
| 1653 | 1702 |
| 1703 i::FLAG_harmony_arrow_functions = true; |
| 1654 RunParserSyncTest(context_data, statement_data, kSuccess); | 1704 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 1655 } | 1705 } |
| 1656 | 1706 |
| 1657 | 1707 |
| 1658 TEST(ErrorsReservedWords) { | 1708 TEST(ErrorsReservedWords) { |
| 1659 // Tests that both preparsing and parsing produce the right kind of errors for | 1709 // Tests that both preparsing and parsing produce the right kind of errors for |
| 1660 // using future reserved words as identifiers. These tests don't depend on the | 1710 // using future reserved words as identifiers. These tests don't depend on the |
| 1661 // strict mode. | 1711 // strict mode. |
| 1662 const char* context_data[][2] = { | 1712 const char* context_data[][2] = { |
| 1663 { "", "" }, | 1713 { "", "" }, |
| 1664 { "\"use strict\";", "" }, | 1714 { "\"use strict\";", "" }, |
| 1665 { "var eval; function test_func() {", "}"}, | 1715 { "var eval; function test_func() {", "}"}, |
| 1666 { "var eval; function test_func() {\"use strict\"; ", "}"}, | 1716 { "var eval; function test_func() {\"use strict\"; ", "}"}, |
| 1717 { "var eval; () => {", "}" }, |
| 1718 { "var eval; () => {\"use strict\"; ", "}" }, |
| 1667 { NULL, NULL } | 1719 { NULL, NULL } |
| 1668 }; | 1720 }; |
| 1669 | 1721 |
| 1670 const char* statement_data[] = { | 1722 const char* statement_data[] = { |
| 1671 "var super;", | 1723 "var super;", |
| 1672 "var foo, super;", | 1724 "var foo, super;", |
| 1673 "try { } catch (super) { }", | 1725 "try { } catch (super) { }", |
| 1674 "function super() { }", | 1726 "function super() { }", |
| 1675 "function foo(super) { }", | 1727 "function foo(super) { }", |
| 1676 "function foo(bar, super) { }", | 1728 "function foo(bar, super) { }", |
| 1729 "(super) => { }", |
| 1730 "(bar, super) => { }", |
| 1677 "super = 1;", | 1731 "super = 1;", |
| 1678 "var foo = super = 1;", | 1732 "var foo = super = 1;", |
| 1679 "++super;", | 1733 "++super;", |
| 1680 "super++;", | 1734 "super++;", |
| 1681 "function foo super", | 1735 "function foo super", |
| 1682 NULL | 1736 NULL |
| 1683 }; | 1737 }; |
| 1684 | 1738 |
| 1739 i::FLAG_harmony_arrow_functions = true; |
| 1685 RunParserSyncTest(context_data, statement_data, kError); | 1740 RunParserSyncTest(context_data, statement_data, kError); |
| 1686 } | 1741 } |
| 1687 | 1742 |
| 1688 | 1743 |
| 1689 TEST(NoErrorsYieldSloppy) { | 1744 TEST(NoErrorsYieldSloppy) { |
| 1690 // In sloppy mode, it's okay to use "yield" as identifier, *except* inside a | 1745 // In sloppy mode, it's okay to use "yield" as identifier, *except* inside a |
| 1691 // generator (see next test). | 1746 // generator (see next test). |
| 1692 const char* context_data[][2] = { | 1747 const char* context_data[][2] = { |
| 1693 { "", "" }, | 1748 { "", "" }, |
| 1694 { "function is_not_gen() {", "}" }, | 1749 { "function is_not_gen() {", "}" }, |
| 1750 { "() => {", "}" }, |
| 1695 { NULL, NULL } | 1751 { NULL, NULL } |
| 1696 }; | 1752 }; |
| 1697 | 1753 |
| 1698 const char* statement_data[] = { | 1754 const char* statement_data[] = { |
| 1699 "var yield;", | 1755 "var yield;", |
| 1700 "var foo, yield;", | 1756 "var foo, yield;", |
| 1701 "try { } catch (yield) { }", | 1757 "try { } catch (yield) { }", |
| 1702 "function yield() { }", | 1758 "function yield() { }", |
| 1703 "function foo(yield) { }", | 1759 "function foo(yield) { }", |
| 1704 "function foo(bar, yield) { }", | 1760 "function foo(bar, yield) { }", |
| 1761 "(yield) => { }", |
| 1762 "(bar, yield) => { }", |
| 1705 "yield = 1;", | 1763 "yield = 1;", |
| 1706 "var foo = yield = 1;", | 1764 "var foo = yield = 1;", |
| 1707 "++yield;", | 1765 "++yield;", |
| 1708 "yield++;", | 1766 "yield++;", |
| 1709 NULL | 1767 NULL |
| 1710 }; | 1768 }; |
| 1711 | 1769 |
| 1770 i::FLAG_harmony_arrow_functions = true; |
| 1712 RunParserSyncTest(context_data, statement_data, kSuccess); | 1771 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 1713 } | 1772 } |
| 1714 | 1773 |
| 1715 | 1774 |
| 1716 TEST(ErrorsYieldSloppyGenerator) { | 1775 TEST(ErrorsYieldSloppyGenerator) { |
| 1717 const char* context_data[][2] = { | 1776 const char* context_data[][2] = { |
| 1718 { "function * is_gen() {", "}" }, | 1777 { "function * is_gen() {", "}" }, |
| 1719 { NULL, NULL } | 1778 { NULL, NULL } |
| 1720 }; | 1779 }; |
| 1721 | 1780 |
| 1722 const char* statement_data[] = { | 1781 const char* statement_data[] = { |
| 1723 "var yield;", | 1782 "var yield;", |
| 1724 "var foo, yield;", | 1783 "var foo, yield;", |
| 1725 "try { } catch (yield) { }", | 1784 "try { } catch (yield) { }", |
| 1726 "function yield() { }", | 1785 "function yield() { }", |
| 1727 // BUG: These should not be allowed, but they are (if kAllowGenerators is | 1786 // BUG: These should not be allowed, but they are (if kAllowGenerators is |
| 1728 // set) | 1787 // set) |
| 1729 // "function foo(yield) { }", | 1788 // "function foo(yield) { }", |
| 1730 // "function foo(bar, yield) { }", | 1789 // "function foo(bar, yield) { }", |
| 1731 "yield = 1;", | 1790 "yield = 1;", |
| 1732 "var foo = yield = 1;", | 1791 "var foo = yield = 1;", |
| 1733 "++yield;", | 1792 "++yield;", |
| 1734 "yield++;", | 1793 "yield++;", |
| 1735 NULL | 1794 NULL |
| 1736 }; | 1795 }; |
| 1737 | 1796 |
| 1738 // If generators are not allowed, the error will be produced at the '*' token, | 1797 // If generators are not allowed, the error will be produced at the '*' token, |
| 1739 // so this test works both with and without the kAllowGenerators flag. | 1798 // so this test works both with and without the kAllowGenerators flag. |
| 1799 i::FLAG_harmony_arrow_functions = true; |
| 1740 RunParserSyncTest(context_data, statement_data, kError); | 1800 RunParserSyncTest(context_data, statement_data, kError); |
| 1741 } | 1801 } |
| 1742 | 1802 |
| 1743 | 1803 |
| 1744 TEST(ErrorsYieldStrict) { | 1804 TEST(ErrorsYieldStrict) { |
| 1745 const char* context_data[][2] = { | 1805 const char* context_data[][2] = { |
| 1746 { "\"use strict\";", "" }, | 1806 { "\"use strict\";", "" }, |
| 1747 { "\"use strict\"; function is_not_gen() {", "}" }, | 1807 { "\"use strict\"; function is_not_gen() {", "}" }, |
| 1748 { "function test_func() {\"use strict\"; ", "}"}, | 1808 { "function test_func() {\"use strict\"; ", "}"}, |
| 1809 { "() => {\"use strict\"; ", "}" }, |
| 1749 { NULL, NULL } | 1810 { NULL, NULL } |
| 1750 }; | 1811 }; |
| 1751 | 1812 |
| 1752 const char* statement_data[] = { | 1813 const char* statement_data[] = { |
| 1753 "var yield;", | 1814 "var yield;", |
| 1754 "var foo, yield;", | 1815 "var foo, yield;", |
| 1755 "try { } catch (yield) { }", | 1816 "try { } catch (yield) { }", |
| 1756 "function yield() { }", | 1817 "function yield() { }", |
| 1757 "function foo(yield) { }", | 1818 "function foo(yield) { }", |
| 1758 "function foo(bar, yield) { }", | 1819 "function foo(bar, yield) { }", |
| 1820 "(yield) => { }", |
| 1821 "(bar, yield) => { }", |
| 1759 "yield = 1;", | 1822 "yield = 1;", |
| 1760 "var foo = yield = 1;", | 1823 "var foo = yield = 1;", |
| 1761 "++yield;", | 1824 "++yield;", |
| 1762 "yield++;", | 1825 "yield++;", |
| 1763 NULL | 1826 NULL |
| 1764 }; | 1827 }; |
| 1765 | 1828 |
| 1829 i::FLAG_harmony_arrow_functions = true; |
| 1766 RunParserSyncTest(context_data, statement_data, kError); | 1830 RunParserSyncTest(context_data, statement_data, kError); |
| 1767 } | 1831 } |
| 1768 | 1832 |
| 1769 | 1833 |
| 1770 TEST(ErrorsYield) { | 1834 TEST(ErrorsYield) { |
| 1771 const char* context_data[][2] = { | 1835 const char* context_data[][2] = { |
| 1772 { "function * is_gen() {", "}" }, | 1836 { "function * is_gen() {", "}" }, |
| 1773 { NULL, NULL } | 1837 { NULL, NULL } |
| 1774 }; | 1838 }; |
| 1775 | 1839 |
| 1776 const char* statement_data[] = { | 1840 const char* statement_data[] = { |
| 1777 "yield 2;", // this is legal inside generator | 1841 "yield 2;", // this is legal inside generator |
| 1778 "yield * 2;", // this is legal inside generator | 1842 "yield * 2;", // this is legal inside generator |
| 1779 NULL | 1843 NULL |
| 1780 }; | 1844 }; |
| 1781 | 1845 |
| 1782 // Here we cannot assert that there is no error, since there will be without | 1846 // Here we cannot assert that there is no error, since there will be without |
| 1783 // the kAllowGenerators flag. However, we test that Parser and PreParser | 1847 // the kAllowGenerators flag. However, we test that Parser and PreParser |
| 1784 // produce the same errors. | 1848 // produce the same errors. |
| 1849 i::FLAG_harmony_arrow_functions = true; |
| 1785 RunParserSyncTest(context_data, statement_data, kSuccessOrError); | 1850 RunParserSyncTest(context_data, statement_data, kSuccessOrError); |
| 1786 } | 1851 } |
| 1787 | 1852 |
| 1788 | 1853 |
| 1789 TEST(ErrorsNameOfStrictFunction) { | 1854 TEST(ErrorsNameOfStrictFunction) { |
| 1790 // Tests that illegal tokens as names of a strict function produce the correct | 1855 // Tests that illegal tokens as names of a strict function produce the correct |
| 1791 // errors. | 1856 // errors. |
| 1792 const char* context_data[][2] = { | 1857 const char* context_data[][2] = { |
| 1793 { "", ""}, | 1858 { "", ""}, |
| 1794 { "\"use strict\";", ""}, | 1859 { "\"use strict\";", ""}, |
| 1795 { NULL, NULL } | 1860 { NULL, NULL } |
| 1796 }; | 1861 }; |
| 1797 | 1862 |
| 1798 const char* statement_data[] = { | 1863 const char* statement_data[] = { |
| 1799 "function eval() {\"use strict\";}", | 1864 "function eval() {\"use strict\";}", |
| 1800 "function arguments() {\"use strict\";}", | 1865 "function arguments() {\"use strict\";}", |
| 1801 "function interface() {\"use strict\";}", | 1866 "function interface() {\"use strict\";}", |
| 1802 "function yield() {\"use strict\";}", | 1867 "function yield() {\"use strict\";}", |
| 1803 // Future reserved words are always illegal | 1868 // Future reserved words are always illegal |
| 1804 "function super() { }", | 1869 "function super() { }", |
| 1805 "function super() {\"use strict\";}", | 1870 "function super() {\"use strict\";}", |
| 1806 NULL | 1871 NULL |
| 1807 }; | 1872 }; |
| 1808 | 1873 |
| 1874 i::FLAG_harmony_arrow_functions = true; |
| 1809 RunParserSyncTest(context_data, statement_data, kError); | 1875 RunParserSyncTest(context_data, statement_data, kError); |
| 1810 } | 1876 } |
| 1811 | 1877 |
| 1812 | 1878 |
| 1813 TEST(NoErrorsNameOfStrictFunction) { | 1879 TEST(NoErrorsNameOfStrictFunction) { |
| 1814 const char* context_data[][2] = { | 1880 const char* context_data[][2] = { |
| 1815 { "", ""}, | 1881 { "", ""}, |
| 1816 { NULL, NULL } | 1882 { NULL, NULL } |
| 1817 }; | 1883 }; |
| 1818 | 1884 |
| 1819 const char* statement_data[] = { | 1885 const char* statement_data[] = { |
| 1820 "function eval() { }", | 1886 "function eval() { }", |
| 1821 "function arguments() { }", | 1887 "function arguments() { }", |
| 1822 "function interface() { }", | 1888 "function interface() { }", |
| 1823 "function yield() { }", | 1889 "function yield() { }", |
| 1824 NULL | 1890 NULL |
| 1825 }; | 1891 }; |
| 1826 | 1892 |
| 1893 i::FLAG_harmony_arrow_functions = true; |
| 1827 RunParserSyncTest(context_data, statement_data, kSuccess); | 1894 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 1828 } | 1895 } |
| 1829 | 1896 |
| 1830 | 1897 |
| 1831 | 1898 |
| 1832 TEST(ErrorsIllegalWordsAsLabelsSloppy) { | 1899 TEST(ErrorsIllegalWordsAsLabelsSloppy) { |
| 1833 // Using future reserved words as labels is always an error. | 1900 // Using future reserved words as labels is always an error. |
| 1834 const char* context_data[][2] = { | 1901 const char* context_data[][2] = { |
| 1835 { "", ""}, | 1902 { "", ""}, |
| 1836 { "function test_func() {", "}" }, | 1903 { "function test_func() {", "}" }, |
| 1904 { "() => {", "}" }, |
| 1837 { NULL, NULL } | 1905 { NULL, NULL } |
| 1838 }; | 1906 }; |
| 1839 | 1907 |
| 1840 const char* statement_data[] = { | 1908 const char* statement_data[] = { |
| 1841 "super: while(true) { break super; }", | 1909 "super: while(true) { break super; }", |
| 1842 NULL | 1910 NULL |
| 1843 }; | 1911 }; |
| 1844 | 1912 |
| 1913 i::FLAG_harmony_arrow_functions = true; |
| 1845 RunParserSyncTest(context_data, statement_data, kError); | 1914 RunParserSyncTest(context_data, statement_data, kError); |
| 1846 } | 1915 } |
| 1847 | 1916 |
| 1848 | 1917 |
| 1849 TEST(ErrorsIllegalWordsAsLabelsStrict) { | 1918 TEST(ErrorsIllegalWordsAsLabelsStrict) { |
| 1850 // Tests that illegal tokens as labels produce the correct errors. | 1919 // Tests that illegal tokens as labels produce the correct errors. |
| 1851 const char* context_data[][2] = { | 1920 const char* context_data[][2] = { |
| 1852 { "\"use strict\";", "" }, | 1921 { "\"use strict\";", "" }, |
| 1853 { "function test_func() {\"use strict\"; ", "}"}, | 1922 { "function test_func() {\"use strict\"; ", "}"}, |
| 1923 { "() => {\"use strict\"; ", "}" }, |
| 1854 { NULL, NULL } | 1924 { NULL, NULL } |
| 1855 }; | 1925 }; |
| 1856 | 1926 |
| 1857 const char* statement_data[] = { | 1927 const char* statement_data[] = { |
| 1858 "super: while(true) { break super; }", | 1928 "super: while(true) { break super; }", |
| 1859 "interface: while(true) { break interface; }", | 1929 "interface: while(true) { break interface; }", |
| 1860 "yield: while(true) { break yield; }", | 1930 "yield: while(true) { break yield; }", |
| 1861 NULL | 1931 NULL |
| 1862 }; | 1932 }; |
| 1863 | 1933 |
| 1934 i::FLAG_harmony_arrow_functions = true; |
| 1864 RunParserSyncTest(context_data, statement_data, kError); | 1935 RunParserSyncTest(context_data, statement_data, kError); |
| 1865 } | 1936 } |
| 1866 | 1937 |
| 1867 | 1938 |
| 1868 TEST(NoErrorsIllegalWordsAsLabels) { | 1939 TEST(NoErrorsIllegalWordsAsLabels) { |
| 1869 // Using eval and arguments as labels is legal even in strict mode. | 1940 // Using eval and arguments as labels is legal even in strict mode. |
| 1870 const char* context_data[][2] = { | 1941 const char* context_data[][2] = { |
| 1871 { "", ""}, | 1942 { "", ""}, |
| 1872 { "function test_func() {", "}" }, | 1943 { "function test_func() {", "}" }, |
| 1944 { "() => {", "}" }, |
| 1873 { "\"use strict\";", "" }, | 1945 { "\"use strict\";", "" }, |
| 1874 { "\"use strict\"; function test_func() {", "}" }, | 1946 { "\"use strict\"; function test_func() {", "}" }, |
| 1947 { "\"use strict\"; () => {", "}" }, |
| 1875 { NULL, NULL } | 1948 { NULL, NULL } |
| 1876 }; | 1949 }; |
| 1877 | 1950 |
| 1878 const char* statement_data[] = { | 1951 const char* statement_data[] = { |
| 1879 "mylabel: while(true) { break mylabel; }", | 1952 "mylabel: while(true) { break mylabel; }", |
| 1880 "eval: while(true) { break eval; }", | 1953 "eval: while(true) { break eval; }", |
| 1881 "arguments: while(true) { break arguments; }", | 1954 "arguments: while(true) { break arguments; }", |
| 1882 NULL | 1955 NULL |
| 1883 }; | 1956 }; |
| 1884 | 1957 |
| 1958 i::FLAG_harmony_arrow_functions = true; |
| 1885 RunParserSyncTest(context_data, statement_data, kSuccess); | 1959 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 1886 } | 1960 } |
| 1887 | 1961 |
| 1888 | 1962 |
| 1889 TEST(ErrorsParenthesizedLabels) { | 1963 TEST(ErrorsParenthesizedLabels) { |
| 1890 // Parenthesized identifiers shouldn't be recognized as labels. | 1964 // Parenthesized identifiers shouldn't be recognized as labels. |
| 1891 const char* context_data[][2] = { | 1965 const char* context_data[][2] = { |
| 1892 { "", ""}, | 1966 { "", ""}, |
| 1893 { "function test_func() {", "}" }, | 1967 { "function test_func() {", "}" }, |
| 1968 { "() => {", "}" }, |
| 1894 { NULL, NULL } | 1969 { NULL, NULL } |
| 1895 }; | 1970 }; |
| 1896 | 1971 |
| 1897 const char* statement_data[] = { | 1972 const char* statement_data[] = { |
| 1898 "(mylabel): while(true) { break mylabel; }", | 1973 "(mylabel): while(true) { break mylabel; }", |
| 1899 NULL | 1974 NULL |
| 1900 }; | 1975 }; |
| 1901 | 1976 |
| 1977 i::FLAG_harmony_arrow_functions = true; |
| 1902 RunParserSyncTest(context_data, statement_data, kError); | 1978 RunParserSyncTest(context_data, statement_data, kError); |
| 1903 } | 1979 } |
| 1904 | 1980 |
| 1905 | 1981 |
| 1906 TEST(NoErrorsParenthesizedDirectivePrologue) { | 1982 TEST(NoErrorsParenthesizedDirectivePrologue) { |
| 1907 // Parenthesized directive prologue shouldn't be recognized. | 1983 // Parenthesized directive prologue shouldn't be recognized. |
| 1908 const char* context_data[][2] = { | 1984 const char* context_data[][2] = { |
| 1909 { "", ""}, | 1985 { "", ""}, |
| 1910 { NULL, NULL } | 1986 { NULL, NULL } |
| 1911 }; | 1987 }; |
| 1912 | 1988 |
| 1913 const char* statement_data[] = { | 1989 const char* statement_data[] = { |
| 1914 "(\"use strict\"); var eval;", | 1990 "(\"use strict\"); var eval;", |
| 1915 NULL | 1991 NULL |
| 1916 }; | 1992 }; |
| 1917 | 1993 |
| 1994 i::FLAG_harmony_arrow_functions = true; |
| 1918 RunParserSyncTest(context_data, statement_data, kSuccess); | 1995 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 1919 } | 1996 } |
| 1920 | 1997 |
| 1921 | 1998 |
| 1922 TEST(ErrorsNotAnIdentifierName) { | 1999 TEST(ErrorsNotAnIdentifierName) { |
| 1923 const char* context_data[][2] = { | 2000 const char* context_data[][2] = { |
| 1924 { "", ""}, | 2001 { "", ""}, |
| 1925 { "\"use strict\";", ""}, | 2002 { "\"use strict\";", ""}, |
| 1926 { NULL, NULL } | 2003 { NULL, NULL } |
| 1927 }; | 2004 }; |
| 1928 | 2005 |
| 1929 const char* statement_data[] = { | 2006 const char* statement_data[] = { |
| 1930 "var foo = {}; foo.{;", | 2007 "var foo = {}; foo.{;", |
| 1931 "var foo = {}; foo.};", | 2008 "var foo = {}; foo.};", |
| 1932 "var foo = {}; foo.=;", | 2009 "var foo = {}; foo.=;", |
| 1933 "var foo = {}; foo.888;", | 2010 "var foo = {}; foo.888;", |
| 1934 "var foo = {}; foo.-;", | 2011 "var foo = {}; foo.-;", |
| 1935 "var foo = {}; foo.--;", | 2012 "var foo = {}; foo.--;", |
| 1936 NULL | 2013 NULL |
| 1937 }; | 2014 }; |
| 1938 | 2015 |
| 2016 i::FLAG_harmony_arrow_functions = true; |
| 1939 RunParserSyncTest(context_data, statement_data, kError); | 2017 RunParserSyncTest(context_data, statement_data, kError); |
| 1940 } | 2018 } |
| 1941 | 2019 |
| 1942 | 2020 |
| 1943 TEST(NoErrorsIdentifierNames) { | 2021 TEST(NoErrorsIdentifierNames) { |
| 1944 // Keywords etc. are valid as property names. | 2022 // Keywords etc. are valid as property names. |
| 1945 const char* context_data[][2] = { | 2023 const char* context_data[][2] = { |
| 1946 { "", ""}, | 2024 { "", ""}, |
| 1947 { "\"use strict\";", ""}, | 2025 { "\"use strict\";", ""}, |
| 1948 { NULL, NULL } | 2026 { NULL, NULL } |
| 1949 }; | 2027 }; |
| 1950 | 2028 |
| 1951 const char* statement_data[] = { | 2029 const char* statement_data[] = { |
| 1952 "var foo = {}; foo.if;", | 2030 "var foo = {}; foo.if;", |
| 1953 "var foo = {}; foo.yield;", | 2031 "var foo = {}; foo.yield;", |
| 1954 "var foo = {}; foo.super;", | 2032 "var foo = {}; foo.super;", |
| 1955 "var foo = {}; foo.interface;", | 2033 "var foo = {}; foo.interface;", |
| 1956 "var foo = {}; foo.eval;", | 2034 "var foo = {}; foo.eval;", |
| 1957 "var foo = {}; foo.arguments;", | 2035 "var foo = {}; foo.arguments;", |
| 1958 NULL | 2036 NULL |
| 1959 }; | 2037 }; |
| 1960 | 2038 |
| 2039 i::FLAG_harmony_arrow_functions = true; |
| 1961 RunParserSyncTest(context_data, statement_data, kSuccess); | 2040 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 1962 } | 2041 } |
| 1963 | 2042 |
| 1964 | 2043 |
| 1965 TEST(DontRegressPreParserDataSizes) { | 2044 TEST(DontRegressPreParserDataSizes) { |
| 1966 // These tests make sure that Parser doesn't start producing less "preparse | 2045 // These tests make sure that Parser doesn't start producing less "preparse |
| 1967 // data" (data which the embedder can cache). | 2046 // data" (data which the embedder can cache). |
| 1968 v8::V8::Initialize(); | 2047 v8::V8::Initialize(); |
| 2048 i::FLAG_harmony_arrow_functions = true; |
| 1969 v8::Isolate* isolate = CcTest::isolate(); | 2049 v8::Isolate* isolate = CcTest::isolate(); |
| 1970 v8::HandleScope handles(isolate); | 2050 v8::HandleScope handles(isolate); |
| 1971 | 2051 |
| 1972 int marker; | 2052 int marker; |
| 1973 CcTest::i_isolate()->stack_guard()->SetStackLimit( | 2053 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
| 1974 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 2054 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
| 1975 | 2055 |
| 1976 struct TestCase { | 2056 struct TestCase { |
| 1977 const char* program; | 2057 const char* program; |
| 1978 int functions; | 2058 int functions; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2029 {"function interface() {", "}"}, | 2109 {"function interface() {", "}"}, |
| 2030 {"function foo(eval) {", "}"}, | 2110 {"function foo(eval) {", "}"}, |
| 2031 {"function foo(arguments) {", "}"}, | 2111 {"function foo(arguments) {", "}"}, |
| 2032 {"function foo(yield) {", "}"}, | 2112 {"function foo(yield) {", "}"}, |
| 2033 {"function foo(interface) {", "}"}, | 2113 {"function foo(interface) {", "}"}, |
| 2034 {"function foo(bar, eval) {", "}"}, | 2114 {"function foo(bar, eval) {", "}"}, |
| 2035 {"function foo(bar, arguments) {", "}"}, | 2115 {"function foo(bar, arguments) {", "}"}, |
| 2036 {"function foo(bar, yield) {", "}"}, | 2116 {"function foo(bar, yield) {", "}"}, |
| 2037 {"function foo(bar, interface) {", "}"}, | 2117 {"function foo(bar, interface) {", "}"}, |
| 2038 {"function foo(bar, bar) {", "}"}, | 2118 {"function foo(bar, bar) {", "}"}, |
| 2119 {"eval => {", "}"}, |
| 2120 {"arguments => {", "}"}, |
| 2121 {"yield => {", "}"}, |
| 2122 {"interface => {", "}"}, |
| 2123 {"(eval) => {", "}"}, |
| 2124 {"(arguments) => {", "}"}, |
| 2125 {"(yield) => {", "}"}, |
| 2126 {"(interface) => {", "}"}, |
| 2127 {"(eval, bar) => {", "}"}, |
| 2128 {"(bar, eval) => {", "}"}, |
| 2129 {"(bar, arguments) => {", "}"}, |
| 2130 {"(bar, yield) => {", "}"}, |
| 2131 {"(bar, interface) => {", "}"}, |
| 2132 {"(bar, bar) => {", "}"}, |
| 2039 { NULL, NULL } | 2133 { NULL, NULL } |
| 2040 }; | 2134 }; |
| 2041 | 2135 |
| 2042 const char* strict_statement_data[] = { | 2136 const char* strict_statement_data[] = { |
| 2043 "\"use strict\";", | 2137 "\"use strict\";", |
| 2044 NULL | 2138 NULL |
| 2045 }; | 2139 }; |
| 2046 | 2140 |
| 2047 const char* non_strict_statement_data[] = { | 2141 const char* non_strict_statement_data[] = { |
| 2048 ";", | 2142 ";", |
| 2049 NULL | 2143 NULL |
| 2050 }; | 2144 }; |
| 2051 | 2145 |
| 2146 i::FLAG_harmony_arrow_functions = true; |
| 2052 RunParserSyncTest(context_data, strict_statement_data, kError); | 2147 RunParserSyncTest(context_data, strict_statement_data, kError); |
| 2053 RunParserSyncTest(context_data, non_strict_statement_data, kSuccess); | 2148 RunParserSyncTest(context_data, non_strict_statement_data, kSuccess); |
| 2054 } | 2149 } |
| 2055 | 2150 |
| 2056 | 2151 |
| 2057 TEST(ErrorsTryWithoutCatchOrFinally) { | 2152 TEST(ErrorsTryWithoutCatchOrFinally) { |
| 2058 const char* context_data[][2] = { | 2153 const char* context_data[][2] = { |
| 2059 {"", ""}, | 2154 {"", ""}, |
| 2060 { NULL, NULL } | 2155 { NULL, NULL } |
| 2061 }; | 2156 }; |
| 2062 | 2157 |
| 2063 const char* statement_data[] = { | 2158 const char* statement_data[] = { |
| 2064 "try { }", | 2159 "try { }", |
| 2065 "try { } foo();", | 2160 "try { } foo();", |
| 2066 "try { } catch (e) foo();", | 2161 "try { } catch (e) foo();", |
| 2067 "try { } catch { }", | 2162 "try { } catch { }", |
| 2068 "try { } finally foo();", | 2163 "try { } finally foo();", |
| 2069 NULL | 2164 NULL |
| 2070 }; | 2165 }; |
| 2071 | 2166 |
| 2167 i::FLAG_harmony_arrow_functions = true; |
| 2072 RunParserSyncTest(context_data, statement_data, kError); | 2168 RunParserSyncTest(context_data, statement_data, kError); |
| 2073 } | 2169 } |
| 2074 | 2170 |
| 2075 | 2171 |
| 2076 TEST(NoErrorsTryCatchFinally) { | 2172 TEST(NoErrorsTryCatchFinally) { |
| 2077 const char* context_data[][2] = { | 2173 const char* context_data[][2] = { |
| 2078 {"", ""}, | 2174 {"", ""}, |
| 2079 { NULL, NULL } | 2175 { NULL, NULL } |
| 2080 }; | 2176 }; |
| 2081 | 2177 |
| 2082 const char* statement_data[] = { | 2178 const char* statement_data[] = { |
| 2083 "try { } catch (e) { }", | 2179 "try { } catch (e) { }", |
| 2084 "try { } catch (e) { } finally { }", | 2180 "try { } catch (e) { } finally { }", |
| 2085 "try { } finally { }", | 2181 "try { } finally { }", |
| 2086 NULL | 2182 NULL |
| 2087 }; | 2183 }; |
| 2088 | 2184 |
| 2185 i::FLAG_harmony_arrow_functions = true; |
| 2089 RunParserSyncTest(context_data, statement_data, kSuccess); | 2186 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 2090 } | 2187 } |
| 2091 | 2188 |
| 2092 | 2189 |
| 2093 TEST(ErrorsRegexpLiteral) { | 2190 TEST(ErrorsRegexpLiteral) { |
| 2094 const char* context_data[][2] = { | 2191 const char* context_data[][2] = { |
| 2095 {"var r = ", ""}, | 2192 {"var r = ", ""}, |
| 2096 { NULL, NULL } | 2193 { NULL, NULL } |
| 2097 }; | 2194 }; |
| 2098 | 2195 |
| 2099 const char* statement_data[] = { | 2196 const char* statement_data[] = { |
| 2100 "/unterminated", | 2197 "/unterminated", |
| 2101 NULL | 2198 NULL |
| 2102 }; | 2199 }; |
| 2103 | 2200 |
| 2201 i::FLAG_harmony_arrow_functions = true; |
| 2104 RunParserSyncTest(context_data, statement_data, kError); | 2202 RunParserSyncTest(context_data, statement_data, kError); |
| 2105 } | 2203 } |
| 2106 | 2204 |
| 2107 | 2205 |
| 2108 TEST(NoErrorsRegexpLiteral) { | 2206 TEST(NoErrorsRegexpLiteral) { |
| 2109 const char* context_data[][2] = { | 2207 const char* context_data[][2] = { |
| 2110 {"var r = ", ""}, | 2208 {"var r = ", ""}, |
| 2111 { NULL, NULL } | 2209 { NULL, NULL } |
| 2112 }; | 2210 }; |
| 2113 | 2211 |
| 2114 const char* statement_data[] = { | 2212 const char* statement_data[] = { |
| 2115 "/foo/", | 2213 "/foo/", |
| 2116 "/foo/g", | 2214 "/foo/g", |
| 2117 "/foo/whatever", // This is an error but not detected by the parser. | 2215 "/foo/whatever", // This is an error but not detected by the parser. |
| 2118 NULL | 2216 NULL |
| 2119 }; | 2217 }; |
| 2120 | 2218 |
| 2219 i::FLAG_harmony_arrow_functions = true; |
| 2121 RunParserSyncTest(context_data, statement_data, kSuccess); | 2220 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 2122 } | 2221 } |
| 2123 | 2222 |
| 2124 | 2223 |
| 2125 TEST(Intrinsics) { | 2224 TEST(Intrinsics) { |
| 2126 const char* context_data[][2] = { | 2225 const char* context_data[][2] = { |
| 2127 {"", ""}, | 2226 {"", ""}, |
| 2128 { NULL, NULL } | 2227 { NULL, NULL } |
| 2129 }; | 2228 }; |
| 2130 | 2229 |
| 2131 const char* statement_data[] = { | 2230 const char* statement_data[] = { |
| 2132 "%someintrinsic(arg)", | 2231 "%someintrinsic(arg)", |
| 2133 NULL | 2232 NULL |
| 2134 }; | 2233 }; |
| 2135 | 2234 |
| 2136 // Parsing will fail or succeed depending on whether we allow natives syntax | 2235 // Parsing will fail or succeed depending on whether we allow natives syntax |
| 2137 // or not. | 2236 // or not. |
| 2237 i::FLAG_harmony_arrow_functions = true; |
| 2138 RunParserSyncTest(context_data, statement_data, kSuccessOrError); | 2238 RunParserSyncTest(context_data, statement_data, kSuccessOrError); |
| 2139 } | 2239 } |
| 2140 | 2240 |
| 2141 | 2241 |
| 2142 TEST(NoErrorsNewExpression) { | 2242 TEST(NoErrorsNewExpression) { |
| 2143 const char* context_data[][2] = { | 2243 const char* context_data[][2] = { |
| 2144 {"", ""}, | 2244 {"", ""}, |
| 2145 {"var f =", ""}, | 2245 {"var f =", ""}, |
| 2146 { NULL, NULL } | 2246 { NULL, NULL } |
| 2147 }; | 2247 }; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2167 "new foo[bar]()[baz];", | 2267 "new foo[bar]()[baz];", |
| 2168 "new foo[bar].baz(baz)()[bar].baz;", | 2268 "new foo[bar].baz(baz)()[bar].baz;", |
| 2169 "new \"foo\"", // Runtime error | 2269 "new \"foo\"", // Runtime error |
| 2170 "new 1", // Runtime error | 2270 "new 1", // Runtime error |
| 2171 // This even runs: | 2271 // This even runs: |
| 2172 "(new new Function(\"this.x = 1\")).x;", | 2272 "(new new Function(\"this.x = 1\")).x;", |
| 2173 "new new Test_Two(String, 2).v(0123).length;", | 2273 "new new Test_Two(String, 2).v(0123).length;", |
| 2174 NULL | 2274 NULL |
| 2175 }; | 2275 }; |
| 2176 | 2276 |
| 2277 i::FLAG_harmony_arrow_functions = true; |
| 2177 RunParserSyncTest(context_data, statement_data, kSuccess); | 2278 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 2178 } | 2279 } |
| 2179 | 2280 |
| 2180 | 2281 |
| 2181 TEST(ErrorsNewExpression) { | 2282 TEST(ErrorsNewExpression) { |
| 2182 const char* context_data[][2] = { | 2283 const char* context_data[][2] = { |
| 2183 {"", ""}, | 2284 {"", ""}, |
| 2184 {"var f =", ""}, | 2285 {"var f =", ""}, |
| 2185 { NULL, NULL } | 2286 { NULL, NULL } |
| 2186 }; | 2287 }; |
| 2187 | 2288 |
| 2188 const char* statement_data[] = { | 2289 const char* statement_data[] = { |
| 2189 "new foo bar", | 2290 "new foo bar", |
| 2190 "new ) foo", | 2291 "new ) foo", |
| 2191 "new ++foo", | 2292 "new ++foo", |
| 2192 "new foo ++", | 2293 "new foo ++", |
| 2193 NULL | 2294 NULL |
| 2194 }; | 2295 }; |
| 2195 | 2296 |
| 2297 i::FLAG_harmony_arrow_functions = true; |
| 2196 RunParserSyncTest(context_data, statement_data, kError); | 2298 RunParserSyncTest(context_data, statement_data, kError); |
| 2197 } | 2299 } |
| 2198 | 2300 |
| 2199 | 2301 |
| 2200 TEST(StrictObjectLiteralChecking) { | 2302 TEST(StrictObjectLiteralChecking) { |
| 2201 const char* strict_context_data[][2] = { | 2303 const char* strict_context_data[][2] = { |
| 2202 {"\"use strict\"; var myobject = {", "};"}, | 2304 {"\"use strict\"; var myobject = {", "};"}, |
| 2203 { NULL, NULL } | 2305 { NULL, NULL } |
| 2204 }; | 2306 }; |
| 2205 const char* non_strict_context_data[][2] = { | 2307 const char* non_strict_context_data[][2] = { |
| 2206 {"var myobject = {", "};"}, | 2308 {"var myobject = {", "};"}, |
| 2207 { NULL, NULL } | 2309 { NULL, NULL } |
| 2208 }; | 2310 }; |
| 2209 | 2311 |
| 2210 // These are only errors in strict mode. | 2312 // These are only errors in strict mode. |
| 2211 const char* statement_data[] = { | 2313 const char* statement_data[] = { |
| 2212 "foo: 1, foo: 2", | 2314 "foo: 1, foo: 2", |
| 2213 "\"foo\": 1, \"foo\": 2", | 2315 "\"foo\": 1, \"foo\": 2", |
| 2214 "foo: 1, \"foo\": 2", | 2316 "foo: 1, \"foo\": 2", |
| 2215 "1: 1, 1: 2", | 2317 "1: 1, 1: 2", |
| 2216 "1: 1, \"1\": 2", | 2318 "1: 1, \"1\": 2", |
| 2217 "get: 1, get: 2", // Not a getter for real, just a property called get. | 2319 "get: 1, get: 2", // Not a getter for real, just a property called get. |
| 2218 "set: 1, set: 2", // Not a setter for real, just a property called set. | 2320 "set: 1, set: 2", // Not a setter for real, just a property called set. |
| 2219 NULL | 2321 NULL |
| 2220 }; | 2322 }; |
| 2221 | 2323 |
| 2324 i::FLAG_harmony_arrow_functions = true; |
| 2222 RunParserSyncTest(non_strict_context_data, statement_data, kSuccess); | 2325 RunParserSyncTest(non_strict_context_data, statement_data, kSuccess); |
| 2223 RunParserSyncTest(strict_context_data, statement_data, kError); | 2326 RunParserSyncTest(strict_context_data, statement_data, kError); |
| 2224 } | 2327 } |
| 2225 | 2328 |
| 2226 | 2329 |
| 2227 TEST(ErrorsObjectLiteralChecking) { | 2330 TEST(ErrorsObjectLiteralChecking) { |
| 2228 const char* context_data[][2] = { | 2331 const char* context_data[][2] = { |
| 2229 {"\"use strict\"; var myobject = {", "};"}, | 2332 {"\"use strict\"; var myobject = {", "};"}, |
| 2230 {"var myobject = {", "};"}, | 2333 {"var myobject = {", "};"}, |
| 2231 { NULL, NULL } | 2334 { NULL, NULL } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2253 "get bar(x) {}", | 2356 "get bar(x) {}", |
| 2254 "get bar(x, y) {}", | 2357 "get bar(x, y) {}", |
| 2255 "set bar() {}", | 2358 "set bar() {}", |
| 2256 "set bar(x, y) {}", | 2359 "set bar(x, y) {}", |
| 2257 // Parsing FunctionLiteral for getter or setter fails | 2360 // Parsing FunctionLiteral for getter or setter fails |
| 2258 "get foo( +", | 2361 "get foo( +", |
| 2259 "get foo() \"error\"", | 2362 "get foo() \"error\"", |
| 2260 NULL | 2363 NULL |
| 2261 }; | 2364 }; |
| 2262 | 2365 |
| 2366 i::FLAG_harmony_arrow_functions = true; |
| 2263 RunParserSyncTest(context_data, statement_data, kError); | 2367 RunParserSyncTest(context_data, statement_data, kError); |
| 2264 } | 2368 } |
| 2265 | 2369 |
| 2266 | 2370 |
| 2267 TEST(NoErrorsObjectLiteralChecking) { | 2371 TEST(NoErrorsObjectLiteralChecking) { |
| 2268 const char* context_data[][2] = { | 2372 const char* context_data[][2] = { |
| 2269 {"var myobject = {", "};"}, | 2373 {"var myobject = {", "};"}, |
| 2270 {"\"use strict\"; var myobject = {", "};"}, | 2374 {"\"use strict\"; var myobject = {", "};"}, |
| 2271 { NULL, NULL } | 2375 { NULL, NULL } |
| 2272 }; | 2376 }; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2296 // Keywords, future reserved and strict future reserved are also allowed as | 2400 // Keywords, future reserved and strict future reserved are also allowed as |
| 2297 // property names. | 2401 // property names. |
| 2298 "if: 4", | 2402 "if: 4", |
| 2299 "interface: 5", | 2403 "interface: 5", |
| 2300 "super: 6", | 2404 "super: 6", |
| 2301 "eval: 7", | 2405 "eval: 7", |
| 2302 "arguments: 8", | 2406 "arguments: 8", |
| 2303 NULL | 2407 NULL |
| 2304 }; | 2408 }; |
| 2305 | 2409 |
| 2410 i::FLAG_harmony_arrow_functions = true; |
| 2306 RunParserSyncTest(context_data, statement_data, kSuccess); | 2411 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 2307 } | 2412 } |
| 2308 | 2413 |
| 2309 | 2414 |
| 2310 TEST(TooManyArguments) { | 2415 TEST(TooManyArguments) { |
| 2311 const char* context_data[][2] = { | 2416 const char* context_data[][2] = { |
| 2312 {"foo(", "0)"}, | 2417 {"foo(", "0)"}, |
| 2313 { NULL, NULL } | 2418 { NULL, NULL } |
| 2314 }; | 2419 }; |
| 2315 | 2420 |
| 2316 using v8::internal::Code; | 2421 using v8::internal::Code; |
| 2317 char statement[Code::kMaxArguments * 2 + 1]; | 2422 char statement[Code::kMaxArguments * 2 + 1]; |
| 2318 for (int i = 0; i < Code::kMaxArguments; ++i) { | 2423 for (int i = 0; i < Code::kMaxArguments; ++i) { |
| 2319 statement[2 * i] = '0'; | 2424 statement[2 * i] = '0'; |
| 2320 statement[2 * i + 1] = ','; | 2425 statement[2 * i + 1] = ','; |
| 2321 } | 2426 } |
| 2322 statement[Code::kMaxArguments * 2] = 0; | 2427 statement[Code::kMaxArguments * 2] = 0; |
| 2323 | 2428 |
| 2324 const char* statement_data[] = { | 2429 const char* statement_data[] = { |
| 2325 statement, | 2430 statement, |
| 2326 NULL | 2431 NULL |
| 2327 }; | 2432 }; |
| 2328 | 2433 |
| 2329 // The test is quite slow, so run it with a reduced set of flags. | 2434 // The test is quite slow, so run it with a reduced set of flags. |
| 2435 i::FLAG_harmony_arrow_functions = true; |
| 2330 static const ParserFlag empty_flags[] = {kAllowLazy}; | 2436 static const ParserFlag empty_flags[] = {kAllowLazy}; |
| 2331 RunParserSyncTest(context_data, statement_data, kError, empty_flags, 1); | 2437 RunParserSyncTest(context_data, statement_data, kError, empty_flags, 1); |
| 2332 } | 2438 } |
| 2333 | 2439 |
| 2334 | 2440 |
| 2335 TEST(StrictDelete) { | 2441 TEST(StrictDelete) { |
| 2336 // "delete <Identifier>" is not allowed in strict mode. | 2442 // "delete <Identifier>" is not allowed in strict mode. |
| 2337 const char* strict_context_data[][2] = { | 2443 const char* strict_context_data[][2] = { |
| 2338 {"\"use strict\"; ", ""}, | 2444 {"\"use strict\"; ", ""}, |
| 2339 { NULL, NULL } | 2445 { NULL, NULL } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2368 "delete new foo(bar);", | 2474 "delete new foo(bar);", |
| 2369 NULL | 2475 NULL |
| 2370 }; | 2476 }; |
| 2371 | 2477 |
| 2372 // These are always errors | 2478 // These are always errors |
| 2373 const char* bad_statement_data[] = { | 2479 const char* bad_statement_data[] = { |
| 2374 "delete if;", | 2480 "delete if;", |
| 2375 NULL | 2481 NULL |
| 2376 }; | 2482 }; |
| 2377 | 2483 |
| 2484 i::FLAG_harmony_arrow_functions = true; |
| 2485 |
| 2378 RunParserSyncTest(strict_context_data, sloppy_statement_data, kError); | 2486 RunParserSyncTest(strict_context_data, sloppy_statement_data, kError); |
| 2379 RunParserSyncTest(sloppy_context_data, sloppy_statement_data, kSuccess); | 2487 RunParserSyncTest(sloppy_context_data, sloppy_statement_data, kSuccess); |
| 2380 | 2488 |
| 2381 RunParserSyncTest(strict_context_data, good_statement_data, kSuccess); | 2489 RunParserSyncTest(strict_context_data, good_statement_data, kSuccess); |
| 2382 RunParserSyncTest(sloppy_context_data, good_statement_data, kSuccess); | 2490 RunParserSyncTest(sloppy_context_data, good_statement_data, kSuccess); |
| 2383 | 2491 |
| 2384 RunParserSyncTest(strict_context_data, bad_statement_data, kError); | 2492 RunParserSyncTest(strict_context_data, bad_statement_data, kError); |
| 2385 RunParserSyncTest(sloppy_context_data, bad_statement_data, kError); | 2493 RunParserSyncTest(sloppy_context_data, bad_statement_data, kError); |
| 2386 } | 2494 } |
| 2387 | 2495 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2444 }; | 2552 }; |
| 2445 | 2553 |
| 2446 // These are not okay for assignment, but okay for prefix / postix. | 2554 // These are not okay for assignment, but okay for prefix / postix. |
| 2447 const char* bad_statement_data_for_assignment[] = { | 2555 const char* bad_statement_data_for_assignment[] = { |
| 2448 "++foo", | 2556 "++foo", |
| 2449 "foo++", | 2557 "foo++", |
| 2450 "foo + bar", | 2558 "foo + bar", |
| 2451 NULL | 2559 NULL |
| 2452 }; | 2560 }; |
| 2453 | 2561 |
| 2562 i::FLAG_harmony_arrow_functions = true; |
| 2563 |
| 2454 RunParserSyncTest(assignment_context_data, good_statement_data, kSuccess); | 2564 RunParserSyncTest(assignment_context_data, good_statement_data, kSuccess); |
| 2455 RunParserSyncTest(assignment_context_data, bad_statement_data_common, kError); | 2565 RunParserSyncTest(assignment_context_data, bad_statement_data_common, kError); |
| 2456 RunParserSyncTest(assignment_context_data, bad_statement_data_for_assignment, | 2566 RunParserSyncTest(assignment_context_data, bad_statement_data_for_assignment, |
| 2457 kError); | 2567 kError); |
| 2458 | 2568 |
| 2459 RunParserSyncTest(prefix_context_data, good_statement_data, kSuccess); | 2569 RunParserSyncTest(prefix_context_data, good_statement_data, kSuccess); |
| 2460 RunParserSyncTest(prefix_context_data, bad_statement_data_common, kError); | 2570 RunParserSyncTest(prefix_context_data, bad_statement_data_common, kError); |
| 2461 | 2571 |
| 2462 RunParserSyncTest(postfix_context_data, good_statement_data, kSuccess); | 2572 RunParserSyncTest(postfix_context_data, good_statement_data, kSuccess); |
| 2463 RunParserSyncTest(postfix_context_data, bad_statement_data_common, kError); | 2573 RunParserSyncTest(postfix_context_data, bad_statement_data_common, kError); |
| 2464 } | 2574 } |
| 2465 | 2575 |
| 2466 | 2576 |
| 2467 TEST(FuncNameInferrerBasic) { | 2577 TEST(FuncNameInferrerBasic) { |
| 2468 // Tests that function names are inferred properly. | 2578 // Tests that function names are inferred properly. |
| 2469 i::FLAG_allow_natives_syntax = true; | 2579 i::FLAG_allow_natives_syntax = true; |
| 2580 i::FLAG_harmony_arrow_functions = true; |
| 2470 v8::Isolate* isolate = CcTest::isolate(); | 2581 v8::Isolate* isolate = CcTest::isolate(); |
| 2471 v8::HandleScope scope(isolate); | 2582 v8::HandleScope scope(isolate); |
| 2472 LocalContext env; | 2583 LocalContext env; |
| 2473 CompileRun("var foo1 = function() {}; " | 2584 CompileRun("var foo1 = function() {}; " |
| 2474 "var foo2 = function foo3() {}; " | 2585 "var foo2 = function foo3() {}; " |
| 2475 "function not_ctor() { " | 2586 "function not_ctor() { " |
| 2476 " var foo4 = function() {}; " | 2587 " var foo4 = function() {}; " |
| 2477 " return %FunctionGetInferredName(foo4); " | 2588 " return %FunctionGetInferredName(foo4); " |
| 2478 "} " | 2589 "} " |
| 2479 "function Ctor() { " | 2590 "function Ctor() { " |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2501 ExpectString("%FunctionGetInferredName(obj4[1])", ""); | 2612 ExpectString("%FunctionGetInferredName(obj4[1])", ""); |
| 2502 ExpectString("%FunctionGetInferredName(obj5['foo9'])", "obj5.foo9"); | 2613 ExpectString("%FunctionGetInferredName(obj5['foo9'])", "obj5.foo9"); |
| 2503 ExpectString("%FunctionGetInferredName(obj6.obj7.foo10)", "obj6.obj7.foo10"); | 2614 ExpectString("%FunctionGetInferredName(obj6.obj7.foo10)", "obj6.obj7.foo10"); |
| 2504 } | 2615 } |
| 2505 | 2616 |
| 2506 | 2617 |
| 2507 TEST(FuncNameInferrerTwoByte) { | 2618 TEST(FuncNameInferrerTwoByte) { |
| 2508 // Tests function name inferring in cases where some parts of the inferred | 2619 // Tests function name inferring in cases where some parts of the inferred |
| 2509 // function name are two-byte strings. | 2620 // function name are two-byte strings. |
| 2510 i::FLAG_allow_natives_syntax = true; | 2621 i::FLAG_allow_natives_syntax = true; |
| 2622 i::FLAG_harmony_arrow_functions = true; |
| 2511 v8::Isolate* isolate = CcTest::isolate(); | 2623 v8::Isolate* isolate = CcTest::isolate(); |
| 2512 v8::HandleScope scope(isolate); | 2624 v8::HandleScope scope(isolate); |
| 2513 LocalContext env; | 2625 LocalContext env; |
| 2514 uint16_t* two_byte_source = AsciiToTwoByteString( | 2626 uint16_t* two_byte_source = AsciiToTwoByteString( |
| 2515 "var obj1 = { oXj2 : { foo1: function() {} } }; " | 2627 "var obj1 = { oXj2 : { foo1: function() {} } }; " |
| 2516 "%FunctionGetInferredName(obj1.oXj2.foo1)"); | 2628 "%FunctionGetInferredName(obj1.oXj2.foo1)"); |
| 2517 uint16_t* two_byte_name = AsciiToTwoByteString("obj1.oXj2.foo1"); | 2629 uint16_t* two_byte_name = AsciiToTwoByteString("obj1.oXj2.foo1"); |
| 2518 // Make it really non-ASCII (replace the Xs with a non-ASCII character). | 2630 // Make it really non-ASCII (replace the Xs with a non-ASCII character). |
| 2519 two_byte_source[14] = two_byte_source[78] = two_byte_name[6] = 0x010d; | 2631 two_byte_source[14] = two_byte_source[78] = two_byte_name[6] = 0x010d; |
| 2520 v8::Local<v8::String> source = | 2632 v8::Local<v8::String> source = |
| 2521 v8::String::NewFromTwoByte(isolate, two_byte_source); | 2633 v8::String::NewFromTwoByte(isolate, two_byte_source); |
| 2522 v8::Local<v8::Value> result = CompileRun(source); | 2634 v8::Local<v8::Value> result = CompileRun(source); |
| 2523 CHECK(result->IsString()); | 2635 CHECK(result->IsString()); |
| 2524 v8::Local<v8::String> expected_name = | 2636 v8::Local<v8::String> expected_name = |
| 2525 v8::String::NewFromTwoByte(isolate, two_byte_name); | 2637 v8::String::NewFromTwoByte(isolate, two_byte_name); |
| 2526 CHECK(result->Equals(expected_name)); | 2638 CHECK(result->Equals(expected_name)); |
| 2527 i::DeleteArray(two_byte_source); | 2639 i::DeleteArray(two_byte_source); |
| 2528 i::DeleteArray(two_byte_name); | 2640 i::DeleteArray(two_byte_name); |
| 2529 } | 2641 } |
| 2530 | 2642 |
| 2531 | 2643 |
| 2532 TEST(FuncNameInferrerEscaped) { | 2644 TEST(FuncNameInferrerEscaped) { |
| 2533 // The same as FuncNameInferrerTwoByte, except that we express the two-byte | 2645 // The same as FuncNameInferrerTwoByte, except that we express the two-byte |
| 2534 // character as a unicode escape. | 2646 // character as a unicode escape. |
| 2535 i::FLAG_allow_natives_syntax = true; | 2647 i::FLAG_allow_natives_syntax = true; |
| 2648 i::FLAG_harmony_arrow_functions = true; |
| 2536 v8::Isolate* isolate = CcTest::isolate(); | 2649 v8::Isolate* isolate = CcTest::isolate(); |
| 2537 v8::HandleScope scope(isolate); | 2650 v8::HandleScope scope(isolate); |
| 2538 LocalContext env; | 2651 LocalContext env; |
| 2539 uint16_t* two_byte_source = AsciiToTwoByteString( | 2652 uint16_t* two_byte_source = AsciiToTwoByteString( |
| 2540 "var obj1 = { o\\u010dj2 : { foo1: function() {} } }; " | 2653 "var obj1 = { o\\u010dj2 : { foo1: function() {} } }; " |
| 2541 "%FunctionGetInferredName(obj1.o\\u010dj2.foo1)"); | 2654 "%FunctionGetInferredName(obj1.o\\u010dj2.foo1)"); |
| 2542 uint16_t* two_byte_name = AsciiToTwoByteString("obj1.oXj2.foo1"); | 2655 uint16_t* two_byte_name = AsciiToTwoByteString("obj1.oXj2.foo1"); |
| 2543 // Fix to correspond to the non-ASCII name in two_byte_source. | 2656 // Fix to correspond to the non-ASCII name in two_byte_source. |
| 2544 two_byte_name[6] = 0x010d; | 2657 two_byte_name[6] = 0x010d; |
| 2545 v8::Local<v8::String> source = | 2658 v8::Local<v8::String> source = |
| 2546 v8::String::NewFromTwoByte(isolate, two_byte_source); | 2659 v8::String::NewFromTwoByte(isolate, two_byte_source); |
| 2547 v8::Local<v8::Value> result = CompileRun(source); | 2660 v8::Local<v8::Value> result = CompileRun(source); |
| 2548 CHECK(result->IsString()); | 2661 CHECK(result->IsString()); |
| 2549 v8::Local<v8::String> expected_name = | 2662 v8::Local<v8::String> expected_name = |
| 2550 v8::String::NewFromTwoByte(isolate, two_byte_name); | 2663 v8::String::NewFromTwoByte(isolate, two_byte_name); |
| 2551 CHECK(result->Equals(expected_name)); | 2664 CHECK(result->Equals(expected_name)); |
| 2552 i::DeleteArray(two_byte_source); | 2665 i::DeleteArray(two_byte_source); |
| 2553 i::DeleteArray(two_byte_name); | 2666 i::DeleteArray(two_byte_name); |
| 2554 } | 2667 } |
| 2555 | 2668 |
| 2556 | 2669 |
| 2557 TEST(RegressionLazyFunctionWithErrorWithArg) { | 2670 TEST(RegressionLazyFunctionWithErrorWithArg) { |
| 2558 // The bug occurred when a lazy function had an error which requires a | 2671 // The bug occurred when a lazy function had an error which requires a |
| 2559 // parameter (such as "unknown label" here). The error message was processed | 2672 // parameter (such as "unknown label" here). The error message was processed |
| 2560 // before the AstValueFactory containing the error message string was | 2673 // before the AstValueFactory containing the error message string was |
| 2561 // internalized. | 2674 // internalized. |
| 2675 i::FLAG_harmony_arrow_functions = true; |
| 2562 v8::Isolate* isolate = CcTest::isolate(); | 2676 v8::Isolate* isolate = CcTest::isolate(); |
| 2563 v8::HandleScope scope(isolate); | 2677 v8::HandleScope scope(isolate); |
| 2564 LocalContext env; | 2678 LocalContext env; |
| 2565 i::FLAG_lazy = true; | 2679 i::FLAG_lazy = true; |
| 2566 i::FLAG_min_preparse_length = 0; | 2680 i::FLAG_min_preparse_length = 0; |
| 2567 CompileRun("function this_is_lazy() {\n" | 2681 CompileRun("function this_is_lazy() {\n" |
| 2568 " break p;\n" | 2682 " break p;\n" |
| 2569 "}\n" | 2683 "}\n" |
| 2570 "this_is_lazy();\n"); | 2684 "this_is_lazy();\n"); |
| 2571 } | 2685 } |
| 2686 |
| 2687 |
| 2688 TEST(ErrorsArrowFunctions) { |
| 2689 // Tests that parser and preparser generate the same kind of errors |
| 2690 // on invalid arrow function syntax. |
| 2691 const char* context_data[][2] = { |
| 2692 {"", ";"}, |
| 2693 {"v = ", ";"}, |
| 2694 {"bar ? (", ") : baz;"}, |
| 2695 {"bar ? baz : (", ");"}, |
| 2696 {"bar[", "];"}, |
| 2697 {"bar, ", ";"}, |
| 2698 {"", ", bar;"}, |
| 2699 { NULL, NULL } |
| 2700 }; |
| 2701 |
| 2702 const char* statement_data[] = { |
| 2703 "=> 0", |
| 2704 "=>", |
| 2705 "() =>", |
| 2706 "=> {}", |
| 2707 ") => {}", |
| 2708 ", => {}", |
| 2709 "(,) => {}", |
| 2710 "return => {}", |
| 2711 "() => {'value': 42}", |
| 2712 |
| 2713 // Check that the early return introduced in ParsePrimaryExpression |
| 2714 // does not accept stray closing parentheses. |
| 2715 ")", |
| 2716 ") => 0", |
| 2717 "foo[()]", |
| 2718 "()", |
| 2719 |
| 2720 // Parameter lists with extra parens should be recognized as errors. |
| 2721 "(()) => 0", |
| 2722 "((x)) => 0", |
| 2723 "((x, y)) => 0", |
| 2724 "(x, (y)) => 0", |
| 2725 "((x, y, z)) => 0", |
| 2726 "(x, (y, z)) => 0", |
| 2727 "((x, y), z) => 0", |
| 2728 |
| 2729 // The parameter list is parsed as an expression, but only |
| 2730 // a comma-separated list of identifier is valid. |
| 2731 "32 => {}", |
| 2732 "(32) => {}", |
| 2733 "(a, 32) => {}", |
| 2734 "if => {}", |
| 2735 "(if) => {}", |
| 2736 "(a, if) => {}", |
| 2737 "a + b => {}", |
| 2738 "(a + b) => {}", |
| 2739 "(a + b, c) => {}", |
| 2740 "(a, b - c) => {}", |
| 2741 "\"a\" => {}", |
| 2742 "(\"a\") => {}", |
| 2743 "(\"a\", b) => {}", |
| 2744 "(a, \"b\") => {}", |
| 2745 "-a => {}", |
| 2746 "(-a) => {}", |
| 2747 "(-a, b) => {}", |
| 2748 "(a, -b) => {}", |
| 2749 "{} => {}", |
| 2750 "({}) => {}", |
| 2751 "(a, {}) => {}", |
| 2752 "({}, a) => {}", |
| 2753 "a++ => {}", |
| 2754 "(a++) => {}", |
| 2755 "(a++, b) => {}", |
| 2756 "(a, b++) => {}", |
| 2757 "[] => {}", |
| 2758 "([]) => {}", |
| 2759 "(a, []) => {}", |
| 2760 "([], a) => {}", |
| 2761 "(a = b) => {}", |
| 2762 "(a = b, c) => {}", |
| 2763 "(a, b = c) => {}", |
| 2764 "(foo ? bar : baz) => {}", |
| 2765 "(a, foo ? bar : baz) => {}", |
| 2766 "(foo ? bar : baz, a) => {}", |
| 2767 |
| 2768 NULL |
| 2769 }; |
| 2770 |
| 2771 i::FLAG_harmony_arrow_functions = true; |
| 2772 RunParserSyncTest(context_data, statement_data, kError); |
| 2773 } |
| 2774 |
| 2775 |
| 2776 TEST(NoErrorsArrowFunctions) { |
| 2777 // Tests that parser and preparser accept valid arrow functions syntax. |
| 2778 const char* context_data[][2] = { |
| 2779 {"", ";"}, |
| 2780 {"bar ? (", ") : baz;"}, |
| 2781 {"bar ? baz : (", ");"}, |
| 2782 {"bar, ", ";"}, |
| 2783 {"", ", bar;"}, |
| 2784 { NULL, NULL } |
| 2785 }; |
| 2786 |
| 2787 const char* statement_data[] = { |
| 2788 "() => {}", |
| 2789 "() => { return 42 }", |
| 2790 "x => { return x; }", |
| 2791 "(x) => { return x; }", |
| 2792 "(x, y) => { return x + y; }", |
| 2793 "(x, y, z) => { return x + y + z; }", |
| 2794 "(x, y) => { x.a = y; }", |
| 2795 "() => 42", |
| 2796 "x => x", |
| 2797 "x => x * x", |
| 2798 "(x) => x", |
| 2799 "(x) => x * x", |
| 2800 "(x, y) => x + y", |
| 2801 "(x, y, z) => x, y, z", |
| 2802 "(x, y) => x.a = y", |
| 2803 "() => ({'value': 42})", |
| 2804 "x => y => x + y", |
| 2805 "(x, y) => (u, v) => x*u + y*v", |
| 2806 "(x, y) => z => z * (x + y)", |
| 2807 "x => (y, z) => z * (x + y)", |
| 2808 |
| 2809 // Arrow has more precedence, this is the same as: foo ? bar : (baz = {}) |
| 2810 "foo ? bar : baz => {}", |
| 2811 |
| 2812 NULL |
| 2813 }; |
| 2814 |
| 2815 i::FLAG_harmony_arrow_functions = true; |
| 2816 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 2817 } |
| OLD | NEW |