| 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 14499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14510 | 14510 |
| 14511 static i::HashMap* code_map = NULL; | 14511 static i::HashMap* code_map = NULL; |
| 14512 static i::HashMap* jitcode_line_info = NULL; | 14512 static i::HashMap* jitcode_line_info = NULL; |
| 14513 static int saw_bar = 0; | 14513 static int saw_bar = 0; |
| 14514 static int move_events = 0; | 14514 static int move_events = 0; |
| 14515 | 14515 |
| 14516 | 14516 |
| 14517 static bool FunctionNameIs(const char* expected, | 14517 static bool FunctionNameIs(const char* expected, |
| 14518 const v8::JitCodeEvent* event) { | 14518 const v8::JitCodeEvent* event) { |
| 14519 // Log lines for functions are of the general form: | 14519 // Log lines for functions are of the general form: |
| 14520 // "LazyCompile:<type><function_name>", where the type is one of | 14520 // "LazyCompile:<type><function_name>" or Function:<type><function_name>, |
| 14521 // "*", "~" or "". | 14521 // where the type is one of "*", "~" or "". |
| 14522 static const char kPreamble[] = "LazyCompile:"; | 14522 static const char* kPreamble; |
| 14523 static size_t kPreambleLen = sizeof(kPreamble) - 1; | 14523 if (!i::FLAG_lazy || i::FLAG_ignition) { |
| 14524 kPreamble = "Function:"; |
| 14525 } else { |
| 14526 kPreamble = "LazyCompile:"; |
| 14527 } |
| 14528 static size_t kPreambleLen = strlen(kPreamble); |
| 14524 | 14529 |
| 14525 if (event->name.len < sizeof(kPreamble) - 1 || | 14530 if (event->name.len < kPreambleLen || |
| 14526 strncmp(kPreamble, event->name.str, kPreambleLen) != 0) { | 14531 strncmp(kPreamble, event->name.str, kPreambleLen) != 0) { |
| 14527 return false; | 14532 return false; |
| 14528 } | 14533 } |
| 14529 | 14534 |
| 14530 const char* tail = event->name.str + kPreambleLen; | 14535 const char* tail = event->name.str + kPreambleLen; |
| 14531 size_t tail_len = event->name.len - kPreambleLen; | 14536 size_t tail_len = event->name.len - kPreambleLen; |
| 14532 size_t expected_len = strlen(expected); | 14537 size_t expected_len = strlen(expected); |
| 14533 if (tail_len > 1 && (*tail == '*' || *tail == '~')) { | 14538 if (tail_len > 1 && (*tail == '*' || *tail == '~')) { |
| 14534 --tail_len; | 14539 --tail_len; |
| 14535 ++tail; | 14540 ++tail; |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14683 move_events = 0; | 14688 move_events = 0; |
| 14684 | 14689 |
| 14685 isolate->SetJitCodeEventHandler(v8::kJitCodeEventDefault, event_handler); | 14690 isolate->SetJitCodeEventHandler(v8::kJitCodeEventDefault, event_handler); |
| 14686 | 14691 |
| 14687 // Generate new code objects sparsely distributed across several | 14692 // Generate new code objects sparsely distributed across several |
| 14688 // different fragmented code-space pages. | 14693 // different fragmented code-space pages. |
| 14689 const int kIterations = 10; | 14694 const int kIterations = 10; |
| 14690 for (int i = 0; i < kIterations; ++i) { | 14695 for (int i = 0; i < kIterations; ++i) { |
| 14691 LocalContext env(isolate); | 14696 LocalContext env(isolate); |
| 14692 i::AlwaysAllocateScope always_allocate(i_isolate); | 14697 i::AlwaysAllocateScope always_allocate(i_isolate); |
| 14693 SimulateFullSpace(heap->code_space()); | 14698 SimulateFullSpace(i::FLAG_ignition ? heap->old_space() |
| 14699 : heap->code_space()); |
| 14694 CompileRun(script); | 14700 CompileRun(script); |
| 14695 | 14701 |
| 14696 // Keep a strong reference to the code object in the handle scope. | 14702 // Keep a strong reference to the code object in the handle scope. |
| 14697 i::Handle<i::Code> bar_code( | 14703 i::Handle<i::Code> bar_code( |
| 14698 i::Handle<i::JSFunction>::cast( | 14704 i::Handle<i::JSFunction>::cast( |
| 14699 v8::Utils::OpenHandle(*env->Global() | 14705 v8::Utils::OpenHandle(*env->Global() |
| 14700 ->Get(env.local(), v8_str("bar")) | 14706 ->Get(env.local(), v8_str("bar")) |
| 14701 .ToLocalChecked())) | 14707 .ToLocalChecked())) |
| 14702 ->code()); | 14708 ->code()); |
| 14703 i::Handle<i::Code> foo_code( | 14709 i::Handle<i::Code> foo_code( |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15124 ->Set(context.local(), v8_str("obj_2"), instance_2) | 15130 ->Set(context.local(), v8_str("obj_2"), instance_2) |
| 15125 .FromJust()); | 15131 .FromJust()); |
| 15126 | 15132 |
| 15127 Local<Value> value_2 = CompileRun("obj_2.a"); | 15133 Local<Value> value_2 = CompileRun("obj_2.a"); |
| 15128 CHECK(value_2.IsEmpty()); | 15134 CHECK(value_2.IsEmpty()); |
| 15129 } | 15135 } |
| 15130 | 15136 |
| 15131 | 15137 |
| 15132 // Tests that ScriptData can be serialized and deserialized. | 15138 // Tests that ScriptData can be serialized and deserialized. |
| 15133 TEST(PreCompileSerialization) { | 15139 TEST(PreCompileSerialization) { |
| 15140 // Producing cached parser data while parsing eagerly is not supported. |
| 15141 if (!i::FLAG_lazy || i::FLAG_ignition) return; |
| 15142 |
| 15134 v8::V8::Initialize(); | 15143 v8::V8::Initialize(); |
| 15135 LocalContext env; | 15144 LocalContext env; |
| 15136 v8::Isolate* isolate = env->GetIsolate(); | 15145 v8::Isolate* isolate = env->GetIsolate(); |
| 15137 HandleScope handle_scope(isolate); | 15146 HandleScope handle_scope(isolate); |
| 15138 | 15147 |
| 15139 i::FLAG_min_preparse_length = 0; | 15148 i::FLAG_min_preparse_length = 0; |
| 15140 const char* script = "function foo(a) { return a+1; }"; | 15149 const char* script = "function foo(a) { return a+1; }"; |
| 15141 v8::ScriptCompiler::Source source(v8_str(script)); | 15150 v8::ScriptCompiler::Source source(v8_str(script)); |
| 15142 v8::ScriptCompiler::Compile(env.local(), &source, | 15151 v8::ScriptCompiler::Compile(env.local(), &source, |
| 15143 v8::ScriptCompiler::kProduceParserCache) | 15152 v8::ScriptCompiler::kProduceParserCache) |
| (...skipping 8911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 24055 CHECK_EQ( | 24064 CHECK_EQ( |
| 24056 42, | 24065 42, |
| 24057 script->Run(context).ToLocalChecked()->Int32Value(context).FromJust()); | 24066 script->Run(context).ToLocalChecked()->Int32Value(context).FromJust()); |
| 24058 } | 24067 } |
| 24059 | 24068 |
| 24060 | 24069 |
| 24061 TEST(InvalidCacheData) { | 24070 TEST(InvalidCacheData) { |
| 24062 v8::V8::Initialize(); | 24071 v8::V8::Initialize(); |
| 24063 v8::HandleScope scope(CcTest::isolate()); | 24072 v8::HandleScope scope(CcTest::isolate()); |
| 24064 LocalContext context; | 24073 LocalContext context; |
| 24065 TestInvalidCacheData(v8::ScriptCompiler::kConsumeParserCache); | 24074 if (i::FLAG_lazy && !i::FLAG_ignition) { |
| 24075 // Cached parser data is not consumed while parsing eagerly. |
| 24076 TestInvalidCacheData(v8::ScriptCompiler::kConsumeParserCache); |
| 24077 } |
| 24066 TestInvalidCacheData(v8::ScriptCompiler::kConsumeCodeCache); | 24078 TestInvalidCacheData(v8::ScriptCompiler::kConsumeCodeCache); |
| 24067 } | 24079 } |
| 24068 | 24080 |
| 24069 | 24081 |
| 24070 TEST(ParserCacheRejectedGracefully) { | 24082 TEST(ParserCacheRejectedGracefully) { |
| 24083 // Producing cached parser data while parsing eagerly is not supported. |
| 24084 if (!i::FLAG_lazy || i::FLAG_ignition) return; |
| 24085 |
| 24071 i::FLAG_min_preparse_length = 0; | 24086 i::FLAG_min_preparse_length = 0; |
| 24072 v8::V8::Initialize(); | 24087 v8::V8::Initialize(); |
| 24073 v8::HandleScope scope(CcTest::isolate()); | 24088 v8::HandleScope scope(CcTest::isolate()); |
| 24074 LocalContext context; | 24089 LocalContext context; |
| 24075 // Produce valid cached data. | 24090 // Produce valid cached data. |
| 24076 v8::ScriptOrigin origin(v8_str("origin")); | 24091 v8::ScriptOrigin origin(v8_str("origin")); |
| 24077 v8::Local<v8::String> source_str = v8_str("function foo() {}"); | 24092 v8::Local<v8::String> source_str = v8_str("function foo() {}"); |
| 24078 v8::ScriptCompiler::Source source(source_str, origin); | 24093 v8::ScriptCompiler::Source source(source_str, origin); |
| 24079 v8::Local<v8::Script> script = | 24094 v8::Local<v8::Script> script = |
| 24080 v8::ScriptCompiler::Compile(context.local(), &source, | 24095 v8::ScriptCompiler::Compile(context.local(), &source, |
| (...skipping 807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 24888 .FromJust()); | 24903 .FromJust()); |
| 24889 } | 24904 } |
| 24890 | 24905 |
| 24891 // Case 2: Js source file. | 24906 // Case 2: Js source file. |
| 24892 { | 24907 { |
| 24893 v8::MaybeLocal<v8::Script> script = | 24908 v8::MaybeLocal<v8::Script> script = |
| 24894 v8::Script::Compile(context.local(), v8_str(source), &source_script); | 24909 v8::Script::Compile(context.local(), v8_str(source), &source_script); |
| 24895 CHECK(script.IsEmpty()); | 24910 CHECK(script.IsEmpty()); |
| 24896 } | 24911 } |
| 24897 } | 24912 } |
| OLD | NEW |