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 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 "\"\\n\" --> is eol-comment\nvar y = 37;\n", | 132 "\"\\n\" --> is eol-comment\nvar y = 37;\n", |
133 "x/* precomment */ --> is eol-comment\nvar y = 37;\n", | 133 "x/* precomment */ --> is eol-comment\nvar y = 37;\n", |
134 "x/* precomment\n */ --> is eol-comment\nvar y = 37;\n", | 134 "x/* precomment\n */ --> is eol-comment\nvar y = 37;\n", |
135 "var x = 42; --> is eol-comment\nvar y = 37;\n", | 135 "var x = 42; --> is eol-comment\nvar y = 37;\n", |
136 "var x = 42; /* precomment\n */ --> is eol-comment\nvar y = 37;\n", | 136 "var x = 42; /* precomment\n */ --> is eol-comment\nvar y = 37;\n", |
137 NULL | 137 NULL |
138 }; | 138 }; |
139 | 139 |
140 // Parser/Scanner needs a stack limit. | 140 // Parser/Scanner needs a stack limit. |
141 int marker; | 141 int marker; |
142 i::Isolate::Current()->stack_guard()->SetStackLimit( | 142 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
143 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 143 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
144 | 144 |
145 for (int i = 0; tests[i]; i++) { | 145 for (int i = 0; tests[i]; i++) { |
146 v8::ScriptData* data = | 146 v8::ScriptData* data = |
147 v8::ScriptData::PreCompile(tests[i], i::StrLength(tests[i])); | 147 v8::ScriptData::PreCompile(tests[i], i::StrLength(tests[i])); |
148 CHECK(data != NULL && !data->HasError()); | 148 CHECK(data != NULL && !data->HasError()); |
149 delete data; | 149 delete data; |
150 } | 150 } |
151 | 151 |
152 for (int i = 0; fail_tests[i]; i++) { | 152 for (int i = 0; fail_tests[i]; i++) { |
(...skipping 18 matching lines...) Expand all Loading... |
171 size_t length_; | 171 size_t length_; |
172 }; | 172 }; |
173 | 173 |
174 | 174 |
175 TEST(Preparsing) { | 175 TEST(Preparsing) { |
176 v8::Isolate* isolate = CcTest::isolate(); | 176 v8::Isolate* isolate = CcTest::isolate(); |
177 v8::HandleScope handles(isolate); | 177 v8::HandleScope handles(isolate); |
178 v8::Local<v8::Context> context = v8::Context::New(isolate); | 178 v8::Local<v8::Context> context = v8::Context::New(isolate); |
179 v8::Context::Scope context_scope(context); | 179 v8::Context::Scope context_scope(context); |
180 int marker; | 180 int marker; |
181 i::Isolate::Current()->stack_guard()->SetStackLimit( | 181 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
182 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 182 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
183 | 183 |
184 // Source containing functions that might be lazily compiled and all types | 184 // Source containing functions that might be lazily compiled and all types |
185 // of symbols (string, propertyName, regexp). | 185 // of symbols (string, propertyName, regexp). |
186 const char* source = | 186 const char* source = |
187 "var x = 42;" | 187 "var x = 42;" |
188 "function foo(a) { return function nolazy(b) { return a + b; } }" | 188 "function foo(a) { return function nolazy(b) { return a + b; } }" |
189 "function bar(a) { if (a) return function lazy(b) { return b; } }" | 189 "function bar(a) { if (a) return function lazy(b) { return b; } }" |
190 "var z = {'string': 'string literal', bareword: 'propertyName', " | 190 "var z = {'string': 'string literal', bareword: 'propertyName', " |
191 " 42: 'number literal', for: 'keyword as propertyName', " | 191 " 42: 'number literal', for: 'keyword as propertyName', " |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 const char* message = pre_impl->BuildMessage(); | 234 const char* message = pre_impl->BuildMessage(); |
235 pre_impl->BuildArgs(); | 235 pre_impl->BuildArgs(); |
236 CHECK_GT(strlen(message), 0); | 236 CHECK_GT(strlen(message), 0); |
237 } | 237 } |
238 | 238 |
239 | 239 |
240 TEST(StandAlonePreParser) { | 240 TEST(StandAlonePreParser) { |
241 v8::V8::Initialize(); | 241 v8::V8::Initialize(); |
242 | 242 |
243 int marker; | 243 int marker; |
244 i::Isolate::Current()->stack_guard()->SetStackLimit( | 244 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
245 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 245 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
246 | 246 |
247 const char* programs[] = { | 247 const char* programs[] = { |
248 "{label: 42}", | 248 "{label: 42}", |
249 "var x = 42;", | 249 "var x = 42;", |
250 "function foo(x, y) { return x + y; }", | 250 "function foo(x, y) { return x + y; }", |
251 "%ArgleBargle(glop);", | 251 "%ArgleBargle(glop);", |
252 "var x = new new Function('this.x = 42');", | 252 "var x = new new Function('this.x = 42');", |
253 NULL | 253 NULL |
254 }; | 254 }; |
255 | 255 |
256 uintptr_t stack_limit = i::Isolate::Current()->stack_guard()->real_climit(); | 256 uintptr_t stack_limit = CcTest::i_isolate()->stack_guard()->real_climit(); |
257 for (int i = 0; programs[i]; i++) { | 257 for (int i = 0; programs[i]; i++) { |
258 const char* program = programs[i]; | 258 const char* program = programs[i]; |
259 i::Utf8ToUtf16CharacterStream stream( | 259 i::Utf8ToUtf16CharacterStream stream( |
260 reinterpret_cast<const i::byte*>(program), | 260 reinterpret_cast<const i::byte*>(program), |
261 static_cast<unsigned>(strlen(program))); | 261 static_cast<unsigned>(strlen(program))); |
262 i::CompleteParserRecorder log; | 262 i::CompleteParserRecorder log; |
263 i::Scanner scanner(i::Isolate::Current()->unicode_cache()); | 263 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
264 scanner.Initialize(&stream); | 264 scanner.Initialize(&stream); |
265 | 265 |
266 v8::preparser::PreParser preparser(&scanner, &log, stack_limit); | 266 v8::preparser::PreParser preparser(&scanner, &log, stack_limit); |
267 preparser.set_allow_lazy(true); | 267 preparser.set_allow_lazy(true); |
268 preparser.set_allow_natives_syntax(true); | 268 preparser.set_allow_natives_syntax(true); |
269 v8::preparser::PreParser::PreParseResult result = | 269 v8::preparser::PreParser::PreParseResult result = |
270 preparser.PreParseProgram(); | 270 preparser.PreParseProgram(); |
271 CHECK_EQ(v8::preparser::PreParser::kPreParseSuccess, result); | 271 CHECK_EQ(v8::preparser::PreParser::kPreParseSuccess, result); |
272 i::ScriptDataImpl data(log.ExtractData()); | 272 i::ScriptDataImpl data(log.ExtractData()); |
273 CHECK(!data.has_error()); | 273 CHECK(!data.has_error()); |
274 } | 274 } |
275 } | 275 } |
276 | 276 |
277 | 277 |
278 TEST(StandAlonePreParserNoNatives) { | 278 TEST(StandAlonePreParserNoNatives) { |
279 v8::V8::Initialize(); | 279 v8::V8::Initialize(); |
280 | 280 |
281 int marker; | 281 int marker; |
282 i::Isolate::Current()->stack_guard()->SetStackLimit( | 282 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
283 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 283 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
284 | 284 |
285 const char* programs[] = { | 285 const char* programs[] = { |
286 "%ArgleBargle(glop);", | 286 "%ArgleBargle(glop);", |
287 "var x = %_IsSmi(42);", | 287 "var x = %_IsSmi(42);", |
288 NULL | 288 NULL |
289 }; | 289 }; |
290 | 290 |
291 uintptr_t stack_limit = i::Isolate::Current()->stack_guard()->real_climit(); | 291 uintptr_t stack_limit = CcTest::i_isolate()->stack_guard()->real_climit(); |
292 for (int i = 0; programs[i]; i++) { | 292 for (int i = 0; programs[i]; i++) { |
293 const char* program = programs[i]; | 293 const char* program = programs[i]; |
294 i::Utf8ToUtf16CharacterStream stream( | 294 i::Utf8ToUtf16CharacterStream stream( |
295 reinterpret_cast<const i::byte*>(program), | 295 reinterpret_cast<const i::byte*>(program), |
296 static_cast<unsigned>(strlen(program))); | 296 static_cast<unsigned>(strlen(program))); |
297 i::CompleteParserRecorder log; | 297 i::CompleteParserRecorder log; |
298 i::Scanner scanner(i::Isolate::Current()->unicode_cache()); | 298 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
299 scanner.Initialize(&stream); | 299 scanner.Initialize(&stream); |
300 | 300 |
301 // Preparser defaults to disallowing natives syntax. | 301 // Preparser defaults to disallowing natives syntax. |
302 v8::preparser::PreParser preparser(&scanner, &log, stack_limit); | 302 v8::preparser::PreParser preparser(&scanner, &log, stack_limit); |
303 preparser.set_allow_lazy(true); | 303 preparser.set_allow_lazy(true); |
304 v8::preparser::PreParser::PreParseResult result = | 304 v8::preparser::PreParser::PreParseResult result = |
305 preparser.PreParseProgram(); | 305 preparser.PreParseProgram(); |
306 CHECK_EQ(v8::preparser::PreParser::kPreParseSuccess, result); | 306 CHECK_EQ(v8::preparser::PreParser::kPreParseSuccess, result); |
307 i::ScriptDataImpl data(log.ExtractData()); | 307 i::ScriptDataImpl data(log.ExtractData()); |
308 // Data contains syntax error. | 308 // Data contains syntax error. |
309 CHECK(data.has_error()); | 309 CHECK(data.has_error()); |
310 } | 310 } |
311 } | 311 } |
312 | 312 |
313 | 313 |
314 TEST(RegressChromium62639) { | 314 TEST(RegressChromium62639) { |
315 v8::V8::Initialize(); | 315 v8::V8::Initialize(); |
316 i::Isolate* isolate = i::Isolate::Current(); | 316 i::Isolate* isolate = CcTest::i_isolate(); |
317 | 317 |
318 int marker; | 318 int marker; |
319 isolate->stack_guard()->SetStackLimit( | 319 isolate->stack_guard()->SetStackLimit( |
320 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 320 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
321 | 321 |
322 const char* program = "var x = 'something';\n" | 322 const char* program = "var x = 'something';\n" |
323 "escape: function() {}"; | 323 "escape: function() {}"; |
324 // Fails parsing expecting an identifier after "function". | 324 // Fails parsing expecting an identifier after "function". |
325 // Before fix, didn't check *ok after Expect(Token::Identifier, ok), | 325 // Before fix, didn't check *ok after Expect(Token::Identifier, ok), |
326 // and then used the invalid currently scanned literal. This always | 326 // and then used the invalid currently scanned literal. This always |
327 // failed in debug mode, and sometimes crashed in release mode. | 327 // failed in debug mode, and sometimes crashed in release mode. |
328 | 328 |
329 i::Utf8ToUtf16CharacterStream stream( | 329 i::Utf8ToUtf16CharacterStream stream( |
330 reinterpret_cast<const i::byte*>(program), | 330 reinterpret_cast<const i::byte*>(program), |
331 static_cast<unsigned>(strlen(program))); | 331 static_cast<unsigned>(strlen(program))); |
332 i::ScriptDataImpl* data = i::PreParserApi::PreParse(isolate, &stream); | 332 i::ScriptDataImpl* data = i::PreParserApi::PreParse(isolate, &stream); |
333 CHECK(data->HasError()); | 333 CHECK(data->HasError()); |
334 delete data; | 334 delete data; |
335 } | 335 } |
336 | 336 |
337 | 337 |
338 TEST(Regress928) { | 338 TEST(Regress928) { |
339 v8::V8::Initialize(); | 339 v8::V8::Initialize(); |
340 i::Isolate* isolate = i::Isolate::Current(); | 340 i::Isolate* isolate = CcTest::i_isolate(); |
341 i::Factory* factory = isolate->factory(); | 341 i::Factory* factory = isolate->factory(); |
342 | 342 |
343 // Preparsing didn't consider the catch clause of a try statement | 343 // Preparsing didn't consider the catch clause of a try statement |
344 // as with-content, which made it assume that a function inside | 344 // as with-content, which made it assume that a function inside |
345 // the block could be lazily compiled, and an extra, unexpected, | 345 // the block could be lazily compiled, and an extra, unexpected, |
346 // entry was added to the data. | 346 // entry was added to the data. |
347 int marker; | 347 int marker; |
348 isolate->stack_guard()->SetStackLimit( | 348 isolate->stack_guard()->SetStackLimit( |
349 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 349 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
350 | 350 |
(...skipping 26 matching lines...) Expand all Loading... |
377 CHECK(entry2.is_valid()); | 377 CHECK(entry2.is_valid()); |
378 CHECK_EQ('}', program[entry2.end_pos() - 1]); | 378 CHECK_EQ('}', program[entry2.end_pos() - 1]); |
379 delete data; | 379 delete data; |
380 } | 380 } |
381 | 381 |
382 | 382 |
383 TEST(PreParseOverflow) { | 383 TEST(PreParseOverflow) { |
384 v8::V8::Initialize(); | 384 v8::V8::Initialize(); |
385 | 385 |
386 int marker; | 386 int marker; |
387 i::Isolate::Current()->stack_guard()->SetStackLimit( | 387 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
388 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 388 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
389 | 389 |
390 size_t kProgramSize = 1024 * 1024; | 390 size_t kProgramSize = 1024 * 1024; |
391 i::SmartArrayPointer<char> program(i::NewArray<char>(kProgramSize + 1)); | 391 i::SmartArrayPointer<char> program(i::NewArray<char>(kProgramSize + 1)); |
392 memset(*program, '(', kProgramSize); | 392 memset(*program, '(', kProgramSize); |
393 program[kProgramSize] = '\0'; | 393 program[kProgramSize] = '\0'; |
394 | 394 |
395 uintptr_t stack_limit = i::Isolate::Current()->stack_guard()->real_climit(); | 395 uintptr_t stack_limit = CcTest::i_isolate()->stack_guard()->real_climit(); |
396 | 396 |
397 i::Utf8ToUtf16CharacterStream stream( | 397 i::Utf8ToUtf16CharacterStream stream( |
398 reinterpret_cast<const i::byte*>(*program), | 398 reinterpret_cast<const i::byte*>(*program), |
399 static_cast<unsigned>(kProgramSize)); | 399 static_cast<unsigned>(kProgramSize)); |
400 i::CompleteParserRecorder log; | 400 i::CompleteParserRecorder log; |
401 i::Scanner scanner(i::Isolate::Current()->unicode_cache()); | 401 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
402 scanner.Initialize(&stream); | 402 scanner.Initialize(&stream); |
403 | 403 |
404 v8::preparser::PreParser preparser(&scanner, &log, stack_limit); | 404 v8::preparser::PreParser preparser(&scanner, &log, stack_limit); |
405 preparser.set_allow_lazy(true); | 405 preparser.set_allow_lazy(true); |
406 v8::preparser::PreParser::PreParseResult result = | 406 v8::preparser::PreParser::PreParseResult result = |
407 preparser.PreParseProgram(); | 407 preparser.PreParseProgram(); |
408 CHECK_EQ(v8::preparser::PreParser::kPreParseStackOverflow, result); | 408 CHECK_EQ(v8::preparser::PreParser::kPreParseStackOverflow, result); |
409 } | 409 } |
410 | 410 |
411 | 411 |
(...skipping 18 matching lines...) Expand all Loading... |
430 | 430 |
431 | 431 |
432 #define CHECK_EQU(v1, v2) CHECK_EQ(static_cast<int>(v1), static_cast<int>(v2)) | 432 #define CHECK_EQU(v1, v2) CHECK_EQ(static_cast<int>(v1), static_cast<int>(v2)) |
433 | 433 |
434 void TestCharacterStream(const char* ascii_source, | 434 void TestCharacterStream(const char* ascii_source, |
435 unsigned length, | 435 unsigned length, |
436 unsigned start = 0, | 436 unsigned start = 0, |
437 unsigned end = 0) { | 437 unsigned end = 0) { |
438 if (end == 0) end = length; | 438 if (end == 0) end = length; |
439 unsigned sub_length = end - start; | 439 unsigned sub_length = end - start; |
440 i::Isolate* isolate = i::Isolate::Current(); | 440 i::Isolate* isolate = CcTest::i_isolate(); |
441 i::Factory* factory = isolate->factory(); | 441 i::Factory* factory = isolate->factory(); |
442 i::HandleScope test_scope(isolate); | 442 i::HandleScope test_scope(isolate); |
443 i::SmartArrayPointer<i::uc16> uc16_buffer(new i::uc16[length]); | 443 i::SmartArrayPointer<i::uc16> uc16_buffer(new i::uc16[length]); |
444 for (unsigned i = 0; i < length; i++) { | 444 for (unsigned i = 0; i < length; i++) { |
445 uc16_buffer[i] = static_cast<i::uc16>(ascii_source[i]); | 445 uc16_buffer[i] = static_cast<i::uc16>(ascii_source[i]); |
446 } | 446 } |
447 i::Vector<const char> ascii_vector(ascii_source, static_cast<int>(length)); | 447 i::Vector<const char> ascii_vector(ascii_source, static_cast<int>(length)); |
448 i::Handle<i::String> ascii_string( | 448 i::Handle<i::String> ascii_string( |
449 factory->NewStringFromAscii(ascii_vector)); | 449 factory->NewStringFromAscii(ascii_vector)); |
450 TestExternalResource resource(*uc16_buffer, length); | 450 TestExternalResource resource(*uc16_buffer, length); |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 CHECK_EQU(i, stream.pos()); | 612 CHECK_EQU(i, stream.pos()); |
613 } | 613 } |
614 } | 614 } |
615 | 615 |
616 #undef CHECK_EQU | 616 #undef CHECK_EQU |
617 | 617 |
618 void TestStreamScanner(i::Utf16CharacterStream* stream, | 618 void TestStreamScanner(i::Utf16CharacterStream* stream, |
619 i::Token::Value* expected_tokens, | 619 i::Token::Value* expected_tokens, |
620 int skip_pos = 0, // Zero means not skipping. | 620 int skip_pos = 0, // Zero means not skipping. |
621 int skip_to = 0) { | 621 int skip_to = 0) { |
622 i::Scanner scanner(i::Isolate::Current()->unicode_cache()); | 622 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
623 scanner.Initialize(stream); | 623 scanner.Initialize(stream); |
624 | 624 |
625 int i = 0; | 625 int i = 0; |
626 do { | 626 do { |
627 i::Token::Value expected = expected_tokens[i]; | 627 i::Token::Value expected = expected_tokens[i]; |
628 i::Token::Value actual = scanner.Next(); | 628 i::Token::Value actual = scanner.Next(); |
629 CHECK_EQ(i::Token::String(expected), i::Token::String(actual)); | 629 CHECK_EQ(i::Token::String(expected), i::Token::String(actual)); |
630 if (scanner.location().end_pos == skip_pos) { | 630 if (scanner.location().end_pos == skip_pos) { |
631 scanner.SeekForward(skip_to); | 631 scanner.SeekForward(skip_to); |
632 } | 632 } |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
694 static_cast<unsigned>(strlen(str3))); | 694 static_cast<unsigned>(strlen(str3))); |
695 TestStreamScanner(&stream3, expectations3, 1, 1 + i); | 695 TestStreamScanner(&stream3, expectations3, 1, 1 + i); |
696 } | 696 } |
697 } | 697 } |
698 | 698 |
699 | 699 |
700 void TestScanRegExp(const char* re_source, const char* expected) { | 700 void TestScanRegExp(const char* re_source, const char* expected) { |
701 i::Utf8ToUtf16CharacterStream stream( | 701 i::Utf8ToUtf16CharacterStream stream( |
702 reinterpret_cast<const i::byte*>(re_source), | 702 reinterpret_cast<const i::byte*>(re_source), |
703 static_cast<unsigned>(strlen(re_source))); | 703 static_cast<unsigned>(strlen(re_source))); |
704 i::Scanner scanner(i::Isolate::Current()->unicode_cache()); | 704 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
705 scanner.Initialize(&stream); | 705 scanner.Initialize(&stream); |
706 | 706 |
707 i::Token::Value start = scanner.peek(); | 707 i::Token::Value start = scanner.peek(); |
708 CHECK(start == i::Token::DIV || start == i::Token::ASSIGN_DIV); | 708 CHECK(start == i::Token::DIV || start == i::Token::ASSIGN_DIV); |
709 CHECK(scanner.ScanRegExpPattern(start == i::Token::ASSIGN_DIV)); | 709 CHECK(scanner.ScanRegExpPattern(start == i::Token::ASSIGN_DIV)); |
710 scanner.Next(); // Current token is now the regexp literal. | 710 scanner.Next(); // Current token is now the regexp literal. |
711 CHECK(scanner.is_literal_ascii()); | 711 CHECK(scanner.is_literal_ascii()); |
712 i::Vector<const char> actual = scanner.literal_ascii_string(); | 712 i::Vector<const char> actual = scanner.literal_ascii_string(); |
713 for (int i = 0; i < actual.length(); i++) { | 713 for (int i = 0; i < actual.length(); i++) { |
714 CHECK_NE('\0', expected[i]); | 714 CHECK_NE('\0', expected[i]); |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
983 i::FUNCTION_SCOPE, i::CLASSIC_MODE }, | 983 i::FUNCTION_SCOPE, i::CLASSIC_MODE }, |
984 { " 'foo';\n" | 984 { " 'foo';\n" |
985 " (function fun", "(a,b) { 'bar\355\240\201\355\260\213'; }", ")();", | 985 " (function fun", "(a,b) { 'bar\355\240\201\355\260\213'; }", ")();", |
986 i::FUNCTION_SCOPE, i::CLASSIC_MODE }, | 986 i::FUNCTION_SCOPE, i::CLASSIC_MODE }, |
987 { " 'foo';\n" | 987 { " 'foo';\n" |
988 " (function fun", "(a,b) { 'bar\360\220\220\214'; }", ")();", | 988 " (function fun", "(a,b) { 'bar\360\220\220\214'; }", ")();", |
989 i::FUNCTION_SCOPE, i::CLASSIC_MODE }, | 989 i::FUNCTION_SCOPE, i::CLASSIC_MODE }, |
990 { NULL, NULL, NULL, i::EVAL_SCOPE, i::CLASSIC_MODE } | 990 { NULL, NULL, NULL, i::EVAL_SCOPE, i::CLASSIC_MODE } |
991 }; | 991 }; |
992 | 992 |
993 i::Isolate* isolate = i::Isolate::Current(); | 993 i::Isolate* isolate = CcTest::i_isolate(); |
994 i::Factory* factory = isolate->factory(); | 994 i::Factory* factory = isolate->factory(); |
995 | 995 |
996 v8::HandleScope handles(CcTest::isolate()); | 996 v8::HandleScope handles(CcTest::isolate()); |
997 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | 997 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); |
998 v8::Context::Scope context_scope(context); | 998 v8::Context::Scope context_scope(context); |
999 | 999 |
1000 int marker; | 1000 int marker; |
1001 isolate->stack_guard()->SetStackLimit( | 1001 isolate->stack_guard()->SetStackLimit( |
1002 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 1002 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
1003 | 1003 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1041 CHECK_EQ(inner_scope->scope_type(), source_data[i].scope_type); | 1041 CHECK_EQ(inner_scope->scope_type(), source_data[i].scope_type); |
1042 CHECK_EQ(inner_scope->start_position(), kPrefixLen); | 1042 CHECK_EQ(inner_scope->start_position(), kPrefixLen); |
1043 // The end position of a token is one position after the last | 1043 // The end position of a token is one position after the last |
1044 // character belonging to that token. | 1044 // character belonging to that token. |
1045 CHECK_EQ(inner_scope->end_position(), kPrefixLen + kInnerLen); | 1045 CHECK_EQ(inner_scope->end_position(), kPrefixLen + kInnerLen); |
1046 } | 1046 } |
1047 } | 1047 } |
1048 | 1048 |
1049 | 1049 |
1050 i::Handle<i::String> FormatMessage(i::ScriptDataImpl* data) { | 1050 i::Handle<i::String> FormatMessage(i::ScriptDataImpl* data) { |
1051 i::Isolate* isolate = i::Isolate::Current(); | 1051 i::Isolate* isolate = CcTest::i_isolate(); |
1052 i::Factory* factory = isolate->factory(); | 1052 i::Factory* factory = isolate->factory(); |
1053 const char* message = data->BuildMessage(); | 1053 const char* message = data->BuildMessage(); |
1054 i::Handle<i::String> format = v8::Utils::OpenHandle( | 1054 i::Handle<i::String> format = v8::Utils::OpenHandle( |
1055 *v8::String::New(message)); | 1055 *v8::String::New(message)); |
1056 i::Vector<const char*> args = data->BuildArgs(); | 1056 i::Vector<const char*> args = data->BuildArgs(); |
1057 i::Handle<i::JSArray> args_array = factory->NewJSArray(args.length()); | 1057 i::Handle<i::JSArray> args_array = factory->NewJSArray(args.length()); |
1058 for (int i = 0; i < args.length(); i++) { | 1058 for (int i = 0; i < args.length(); i++) { |
1059 i::JSArray::SetElement(args_array, | 1059 i::JSArray::SetElement(args_array, |
1060 i, | 1060 i, |
1061 v8::Utils::OpenHandle(*v8::String::New(args[i])), | 1061 v8::Utils::OpenHandle(*v8::String::New(args[i])), |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1103 kAllowNativesSyntax)); \ | 1103 kAllowNativesSyntax)); \ |
1104 parser.set_allow_harmony_scoping(checkParserFlag(flags, \ | 1104 parser.set_allow_harmony_scoping(checkParserFlag(flags, \ |
1105 kAllowHarmonyScoping)); \ | 1105 kAllowHarmonyScoping)); \ |
1106 parser.set_allow_modules(checkParserFlag(flags, kAllowModules)); \ | 1106 parser.set_allow_modules(checkParserFlag(flags, kAllowModules)); \ |
1107 parser.set_allow_generators(checkParserFlag(flags, kAllowGenerators)); \ | 1107 parser.set_allow_generators(checkParserFlag(flags, kAllowGenerators)); \ |
1108 parser.set_allow_for_of(checkParserFlag(flags, kAllowForOf)); \ | 1108 parser.set_allow_for_of(checkParserFlag(flags, kAllowForOf)); \ |
1109 parser.set_allow_harmony_numeric_literals( \ | 1109 parser.set_allow_harmony_numeric_literals( \ |
1110 checkParserFlag(flags, kAllowHarmonyNumericLiterals)); | 1110 checkParserFlag(flags, kAllowHarmonyNumericLiterals)); |
1111 | 1111 |
1112 void TestParserSyncWithFlags(i::Handle<i::String> source, unsigned flags) { | 1112 void TestParserSyncWithFlags(i::Handle<i::String> source, unsigned flags) { |
1113 i::Isolate* isolate = i::Isolate::Current(); | 1113 i::Isolate* isolate = CcTest::i_isolate(); |
1114 i::Factory* factory = isolate->factory(); | 1114 i::Factory* factory = isolate->factory(); |
1115 | 1115 |
1116 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); | 1116 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); |
1117 | 1117 |
1118 // Preparse the data. | 1118 // Preparse the data. |
1119 i::CompleteParserRecorder log; | 1119 i::CompleteParserRecorder log; |
1120 { | 1120 { |
1121 i::Scanner scanner(isolate->unicode_cache()); | 1121 i::Scanner scanner(isolate->unicode_cache()); |
1122 i::GenericStringUtf16CharacterStream stream(source, 0, source->length()); | 1122 i::GenericStringUtf16CharacterStream stream(source, 0, source->length()); |
1123 v8::preparser::PreParser preparser(&scanner, &log, stack_limit); | 1123 v8::preparser::PreParser preparser(&scanner, &log, stack_limit); |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1257 | 1257 |
1258 const char* termination_data[] = { | 1258 const char* termination_data[] = { |
1259 "", | 1259 "", |
1260 ";", | 1260 ";", |
1261 "\n", | 1261 "\n", |
1262 ";\n", | 1262 ";\n", |
1263 "\n;", | 1263 "\n;", |
1264 NULL | 1264 NULL |
1265 }; | 1265 }; |
1266 | 1266 |
1267 i::Isolate* isolate = i::Isolate::Current(); | 1267 i::Isolate* isolate = CcTest::i_isolate(); |
1268 i::Factory* factory = isolate->factory(); | 1268 i::Factory* factory = isolate->factory(); |
1269 | 1269 |
1270 v8::HandleScope handles(CcTest::isolate()); | 1270 v8::HandleScope handles(CcTest::isolate()); |
1271 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | 1271 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); |
1272 v8::Context::Scope context_scope(context); | 1272 v8::Context::Scope context_scope(context); |
1273 | 1273 |
1274 int marker; | 1274 int marker; |
1275 isolate->stack_guard()->SetStackLimit( | 1275 isolate->stack_guard()->SetStackLimit( |
1276 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); | 1276 reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); |
1277 | 1277 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1318 " b = function() { \n" | 1318 " b = function() { \n" |
1319 " 01; \n" | 1319 " 01; \n" |
1320 " }; \n" | 1320 " }; \n" |
1321 "}; \n"; | 1321 "}; \n"; |
1322 v8::Script::Compile(v8::String::New(script)); | 1322 v8::Script::Compile(v8::String::New(script)); |
1323 CHECK(try_catch.HasCaught()); | 1323 CHECK(try_catch.HasCaught()); |
1324 v8::String::Utf8Value exception(try_catch.Exception()); | 1324 v8::String::Utf8Value exception(try_catch.Exception()); |
1325 CHECK_EQ("SyntaxError: Octal literals are not allowed in strict mode.", | 1325 CHECK_EQ("SyntaxError: Octal literals are not allowed in strict mode.", |
1326 *exception); | 1326 *exception); |
1327 } | 1327 } |
OLD | NEW |