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

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

Issue 376223002: Refactor ScriptData class for cached compile data. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 i::PreParser::PreParseResult result = preparser.PreParseProgram(); 158 i::PreParser::PreParseResult result = preparser.PreParseProgram();
159 CHECK_EQ(i::PreParser::kPreParseSuccess, result); 159 CHECK_EQ(i::PreParser::kPreParseSuccess, result);
160 i::ScriptData data(log.ExtractData()); 160 CHECK(!log.HasError());
161 CHECK(!data.has_error());
162 } 161 }
163 162
164 for (int i = 0; fail_tests[i]; i++) { 163 for (int i = 0; fail_tests[i]; i++) {
165 const i::byte* source = 164 const i::byte* source =
166 reinterpret_cast<const i::byte*>(fail_tests[i]); 165 reinterpret_cast<const i::byte*>(fail_tests[i]);
167 i::Utf8ToUtf16CharacterStream stream(source, i::StrLength(fail_tests[i])); 166 i::Utf8ToUtf16CharacterStream stream(source, i::StrLength(fail_tests[i]));
168 i::CompleteParserRecorder log; 167 i::CompleteParserRecorder log;
169 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); 168 i::Scanner scanner(CcTest::i_isolate()->unicode_cache());
170 scanner.Initialize(&stream); 169 scanner.Initialize(&stream);
171 i::PreParser preparser(&scanner, &log, stack_limit); 170 i::PreParser preparser(&scanner, &log, stack_limit);
172 preparser.set_allow_lazy(true); 171 preparser.set_allow_lazy(true);
173 i::PreParser::PreParseResult result = preparser.PreParseProgram(); 172 i::PreParser::PreParseResult result = preparser.PreParseProgram();
174 // Even in the case of a syntax error, kPreParseSuccess is returned. 173 // Even in the case of a syntax error, kPreParseSuccess is returned.
175 CHECK_EQ(i::PreParser::kPreParseSuccess, result); 174 CHECK_EQ(i::PreParser::kPreParseSuccess, result);
176 i::ScriptData data(log.ExtractData()); 175 CHECK(log.HasError());
177 CHECK(data.has_error());
178 } 176 }
179 } 177 }
180 178
181 179
182 class ScriptResource : public v8::String::ExternalAsciiStringResource { 180 class ScriptResource : public v8::String::ExternalAsciiStringResource {
183 public: 181 public:
184 ScriptResource(const char* data, size_t length) 182 ScriptResource(const char* data, size_t length)
185 : data_(data), length_(length) { } 183 : data_(data), length_(length) { }
186 184
187 const char* data() const { return data_; } 185 const char* data() const { return data_; }
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 static_cast<unsigned>(strlen(program))); 297 static_cast<unsigned>(strlen(program)));
300 i::CompleteParserRecorder log; 298 i::CompleteParserRecorder log;
301 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); 299 i::Scanner scanner(CcTest::i_isolate()->unicode_cache());
302 scanner.Initialize(&stream); 300 scanner.Initialize(&stream);
303 301
304 i::PreParser preparser(&scanner, &log, stack_limit); 302 i::PreParser preparser(&scanner, &log, stack_limit);
305 preparser.set_allow_lazy(true); 303 preparser.set_allow_lazy(true);
306 preparser.set_allow_natives_syntax(true); 304 preparser.set_allow_natives_syntax(true);
307 i::PreParser::PreParseResult result = preparser.PreParseProgram(); 305 i::PreParser::PreParseResult result = preparser.PreParseProgram();
308 CHECK_EQ(i::PreParser::kPreParseSuccess, result); 306 CHECK_EQ(i::PreParser::kPreParseSuccess, result);
309 i::ScriptData data(log.ExtractData()); 307 CHECK(!log.HasError());
310 CHECK(!data.has_error());
311 } 308 }
312 } 309 }
313 310
314 311
315 TEST(StandAlonePreParserNoNatives) { 312 TEST(StandAlonePreParserNoNatives) {
316 v8::V8::Initialize(); 313 v8::V8::Initialize();
317 314
318 CcTest::i_isolate()->stack_guard()->SetStackLimit(GetCurrentStackPosition() - 315 CcTest::i_isolate()->stack_guard()->SetStackLimit(GetCurrentStackPosition() -
319 128 * 1024); 316 128 * 1024);
320 317
(...skipping 11 matching lines...) Expand all
332 static_cast<unsigned>(strlen(program))); 329 static_cast<unsigned>(strlen(program)));
333 i::CompleteParserRecorder log; 330 i::CompleteParserRecorder log;
334 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); 331 i::Scanner scanner(CcTest::i_isolate()->unicode_cache());
335 scanner.Initialize(&stream); 332 scanner.Initialize(&stream);
336 333
337 // Preparser defaults to disallowing natives syntax. 334 // Preparser defaults to disallowing natives syntax.
338 i::PreParser preparser(&scanner, &log, stack_limit); 335 i::PreParser preparser(&scanner, &log, stack_limit);
339 preparser.set_allow_lazy(true); 336 preparser.set_allow_lazy(true);
340 i::PreParser::PreParseResult result = preparser.PreParseProgram(); 337 i::PreParser::PreParseResult result = preparser.PreParseProgram();
341 CHECK_EQ(i::PreParser::kPreParseSuccess, result); 338 CHECK_EQ(i::PreParser::kPreParseSuccess, result);
342 i::ScriptData data(log.ExtractData()); 339 CHECK(log.HasError());
343 // Data contains syntax error.
344 CHECK(data.has_error());
345 } 340 }
346 } 341 }
347 342
348 343
349 TEST(PreparsingObjectLiterals) { 344 TEST(PreparsingObjectLiterals) {
350 // Regression test for a bug where the symbol stream produced by PreParser 345 // Regression test for a bug where the symbol stream produced by PreParser
351 // didn't match what Parser wanted to consume. 346 // didn't match what Parser wanted to consume.
352 v8::Isolate* isolate = CcTest::isolate(); 347 v8::Isolate* isolate = CcTest::isolate();
353 v8::HandleScope handles(isolate); 348 v8::HandleScope handles(isolate);
354 v8::Local<v8::Context> context = v8::Context::New(isolate); 349 v8::Local<v8::Context> context = v8::Context::New(isolate);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 static_cast<unsigned>(strlen(program))); 395 static_cast<unsigned>(strlen(program)));
401 i::CompleteParserRecorder log; 396 i::CompleteParserRecorder log;
402 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); 397 i::Scanner scanner(CcTest::i_isolate()->unicode_cache());
403 scanner.Initialize(&stream); 398 scanner.Initialize(&stream);
404 i::PreParser preparser(&scanner, &log, 399 i::PreParser preparser(&scanner, &log,
405 CcTest::i_isolate()->stack_guard()->real_climit()); 400 CcTest::i_isolate()->stack_guard()->real_climit());
406 preparser.set_allow_lazy(true); 401 preparser.set_allow_lazy(true);
407 i::PreParser::PreParseResult result = preparser.PreParseProgram(); 402 i::PreParser::PreParseResult result = preparser.PreParseProgram();
408 // Even in the case of a syntax error, kPreParseSuccess is returned. 403 // Even in the case of a syntax error, kPreParseSuccess is returned.
409 CHECK_EQ(i::PreParser::kPreParseSuccess, result); 404 CHECK_EQ(i::PreParser::kPreParseSuccess, result);
410 i::ScriptData data(log.ExtractData()); 405 CHECK(log.HasError());
411 CHECK(data.has_error());
412 } 406 }
413 407
414 408
415 TEST(Regress928) { 409 TEST(Regress928) {
416 v8::V8::Initialize(); 410 v8::V8::Initialize();
417 i::Isolate* isolate = CcTest::i_isolate(); 411 i::Isolate* isolate = CcTest::i_isolate();
418 i::Factory* factory = isolate->factory(); 412 i::Factory* factory = isolate->factory();
419 413
420 // Preparsing didn't consider the catch clause of a try statement 414 // Preparsing didn't consider the catch clause of a try statement
421 // as with-content, which made it assume that a function inside 415 // as with-content, which made it assume that a function inside
422 // the block could be lazily compiled, and an extra, unexpected, 416 // the block could be lazily compiled, and an extra, unexpected,
423 // entry was added to the data. 417 // entry was added to the data.
424 isolate->stack_guard()->SetStackLimit(GetCurrentStackPosition() - 128 * 1024); 418 isolate->stack_guard()->SetStackLimit(GetCurrentStackPosition() - 128 * 1024);
425 419
426 const char* program = 420 const char* program =
427 "try { } catch (e) { var foo = function () { /* first */ } }" 421 "try { } catch (e) { var foo = function () { /* first */ } }"
428 "var bar = function () { /* second */ }"; 422 "var bar = function () { /* second */ }";
429 423
430 v8::HandleScope handles(CcTest::isolate()); 424 v8::HandleScope handles(CcTest::isolate());
431 i::Handle<i::String> source = factory->NewStringFromAsciiChecked(program); 425 i::Handle<i::String> source = factory->NewStringFromAsciiChecked(program);
432 i::GenericStringUtf16CharacterStream stream(source, 0, source->length()); 426 i::GenericStringUtf16CharacterStream stream(source, 0, source->length());
433 i::CompleteParserRecorder log; 427 i::CompleteParserRecorder log;
434 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); 428 i::Scanner scanner(CcTest::i_isolate()->unicode_cache());
435 scanner.Initialize(&stream); 429 scanner.Initialize(&stream);
436 i::PreParser preparser(&scanner, &log, 430 i::PreParser preparser(&scanner, &log,
437 CcTest::i_isolate()->stack_guard()->real_climit()); 431 CcTest::i_isolate()->stack_guard()->real_climit());
438 preparser.set_allow_lazy(true); 432 preparser.set_allow_lazy(true);
439 i::PreParser::PreParseResult result = preparser.PreParseProgram(); 433 i::PreParser::PreParseResult result = preparser.PreParseProgram();
440 CHECK_EQ(i::PreParser::kPreParseSuccess, result); 434 CHECK_EQ(i::PreParser::kPreParseSuccess, result);
441 i::ScriptData data(log.ExtractData()); 435 i::ScriptData* sd = log.GetScriptData();
442 CHECK(!data.has_error()); 436 i::ParseData pd(sd);
443 data.Initialize(); 437 pd.Initialize();
444 438
445 int first_function = 439 int first_function =
446 static_cast<int>(strstr(program, "function") - program); 440 static_cast<int>(strstr(program, "function") - program);
447 int first_lbrace = first_function + i::StrLength("function () "); 441 int first_lbrace = first_function + i::StrLength("function () ");
448 CHECK_EQ('{', program[first_lbrace]); 442 CHECK_EQ('{', program[first_lbrace]);
449 i::FunctionEntry entry1 = data.GetFunctionEntry(first_lbrace); 443 i::FunctionEntry entry1 = pd.GetFunctionEntry(first_lbrace);
450 CHECK(!entry1.is_valid()); 444 CHECK(!entry1.is_valid());
451 445
452 int second_function = 446 int second_function =
453 static_cast<int>(strstr(program + first_lbrace, "function") - program); 447 static_cast<int>(strstr(program + first_lbrace, "function") - program);
454 int second_lbrace = 448 int second_lbrace =
455 second_function + i::StrLength("function () "); 449 second_function + i::StrLength("function () ");
456 CHECK_EQ('{', program[second_lbrace]); 450 CHECK_EQ('{', program[second_lbrace]);
457 i::FunctionEntry entry2 = data.GetFunctionEntry(second_lbrace); 451 i::FunctionEntry entry2 = pd.GetFunctionEntry(second_lbrace);
458 CHECK(entry2.is_valid()); 452 CHECK(entry2.is_valid());
459 CHECK_EQ('}', program[entry2.end_pos() - 1]); 453 CHECK_EQ('}', program[entry2.end_pos() - 1]);
454 delete sd;
460 } 455 }
461 456
462 457
463 TEST(PreParseOverflow) { 458 TEST(PreParseOverflow) {
464 v8::V8::Initialize(); 459 v8::V8::Initialize();
465 460
466 CcTest::i_isolate()->stack_guard()->SetStackLimit(GetCurrentStackPosition() - 461 CcTest::i_isolate()->stack_guard()->SetStackLimit(GetCurrentStackPosition() -
467 128 * 1024); 462 128 * 1024);
468 463
469 size_t kProgramSize = 1024 * 1024; 464 size_t kProgramSize = 1024 * 1024;
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after
1127 i::Scope* inner_scope = scope->inner_scopes()->at(0); 1122 i::Scope* inner_scope = scope->inner_scopes()->at(0);
1128 CHECK_EQ(inner_scope->scope_type(), source_data[i].scope_type); 1123 CHECK_EQ(inner_scope->scope_type(), source_data[i].scope_type);
1129 CHECK_EQ(inner_scope->start_position(), kPrefixLen); 1124 CHECK_EQ(inner_scope->start_position(), kPrefixLen);
1130 // The end position of a token is one position after the last 1125 // The end position of a token is one position after the last
1131 // character belonging to that token. 1126 // character belonging to that token.
1132 CHECK_EQ(inner_scope->end_position(), kPrefixLen + kInnerLen); 1127 CHECK_EQ(inner_scope->end_position(), kPrefixLen + kInnerLen);
1133 } 1128 }
1134 } 1129 }
1135 1130
1136 1131
1137 i::Handle<i::String> FormatMessage(i::ScriptData* data) { 1132 const char* ReadString(unsigned* start) {
1133 int length = start[0];
1134 char* result = i::NewArray<char>(length + 1);
1135 for (int i = 0; i < length; i++) {
1136 result[i] = start[i + 1];
1137 }
1138 result[length] = '\0';
1139 return result;
1140 }
1141
1142
1143 i::Handle<i::String> FormatMessage(i::Vector<unsigned> data) {
1138 i::Isolate* isolate = CcTest::i_isolate(); 1144 i::Isolate* isolate = CcTest::i_isolate();
1139 i::Factory* factory = isolate->factory(); 1145 i::Factory* factory = isolate->factory();
1140 const char* message = data->BuildMessage(); 1146 const char* message =
1147 ReadString(&data[i::PreparseDataConstants::kMessageTextPos]);
1141 i::Handle<i::String> format = v8::Utils::OpenHandle( 1148 i::Handle<i::String> format = v8::Utils::OpenHandle(
1142 *v8::String::NewFromUtf8(CcTest::isolate(), message)); 1149 *v8::String::NewFromUtf8(CcTest::isolate(), message));
1143 const char* arg = data->BuildArg(); 1150 int arg_count = data[i::PreparseDataConstants::kMessageArgCountPos];
1144 i::Handle<i::JSArray> args_array = factory->NewJSArray(arg == NULL ? 0 : 1); 1151 const char* arg = NULL;
1145 if (arg != NULL) { 1152 i::Handle<i::JSArray> args_array;
1146 i::JSArray::SetElement( 1153 if (arg_count == 1) {
1147 args_array, 0, v8::Utils::OpenHandle(*v8::String::NewFromUtf8( 1154 // Position after text found by skipping past length field and
1148 CcTest::isolate(), arg)), 1155 // length field content words.
1149 NONE, i::SLOPPY).Check(); 1156 int pos = i::PreparseDataConstants::kMessageTextPos + 1 +
1157 data[i::PreparseDataConstants::kMessageTextPos];
1158 arg = ReadString(&data[pos]);
1159 args_array = factory->NewJSArray(1);
1160 i::JSArray::SetElement(args_array, 0, v8::Utils::OpenHandle(*v8_str(arg)),
1161 NONE, i::SLOPPY).Check();
1162 } else {
1163 CHECK_EQ(0, arg_count);
1164 args_array = factory->NewJSArray(0);
1150 } 1165 }
1166
1151 i::Handle<i::JSObject> builtins(isolate->js_builtins_object()); 1167 i::Handle<i::JSObject> builtins(isolate->js_builtins_object());
1152 i::Handle<i::Object> format_fun = i::Object::GetProperty( 1168 i::Handle<i::Object> format_fun = i::Object::GetProperty(
1153 isolate, builtins, "FormatMessage").ToHandleChecked(); 1169 isolate, builtins, "FormatMessage").ToHandleChecked();
1154 i::Handle<i::Object> arg_handles[] = { format, args_array }; 1170 i::Handle<i::Object> arg_handles[] = { format, args_array };
1155 i::Handle<i::Object> result = i::Execution::Call( 1171 i::Handle<i::Object> result = i::Execution::Call(
1156 isolate, format_fun, builtins, 2, arg_handles).ToHandleChecked(); 1172 isolate, format_fun, builtins, 2, arg_handles).ToHandleChecked();
1157 CHECK(result->IsString()); 1173 CHECK(result->IsString());
1158 i::DeleteArray(message); 1174 i::DeleteArray(message);
1159 i::DeleteArray(arg); 1175 i::DeleteArray(arg);
1176 data.Dispose();
1160 return i::Handle<i::String>::cast(result); 1177 return i::Handle<i::String>::cast(result);
1161 } 1178 }
1162 1179
1163 1180
1164 enum ParserFlag { 1181 enum ParserFlag {
1165 kAllowLazy, 1182 kAllowLazy,
1166 kAllowNativesSyntax, 1183 kAllowNativesSyntax,
1167 kAllowHarmonyScoping, 1184 kAllowHarmonyScoping,
1168 kAllowModules, 1185 kAllowModules,
1169 kAllowGenerators, 1186 kAllowGenerators,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1204 i::CompleteParserRecorder log; 1221 i::CompleteParserRecorder log;
1205 { 1222 {
1206 i::Scanner scanner(isolate->unicode_cache()); 1223 i::Scanner scanner(isolate->unicode_cache());
1207 i::GenericStringUtf16CharacterStream stream(source, 0, source->length()); 1224 i::GenericStringUtf16CharacterStream stream(source, 0, source->length());
1208 i::PreParser preparser(&scanner, &log, stack_limit); 1225 i::PreParser preparser(&scanner, &log, stack_limit);
1209 SetParserFlags(&preparser, flags); 1226 SetParserFlags(&preparser, flags);
1210 scanner.Initialize(&stream); 1227 scanner.Initialize(&stream);
1211 i::PreParser::PreParseResult result = preparser.PreParseProgram(); 1228 i::PreParser::PreParseResult result = preparser.PreParseProgram();
1212 CHECK_EQ(i::PreParser::kPreParseSuccess, result); 1229 CHECK_EQ(i::PreParser::kPreParseSuccess, result);
1213 } 1230 }
1214 i::ScriptData data(log.ExtractData()); 1231
1232 bool preparse_error = log.HasError();
1215 1233
1216 // Parse the data 1234 // Parse the data
1217 i::FunctionLiteral* function; 1235 i::FunctionLiteral* function;
1218 { 1236 {
1219 i::Handle<i::Script> script = factory->NewScript(source); 1237 i::Handle<i::Script> script = factory->NewScript(source);
1220 i::CompilationInfoWithZone info(script); 1238 i::CompilationInfoWithZone info(script);
1221 i::Parser parser(&info); 1239 i::Parser parser(&info);
1222 SetParserFlags(&parser, flags); 1240 SetParserFlags(&parser, flags);
1223 info.MarkAsGlobal(); 1241 info.MarkAsGlobal();
1224 parser.Parse(); 1242 parser.Parse();
(...skipping 14 matching lines...) Expand all
1239 v8::base::OS::Print( 1257 v8::base::OS::Print(
1240 "Parser failed on:\n" 1258 "Parser failed on:\n"
1241 "\t%s\n" 1259 "\t%s\n"
1242 "with error:\n" 1260 "with error:\n"
1243 "\t%s\n" 1261 "\t%s\n"
1244 "However, we expected no error.", 1262 "However, we expected no error.",
1245 source->ToCString().get(), message_string->ToCString().get()); 1263 source->ToCString().get(), message_string->ToCString().get());
1246 CHECK(false); 1264 CHECK(false);
1247 } 1265 }
1248 1266
1249 if (!data.has_error()) { 1267 if (!preparse_error) {
1250 v8::base::OS::Print( 1268 v8::base::OS::Print(
1251 "Parser failed on:\n" 1269 "Parser failed on:\n"
1252 "\t%s\n" 1270 "\t%s\n"
1253 "with error:\n" 1271 "with error:\n"
1254 "\t%s\n" 1272 "\t%s\n"
1255 "However, the preparser succeeded", 1273 "However, the preparser succeeded",
1256 source->ToCString().get(), message_string->ToCString().get()); 1274 source->ToCString().get(), message_string->ToCString().get());
1257 CHECK(false); 1275 CHECK(false);
1258 } 1276 }
1259 // Check that preparser and parser produce the same error. 1277 // Check that preparser and parser produce the same error.
1260 i::Handle<i::String> preparser_message = FormatMessage(&data); 1278 i::Handle<i::String> preparser_message =
1279 FormatMessage(log.ErrorMessageData());
1261 if (!i::String::Equals(message_string, preparser_message)) { 1280 if (!i::String::Equals(message_string, preparser_message)) {
1262 v8::base::OS::Print( 1281 v8::base::OS::Print(
1263 "Expected parser and preparser to produce the same error on:\n" 1282 "Expected parser and preparser to produce the same error on:\n"
1264 "\t%s\n" 1283 "\t%s\n"
1265 "However, found the following error messages\n" 1284 "However, found the following error messages\n"
1266 "\tparser: %s\n" 1285 "\tparser: %s\n"
1267 "\tpreparser: %s\n", 1286 "\tpreparser: %s\n",
1268 source->ToCString().get(), 1287 source->ToCString().get(),
1269 message_string->ToCString().get(), 1288 message_string->ToCString().get(),
1270 preparser_message->ToCString().get()); 1289 preparser_message->ToCString().get());
1271 CHECK(false); 1290 CHECK(false);
1272 } 1291 }
1273 } else if (data.has_error()) { 1292 } else if (preparse_error) {
1274 v8::base::OS::Print( 1293 v8::base::OS::Print(
1275 "Preparser failed on:\n" 1294 "Preparser failed on:\n"
1276 "\t%s\n" 1295 "\t%s\n"
1277 "with error:\n" 1296 "with error:\n"
1278 "\t%s\n" 1297 "\t%s\n"
1279 "However, the parser succeeded", 1298 "However, the parser succeeded",
1280 source->ToCString().get(), FormatMessage(&data)->ToCString().get()); 1299 source->ToCString().get(), FormatMessage(log.ErrorMessageData()));
1281 CHECK(false); 1300 CHECK(false);
1282 } else if (result == kError) { 1301 } else if (result == kError) {
1283 v8::base::OS::Print( 1302 v8::base::OS::Print(
1284 "Expected error on:\n" 1303 "Expected error on:\n"
1285 "\t%s\n" 1304 "\t%s\n"
1286 "However, parser and preparser succeeded", 1305 "However, parser and preparser succeeded",
1287 source->ToCString().get()); 1306 source->ToCString().get());
1288 CHECK(false); 1307 CHECK(false);
1289 } 1308 }
1290 } 1309 }
(...skipping 867 matching lines...) Expand 10 before | Expand all | Expand 10 after
2158 {NULL, 0} 2177 {NULL, 0}
2159 }; 2178 };
2160 2179
2161 for (int i = 0; test_cases[i].program; i++) { 2180 for (int i = 0; test_cases[i].program; i++) {
2162 const char* program = test_cases[i].program; 2181 const char* program = test_cases[i].program;
2163 i::Factory* factory = CcTest::i_isolate()->factory(); 2182 i::Factory* factory = CcTest::i_isolate()->factory();
2164 i::Handle<i::String> source = 2183 i::Handle<i::String> source =
2165 factory->NewStringFromUtf8(i::CStrVector(program)).ToHandleChecked(); 2184 factory->NewStringFromUtf8(i::CStrVector(program)).ToHandleChecked();
2166 i::Handle<i::Script> script = factory->NewScript(source); 2185 i::Handle<i::Script> script = factory->NewScript(source);
2167 i::CompilationInfoWithZone info(script); 2186 i::CompilationInfoWithZone info(script);
2168 i::ScriptData* data = NULL; 2187 i::ScriptData* sd = NULL;
2169 info.SetCachedData(&data, i::PRODUCE_CACHED_DATA); 2188 info.SetCachedData(&sd, i::PRODUCE_CACHED_DATA);
2170 i::Parser::Parse(&info, true); 2189 i::Parser::Parse(&info, true);
2171 CHECK(data); 2190 i::ParseData pd(sd);
2172 CHECK(!data->HasError());
2173 2191
2174 if (data->function_count() != test_cases[i].functions) { 2192 if (pd.FunctionCount() != test_cases[i].functions) {
2175 v8::base::OS::Print( 2193 v8::base::OS::Print(
2176 "Expected preparse data for program:\n" 2194 "Expected preparse data for program:\n"
2177 "\t%s\n" 2195 "\t%s\n"
2178 "to contain %d functions, however, received %d functions.\n", 2196 "to contain %d functions, however, received %d functions.\n",
2179 program, test_cases[i].functions, 2197 program, test_cases[i].functions, pd.FunctionCount());
2180 data->function_count());
2181 CHECK(false); 2198 CHECK(false);
2182 } 2199 }
2183 delete data; 2200 delete sd;
2184 } 2201 }
2185 } 2202 }
2186 2203
2187 2204
2188 TEST(FunctionDeclaresItselfStrict) { 2205 TEST(FunctionDeclaresItselfStrict) {
2189 // Tests that we produce the right kinds of errors when a function declares 2206 // Tests that we produce the right kinds of errors when a function declares
2190 // itself strict (we cannot produce there errors as soon as we see the 2207 // itself strict (we cannot produce there errors as soon as we see the
2191 // offending identifiers, because we don't know at that point whether the 2208 // offending identifiers, because we don't know at that point whether the
2192 // function is strict or not). 2209 // function is strict or not).
2193 const char* context_data[][2] = { 2210 const char* context_data[][2] = {
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after
2895 LocalContext env; 2912 LocalContext env;
2896 int use_counts[v8::Isolate::kUseCounterFeatureCount] = {}; 2913 int use_counts[v8::Isolate::kUseCounterFeatureCount] = {};
2897 global_use_counts = use_counts; 2914 global_use_counts = use_counts;
2898 CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback); 2915 CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback);
2899 CompileRun("\"use asm\";\n" 2916 CompileRun("\"use asm\";\n"
2900 "var foo = 1;\n" 2917 "var foo = 1;\n"
2901 "\"use asm\";\n" // Only the first one counts. 2918 "\"use asm\";\n" // Only the first one counts.
2902 "function bar() { \"use asm\"; var baz = 1; }"); 2919 "function bar() { \"use asm\"; var baz = 1; }");
2903 CHECK_EQ(2, use_counts[v8::Isolate::kUseAsm]); 2920 CHECK_EQ(2, use_counts[v8::Isolate::kUseAsm]);
2904 } 2921 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698