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

Side by Side Diff: src/compiler.cc

Issue 1206573004: Debugger: use list to find shared function info in a script. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix liveedit Created 5 years, 6 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
« no previous file with comments | « no previous file | src/debug.h » ('j') | src/debug.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler.h" 5 #include "src/compiler.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "src/ast-numbering.h" 9 #include "src/ast-numbering.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 1012
1013 void Compiler::CompileForLiveEdit(Handle<Script> script) { 1013 void Compiler::CompileForLiveEdit(Handle<Script> script) {
1014 // TODO(635): support extensions. 1014 // TODO(635): support extensions.
1015 Zone zone; 1015 Zone zone;
1016 ParseInfo parse_info(&zone, script); 1016 ParseInfo parse_info(&zone, script);
1017 CompilationInfo info(&parse_info); 1017 CompilationInfo info(&parse_info);
1018 PostponeInterruptsScope postpone(info.isolate()); 1018 PostponeInterruptsScope postpone(info.isolate());
1019 VMState<COMPILER> state(info.isolate()); 1019 VMState<COMPILER> state(info.isolate());
1020 1020
1021 // Get rid of old list of shared function infos. 1021 // Get rid of old list of shared function infos.
1022 script->set_shared_function_infos(Smi::FromInt(0)); 1022 info.MarkAsFirstCompile();
1023
1024 info.parse_info()->set_global(); 1023 info.parse_info()->set_global();
1025 if (!Parser::ParseStatic(info.parse_info())) return; 1024 if (!Parser::ParseStatic(info.parse_info())) return;
1026 1025
1027 LiveEditFunctionTracker tracker(info.isolate(), info.function()); 1026 LiveEditFunctionTracker tracker(info.isolate(), info.function());
1028 if (!CompileUnoptimizedCode(&info)) return; 1027 if (!CompileUnoptimizedCode(&info)) return;
1029 if (info.has_shared_info()) { 1028 if (info.has_shared_info()) {
1030 Handle<ScopeInfo> scope_info = 1029 Handle<ScopeInfo> scope_info =
1031 ScopeInfo::Create(info.isolate(), info.zone(), info.scope()); 1030 ScopeInfo::Create(info.isolate(), info.zone(), info.scope());
1032 info.shared_info()->set_scope_info(*scope_info); 1031 info.shared_info()->set_scope_info(*scope_info);
1033 } 1032 }
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
1336 // TODO(marja): FLAG_serialize_toplevel is not honoured and won't be; when the 1335 // TODO(marja): FLAG_serialize_toplevel is not honoured and won't be; when the
1337 // real code caching lands, streaming needs to be adapted to use it. 1336 // real code caching lands, streaming needs to be adapted to use it.
1338 return CompileToplevel(&compile_info); 1337 return CompileToplevel(&compile_info);
1339 } 1338 }
1340 1339
1341 1340
1342 Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfo( 1341 Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfo(
1343 FunctionLiteral* literal, Handle<Script> script, 1342 FunctionLiteral* literal, Handle<Script> script,
1344 CompilationInfo* outer_info) { 1343 CompilationInfo* outer_info) {
1345 // Precondition: code has been parsed and scopes have been analyzed. 1344 // Precondition: code has been parsed and scopes have been analyzed.
1345 Isolate* isolate = outer_info->isolate();
1346 MaybeHandle<SharedFunctionInfo> maybe_existing; 1346 MaybeHandle<SharedFunctionInfo> maybe_existing;
1347 if (outer_info->is_first_compile()) { 1347 if (outer_info->is_first_compile()) {
1348 // On the first compile, there are no existing shared function info for 1348 // On the first compile, there are no existing shared function info for
1349 // inner functions yet, so do not try to find them. 1349 // inner functions yet, so do not try to find them. All bets are off for
1350 DCHECK(script->FindSharedFunctionInfo(literal).is_null()); 1350 // live edit though.
1351 DCHECK(script->FindSharedFunctionInfo(literal).is_null() ||
1352 isolate->debug()->live_edit_enabled());
1351 } else { 1353 } else {
1352 maybe_existing = script->FindSharedFunctionInfo(literal); 1354 maybe_existing = script->FindSharedFunctionInfo(literal);
1353 } 1355 }
1354 // We found an existing shared function info. If it's already compiled, 1356 // We found an existing shared function info. If it's already compiled,
1355 // don't worry about compiling it, and simply return it. If it's not yet 1357 // don't worry about compiling it, and simply return it. If it's not yet
1356 // compiled, continue to decide whether to eagerly compile. 1358 // compiled, continue to decide whether to eagerly compile.
1357 Handle<SharedFunctionInfo> existing; 1359 Handle<SharedFunctionInfo> existing;
1358 if (maybe_existing.ToHandle(&existing) && existing->is_compiled()) { 1360 if (maybe_existing.ToHandle(&existing) && existing->is_compiled()) {
1359 return existing; 1361 return existing;
1360 } 1362 }
1361 1363
1362 Zone zone; 1364 Zone zone;
1363 ParseInfo parse_info(&zone, script); 1365 ParseInfo parse_info(&zone, script);
1364 CompilationInfo info(&parse_info); 1366 CompilationInfo info(&parse_info);
1365 parse_info.set_literal(literal); 1367 parse_info.set_literal(literal);
1366 parse_info.set_scope(literal->scope()); 1368 parse_info.set_scope(literal->scope());
1367 parse_info.set_language_mode(literal->scope()->language_mode()); 1369 parse_info.set_language_mode(literal->scope()->language_mode());
1368 if (outer_info->will_serialize()) info.PrepareForSerializing(); 1370 if (outer_info->will_serialize()) info.PrepareForSerializing();
1369 if (outer_info->is_first_compile()) info.MarkAsFirstCompile(); 1371 if (outer_info->is_first_compile()) info.MarkAsFirstCompile();
1370 1372
1371 Isolate* isolate = info.isolate();
1372 Factory* factory = isolate->factory();
1373 LiveEditFunctionTracker live_edit_tracker(isolate, literal); 1373 LiveEditFunctionTracker live_edit_tracker(isolate, literal);
1374 // Determine if the function can be lazily compiled. This is necessary to 1374 // Determine if the function can be lazily compiled. This is necessary to
1375 // allow some of our builtin JS files to be lazily compiled. These 1375 // allow some of our builtin JS files to be lazily compiled. These
1376 // builtins cannot be handled lazily by the parser, since we have to know 1376 // builtins cannot be handled lazily by the parser, since we have to know
1377 // if a function uses the special natives syntax, which is something the 1377 // if a function uses the special natives syntax, which is something the
1378 // parser records. 1378 // parser records.
1379 // If the debugger requests compilation for break points, we cannot be 1379 // If the debugger requests compilation for break points, we cannot be
1380 // aggressive about lazy compilation, because it might trigger compilation 1380 // aggressive about lazy compilation, because it might trigger compilation
1381 // of functions without an outer context when setting a breakpoint through 1381 // of functions without an outer context when setting a breakpoint through
1382 // Debug::FindSharedFunctionInfoInScript. 1382 // Debug::FindSharedFunctionInfoInScript.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1417 if (literal->should_eager_compile() && 1417 if (literal->should_eager_compile() &&
1418 literal->should_be_used_once_hint()) { 1418 literal->should_be_used_once_hint()) {
1419 info.code()->MarkToBeExecutedOnce(isolate); 1419 info.code()->MarkToBeExecutedOnce(isolate);
1420 } 1420 }
1421 } else { 1421 } else {
1422 return Handle<SharedFunctionInfo>::null(); 1422 return Handle<SharedFunctionInfo>::null();
1423 } 1423 }
1424 1424
1425 if (maybe_existing.is_null()) { 1425 if (maybe_existing.is_null()) {
1426 // Create a shared function info object. 1426 // Create a shared function info object.
1427 Handle<SharedFunctionInfo> result = factory->NewSharedFunctionInfo( 1427 Handle<SharedFunctionInfo> result =
1428 literal->name(), literal->materialized_literal_count(), literal->kind(), 1428 isolate->factory()->NewSharedFunctionInfo(
1429 info.code(), scope_info, info.feedback_vector()); 1429 literal->name(), literal->materialized_literal_count(),
1430 literal->kind(), info.code(), scope_info, info.feedback_vector());
1430 1431
1431 SharedFunctionInfo::InitFromFunctionLiteral(result, literal); 1432 SharedFunctionInfo::InitFromFunctionLiteral(result, literal);
1432 SharedFunctionInfo::SetScript(result, script); 1433 SharedFunctionInfo::SetScript(result, script);
1433 result->set_is_toplevel(false); 1434 result->set_is_toplevel(false);
1434 // If the outer function has been compiled before, we cannot be sure that 1435 // If the outer function has been compiled before, we cannot be sure that
1435 // shared function info for this function literal has been created for the 1436 // shared function info for this function literal has been created for the
1436 // first time. It may have already been compiled previously. 1437 // first time. It may have already been compiled previously.
1437 result->set_never_compiled(outer_info->is_first_compile() && lazy); 1438 result->set_never_compiled(outer_info->is_first_compile() && lazy);
1438 1439
1439 RecordFunctionCompilation(Logger::FUNCTION_TAG, &info, result); 1440 RecordFunctionCompilation(Logger::FUNCTION_TAG, &info, result);
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
1617 1618
1618 1619
1619 #if DEBUG 1620 #if DEBUG
1620 void CompilationInfo::PrintAstForTesting() { 1621 void CompilationInfo::PrintAstForTesting() {
1621 PrintF("--- Source from AST ---\n%s\n", 1622 PrintF("--- Source from AST ---\n%s\n",
1622 PrettyPrinter(isolate(), zone()).PrintProgram(function())); 1623 PrettyPrinter(isolate(), zone()).PrintProgram(function()));
1623 } 1624 }
1624 #endif 1625 #endif
1625 } // namespace internal 1626 } // namespace internal
1626 } // namespace v8 1627 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/debug.h » ('j') | src/debug.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698