| 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 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 "var w = /RegExp Literal\\u0020With Escape/gin;" | 212 "var w = /RegExp Literal\\u0020With Escape/gin;" |
| 213 "var y = { get getter() { return 42; }, " | 213 "var y = { get getter() { return 42; }, " |
| 214 " set setter(v) { this.value = v; }};"; | 214 " set setter(v) { this.value = v; }};"; |
| 215 int source_length = i::StrLength(source); | 215 int source_length = i::StrLength(source); |
| 216 | 216 |
| 217 // ScriptResource will be deleted when the corresponding String is GCd. | 217 // ScriptResource will be deleted when the corresponding String is GCd. |
| 218 v8::ScriptCompiler::Source script_source(v8::String::NewExternal( | 218 v8::ScriptCompiler::Source script_source(v8::String::NewExternal( |
| 219 isolate, new ScriptResource(source, source_length))); | 219 isolate, new ScriptResource(source, source_length))); |
| 220 i::FLAG_min_preparse_length = 0; | 220 i::FLAG_min_preparse_length = 0; |
| 221 v8::ScriptCompiler::Compile(isolate, &script_source, | 221 v8::ScriptCompiler::Compile(isolate, &script_source, |
| 222 v8::ScriptCompiler::kProduceDataToCache); | 222 v8::ScriptCompiler::kProduceParserCache); |
| 223 CHECK(script_source.GetCachedData()); | 223 CHECK(script_source.GetCachedData()); |
| 224 | 224 |
| 225 // Compile the script again, using the cached data. | 225 // Compile the script again, using the cached data. |
| 226 bool lazy_flag = i::FLAG_lazy; | 226 bool lazy_flag = i::FLAG_lazy; |
| 227 i::FLAG_lazy = true; | 227 i::FLAG_lazy = true; |
| 228 v8::ScriptCompiler::Compile(isolate, &script_source); | 228 v8::ScriptCompiler::Compile(isolate, &script_source, |
| 229 v8::ScriptCompiler::kConsumeParserCache); |
| 229 i::FLAG_lazy = false; | 230 i::FLAG_lazy = false; |
| 230 v8::ScriptCompiler::CompileUnbound(isolate, &script_source); | 231 v8::ScriptCompiler::CompileUnbound(isolate, &script_source, |
| 232 v8::ScriptCompiler::kConsumeParserCache); |
| 231 i::FLAG_lazy = lazy_flag; | 233 i::FLAG_lazy = lazy_flag; |
| 232 } | 234 } |
| 233 | 235 |
| 234 | 236 |
| 235 TEST(PreparseFunctionDataIsUsed) { | 237 TEST(PreparseFunctionDataIsUsed) { |
| 236 // This tests that we actually do use the function data generated by the | 238 // This tests that we actually do use the function data generated by the |
| 237 // preparser. | 239 // preparser. |
| 238 | 240 |
| 239 // Make preparsing work for short scripts. | 241 // Make preparsing work for short scripts. |
| 240 i::FLAG_min_preparse_length = 0; | 242 i::FLAG_min_preparse_length = 0; |
| 241 | 243 |
| 242 v8::Isolate* isolate = CcTest::isolate(); | 244 v8::Isolate* isolate = CcTest::isolate(); |
| 243 v8::HandleScope handles(isolate); | 245 v8::HandleScope handles(isolate); |
| 244 v8::Local<v8::Context> context = v8::Context::New(isolate); | 246 v8::Local<v8::Context> context = v8::Context::New(isolate); |
| 245 v8::Context::Scope context_scope(context); | 247 v8::Context::Scope context_scope(context); |
| 246 CcTest::i_isolate()->stack_guard()->SetStackLimit(GetCurrentStackPosition() - | 248 CcTest::i_isolate()->stack_guard()->SetStackLimit(GetCurrentStackPosition() - |
| 247 128 * 1024); | 249 128 * 1024); |
| 248 | 250 |
| 249 const char* good_code = | 251 const char* good_code = |
| 250 "function this_is_lazy() { var a; } function foo() { return 25; } foo();"; | 252 "function this_is_lazy() { var a; } function foo() { return 25; } foo();"; |
| 251 | 253 |
| 252 // Insert a syntax error inside the lazy function. | 254 // Insert a syntax error inside the lazy function. |
| 253 const char* bad_code = | 255 const char* bad_code = |
| 254 "function this_is_lazy() { if ( } function foo() { return 25; } foo();"; | 256 "function this_is_lazy() { if ( } function foo() { return 25; } foo();"; |
| 255 | 257 |
| 256 v8::ScriptCompiler::Source good_source(v8_str(good_code)); | 258 v8::ScriptCompiler::Source good_source(v8_str(good_code)); |
| 257 v8::ScriptCompiler::Compile(isolate, &good_source, | 259 v8::ScriptCompiler::Compile(isolate, &good_source, |
| 258 v8::ScriptCompiler::kProduceDataToCache); | 260 v8::ScriptCompiler::kProduceParserCache); |
| 259 | 261 |
| 260 const v8::ScriptCompiler::CachedData* cached_data = | 262 const v8::ScriptCompiler::CachedData* cached_data = |
| 261 good_source.GetCachedData(); | 263 good_source.GetCachedData(); |
| 262 CHECK(cached_data->data != NULL); | 264 CHECK(cached_data->data != NULL); |
| 263 CHECK_GT(cached_data->length, 0); | 265 CHECK_GT(cached_data->length, 0); |
| 264 | 266 |
| 265 // Now compile the erroneous code with the good preparse data. If the preparse | 267 // Now compile the erroneous code with the good preparse data. If the preparse |
| 266 // data is used, the lazy function is skipped and it should compile fine. | 268 // data is used, the lazy function is skipped and it should compile fine. |
| 267 v8::ScriptCompiler::Source bad_source( | 269 v8::ScriptCompiler::Source bad_source( |
| 268 v8_str(bad_code), new v8::ScriptCompiler::CachedData( | 270 v8_str(bad_code), new v8::ScriptCompiler::CachedData( |
| 269 cached_data->data, cached_data->length)); | 271 cached_data->data, cached_data->length)); |
| 270 v8::Local<v8::Value> result = | 272 v8::Local<v8::Value> result = |
| 271 v8::ScriptCompiler::Compile(isolate, &bad_source)->Run(); | 273 v8::ScriptCompiler::Compile( |
| 274 isolate, &bad_source, v8::ScriptCompiler::kConsumeParserCache)->Run(); |
| 272 CHECK(result->IsInt32()); | 275 CHECK(result->IsInt32()); |
| 273 CHECK_EQ(25, result->Int32Value()); | 276 CHECK_EQ(25, result->Int32Value()); |
| 274 } | 277 } |
| 275 | 278 |
| 276 | 279 |
| 277 TEST(StandAlonePreParser) { | 280 TEST(StandAlonePreParser) { |
| 278 v8::V8::Initialize(); | 281 v8::V8::Initialize(); |
| 279 | 282 |
| 280 CcTest::i_isolate()->stack_guard()->SetStackLimit(GetCurrentStackPosition() - | 283 CcTest::i_isolate()->stack_guard()->SetStackLimit(GetCurrentStackPosition() - |
| 281 128 * 1024); | 284 128 * 1024); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 // didn't match what Parser wanted to consume. | 351 // didn't match what Parser wanted to consume. |
| 349 v8::Isolate* isolate = CcTest::isolate(); | 352 v8::Isolate* isolate = CcTest::isolate(); |
| 350 v8::HandleScope handles(isolate); | 353 v8::HandleScope handles(isolate); |
| 351 v8::Local<v8::Context> context = v8::Context::New(isolate); | 354 v8::Local<v8::Context> context = v8::Context::New(isolate); |
| 352 v8::Context::Scope context_scope(context); | 355 v8::Context::Scope context_scope(context); |
| 353 CcTest::i_isolate()->stack_guard()->SetStackLimit(GetCurrentStackPosition() - | 356 CcTest::i_isolate()->stack_guard()->SetStackLimit(GetCurrentStackPosition() - |
| 354 128 * 1024); | 357 128 * 1024); |
| 355 | 358 |
| 356 { | 359 { |
| 357 const char* source = "var myo = {if: \"foo\"}; myo.if;"; | 360 const char* source = "var myo = {if: \"foo\"}; myo.if;"; |
| 358 v8::Local<v8::Value> result = PreCompileCompileRun(source); | 361 v8::Local<v8::Value> result = ParserCacheCompileRun(source); |
| 359 CHECK(result->IsString()); | 362 CHECK(result->IsString()); |
| 360 v8::String::Utf8Value utf8(result); | 363 v8::String::Utf8Value utf8(result); |
| 361 CHECK_EQ("foo", *utf8); | 364 CHECK_EQ("foo", *utf8); |
| 362 } | 365 } |
| 363 | 366 |
| 364 { | 367 { |
| 365 const char* source = "var myo = {\"bar\": \"foo\"}; myo[\"bar\"];"; | 368 const char* source = "var myo = {\"bar\": \"foo\"}; myo[\"bar\"];"; |
| 366 v8::Local<v8::Value> result = PreCompileCompileRun(source); | 369 v8::Local<v8::Value> result = ParserCacheCompileRun(source); |
| 367 CHECK(result->IsString()); | 370 CHECK(result->IsString()); |
| 368 v8::String::Utf8Value utf8(result); | 371 v8::String::Utf8Value utf8(result); |
| 369 CHECK_EQ("foo", *utf8); | 372 CHECK_EQ("foo", *utf8); |
| 370 } | 373 } |
| 371 | 374 |
| 372 { | 375 { |
| 373 const char* source = "var myo = {1: \"foo\"}; myo[1];"; | 376 const char* source = "var myo = {1: \"foo\"}; myo[1];"; |
| 374 v8::Local<v8::Value> result = PreCompileCompileRun(source); | 377 v8::Local<v8::Value> result = ParserCacheCompileRun(source); |
| 375 CHECK(result->IsString()); | 378 CHECK(result->IsString()); |
| 376 v8::String::Utf8Value utf8(result); | 379 v8::String::Utf8Value utf8(result); |
| 377 CHECK_EQ("foo", *utf8); | 380 CHECK_EQ("foo", *utf8); |
| 378 } | 381 } |
| 379 } | 382 } |
| 380 | 383 |
| 381 | 384 |
| 382 TEST(RegressChromium62639) { | 385 TEST(RegressChromium62639) { |
| 383 v8::V8::Initialize(); | 386 v8::V8::Initialize(); |
| 384 i::Isolate* isolate = CcTest::i_isolate(); | 387 i::Isolate* isolate = CcTest::i_isolate(); |
| (...skipping 1859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2244 }; | 2247 }; |
| 2245 | 2248 |
| 2246 for (int i = 0; test_cases[i].program; i++) { | 2249 for (int i = 0; test_cases[i].program; i++) { |
| 2247 const char* program = test_cases[i].program; | 2250 const char* program = test_cases[i].program; |
| 2248 i::Factory* factory = CcTest::i_isolate()->factory(); | 2251 i::Factory* factory = CcTest::i_isolate()->factory(); |
| 2249 i::Handle<i::String> source = | 2252 i::Handle<i::String> source = |
| 2250 factory->NewStringFromUtf8(i::CStrVector(program)).ToHandleChecked(); | 2253 factory->NewStringFromUtf8(i::CStrVector(program)).ToHandleChecked(); |
| 2251 i::Handle<i::Script> script = factory->NewScript(source); | 2254 i::Handle<i::Script> script = factory->NewScript(source); |
| 2252 i::CompilationInfoWithZone info(script); | 2255 i::CompilationInfoWithZone info(script); |
| 2253 i::ScriptData* sd = NULL; | 2256 i::ScriptData* sd = NULL; |
| 2254 info.SetCachedData(&sd, i::PRODUCE_CACHED_DATA); | 2257 info.SetCachedData(&sd, v8::ScriptCompiler::kProduceParserCache); |
| 2255 i::Parser::Parse(&info, true); | 2258 i::Parser::Parse(&info, true); |
| 2256 i::ParseData pd(sd); | 2259 i::ParseData pd(sd); |
| 2257 | 2260 |
| 2258 if (pd.FunctionCount() != test_cases[i].functions) { | 2261 if (pd.FunctionCount() != test_cases[i].functions) { |
| 2259 v8::base::OS::Print( | 2262 v8::base::OS::Print( |
| 2260 "Expected preparse data for program:\n" | 2263 "Expected preparse data for program:\n" |
| 2261 "\t%s\n" | 2264 "\t%s\n" |
| 2262 "to contain %d functions, however, received %d functions.\n", | 2265 "to contain %d functions, however, received %d functions.\n", |
| 2263 program, test_cases[i].functions, pd.FunctionCount()); | 2266 program, test_cases[i].functions, pd.FunctionCount()); |
| 2264 CHECK(false); | 2267 CHECK(false); |
| (...skipping 876 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3141 | 3144 |
| 3142 // Arrow has more precedence, this is the same as: foo ? bar : (baz = {}) | 3145 // Arrow has more precedence, this is the same as: foo ? bar : (baz = {}) |
| 3143 "foo ? bar : baz => {}", | 3146 "foo ? bar : baz => {}", |
| 3144 NULL | 3147 NULL |
| 3145 }; | 3148 }; |
| 3146 | 3149 |
| 3147 static const ParserFlag always_flags[] = {kAllowArrowFunctions}; | 3150 static const ParserFlag always_flags[] = {kAllowArrowFunctions}; |
| 3148 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | 3151 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
| 3149 always_flags, ARRAY_SIZE(always_flags)); | 3152 always_flags, ARRAY_SIZE(always_flags)); |
| 3150 } | 3153 } |
| OLD | NEW |