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

Side by Side Diff: src/debug.cc

Issue 10536142: Revert r11782, r11783 and r11790 due to Webkit failures. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 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 | Annotate | Revision Log
« no previous file with comments | « src/debug.h ('k') | src/full-codegen.cc » ('j') | no next file with comments »
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 // 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 1152 matching lines...) Expand 10 before | Expand all | Expand 10 after
1163 1163
1164 1164
1165 // Return the debug info for this function. EnsureDebugInfo must be called 1165 // Return the debug info for this function. EnsureDebugInfo must be called
1166 // prior to ensure the debug info has been generated for shared. 1166 // prior to ensure the debug info has been generated for shared.
1167 Handle<DebugInfo> Debug::GetDebugInfo(Handle<SharedFunctionInfo> shared) { 1167 Handle<DebugInfo> Debug::GetDebugInfo(Handle<SharedFunctionInfo> shared) {
1168 ASSERT(HasDebugInfo(shared)); 1168 ASSERT(HasDebugInfo(shared));
1169 return Handle<DebugInfo>(DebugInfo::cast(shared->debug_info())); 1169 return Handle<DebugInfo>(DebugInfo::cast(shared->debug_info()));
1170 } 1170 }
1171 1171
1172 1172
1173 void Debug::SetBreakPoint(Handle<JSFunction> function, 1173 void Debug::SetBreakPoint(Handle<SharedFunctionInfo> shared,
1174 Handle<Object> break_point_object, 1174 Handle<Object> break_point_object,
1175 int* source_position) { 1175 int* source_position) {
1176 HandleScope scope(isolate_); 1176 HandleScope scope(isolate_);
1177 1177
1178 PrepareForBreakPoints(); 1178 PrepareForBreakPoints();
1179 1179
1180 // Make sure the function is compiled and has set up the debug info. 1180 if (!EnsureDebugInfo(shared)) {
1181 Handle<SharedFunctionInfo> shared(function->shared());
1182 if (!EnsureDebugInfo(shared, function)) {
1183 // Return if retrieving debug info failed. 1181 // Return if retrieving debug info failed.
1184 return; 1182 return;
1185 } 1183 }
1186 1184
1187 Handle<DebugInfo> debug_info = GetDebugInfo(shared); 1185 Handle<DebugInfo> debug_info = GetDebugInfo(shared);
1188 // Source positions starts with zero. 1186 // Source positions starts with zero.
1189 ASSERT(*source_position >= 0); 1187 ASSERT(*source_position >= 0);
1190 1188
1191 // Find the break point and change it. 1189 // Find the break point and change it.
1192 BreakLocationIterator it(debug_info, SOURCE_BREAK_LOCATIONS); 1190 BreakLocationIterator it(debug_info, SOURCE_BREAK_LOCATIONS);
1193 it.FindBreakLocationFromPosition(*source_position); 1191 it.FindBreakLocationFromPosition(*source_position);
1194 it.SetBreakPoint(break_point_object); 1192 it.SetBreakPoint(break_point_object);
1195 1193
1196 *source_position = it.position(); 1194 *source_position = it.position();
1197 1195
1198 // At least one active break point now. 1196 // At least one active break point now.
1199 ASSERT(debug_info->GetBreakPointCount() > 0); 1197 ASSERT(debug_info->GetBreakPointCount() > 0);
1200 } 1198 }
1201 1199
1202 1200
1203 bool Debug::SetBreakPointForScript(Handle<Script> script,
1204 Handle<Object> break_point_object,
1205 int* source_position) {
1206 HandleScope scope(isolate_);
1207
1208 // No need to call PrepareForBreakPoints because it will be called
1209 // implicitly by Runtime::FindSharedFunctionInfoInScript.
1210 Object* result = Runtime::FindSharedFunctionInfoInScript(isolate_,
1211 script,
1212 *source_position);
1213 if (result->IsUndefined()) return false;
1214
1215 // Make sure the function has set up the debug info.
1216 Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(result));
1217 if (!EnsureDebugInfo(shared, Handle<JSFunction>::null())) {
1218 // Return if retrieving debug info failed.
1219 return false;
1220 }
1221
1222 // Find position within function. The script position might be before the
1223 // source position of the first function.
1224 int position;
1225 if (shared->start_position() > *source_position) {
1226 position = 0;
1227 } else {
1228 position = *source_position - shared->start_position();
1229 }
1230
1231 Handle<DebugInfo> debug_info = GetDebugInfo(shared);
1232 // Source positions starts with zero.
1233 ASSERT(position >= 0);
1234
1235 // Find the break point and change it.
1236 BreakLocationIterator it(debug_info, SOURCE_BREAK_LOCATIONS);
1237 it.FindBreakLocationFromPosition(position);
1238 it.SetBreakPoint(break_point_object);
1239
1240 *source_position = it.position() + shared->start_position();
1241
1242 // At least one active break point now.
1243 ASSERT(debug_info->GetBreakPointCount() > 0);
1244 return true;
1245 }
1246
1247
1248 void Debug::ClearBreakPoint(Handle<Object> break_point_object) { 1201 void Debug::ClearBreakPoint(Handle<Object> break_point_object) {
1249 HandleScope scope(isolate_); 1202 HandleScope scope(isolate_);
1250 1203
1251 DebugInfoListNode* node = debug_info_list_; 1204 DebugInfoListNode* node = debug_info_list_;
1252 while (node != NULL) { 1205 while (node != NULL) {
1253 Object* result = DebugInfo::FindBreakPointInfo(node->debug_info(), 1206 Object* result = DebugInfo::FindBreakPointInfo(node->debug_info(),
1254 break_point_object); 1207 break_point_object);
1255 if (!result->IsUndefined()) { 1208 if (!result->IsUndefined()) {
1256 // Get information in the break point. 1209 // Get information in the break point.
1257 BreakPointInfo* break_point_info = BreakPointInfo::cast(result); 1210 BreakPointInfo* break_point_info = BreakPointInfo::cast(result);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1289 node = node->next(); 1242 node = node->next();
1290 } 1243 }
1291 1244
1292 // Remove all debug info. 1245 // Remove all debug info.
1293 while (debug_info_list_ != NULL) { 1246 while (debug_info_list_ != NULL) {
1294 RemoveDebugInfo(debug_info_list_->debug_info()); 1247 RemoveDebugInfo(debug_info_list_->debug_info());
1295 } 1248 }
1296 } 1249 }
1297 1250
1298 1251
1299 void Debug::FloodWithOneShot(Handle<JSFunction> function) { 1252 void Debug::FloodWithOneShot(Handle<SharedFunctionInfo> shared) {
1300 PrepareForBreakPoints(); 1253 PrepareForBreakPoints();
1301 1254 // Make sure the function has set up the debug info.
1302 // Make sure the function is compiled and has set up the debug info. 1255 if (!EnsureDebugInfo(shared)) {
1303 Handle<SharedFunctionInfo> shared(function->shared());
1304 if (!EnsureDebugInfo(shared, function)) {
1305 // Return if we failed to retrieve the debug info. 1256 // Return if we failed to retrieve the debug info.
1306 return; 1257 return;
1307 } 1258 }
1308 1259
1309 // Flood the function with break points. 1260 // Flood the function with break points.
1310 BreakLocationIterator it(GetDebugInfo(shared), ALL_BREAK_LOCATIONS); 1261 BreakLocationIterator it(GetDebugInfo(shared), ALL_BREAK_LOCATIONS);
1311 while (!it.Done()) { 1262 while (!it.Done()) {
1312 it.SetOneShot(); 1263 it.SetOneShot();
1313 it.Next(); 1264 it.Next();
1314 } 1265 }
1315 } 1266 }
1316 1267
1317 1268
1318 void Debug::FloodBoundFunctionWithOneShot(Handle<JSFunction> function) { 1269 void Debug::FloodBoundFunctionWithOneShot(Handle<JSFunction> function) {
1319 Handle<FixedArray> new_bindings(function->function_bindings()); 1270 Handle<FixedArray> new_bindings(function->function_bindings());
1320 Handle<Object> bindee(new_bindings->get(JSFunction::kBoundFunctionIndex)); 1271 Handle<Object> bindee(new_bindings->get(JSFunction::kBoundFunctionIndex));
1321 1272
1322 if (!bindee.is_null() && bindee->IsJSFunction() && 1273 if (!bindee.is_null() && bindee->IsJSFunction() &&
1323 !JSFunction::cast(*bindee)->IsBuiltin()) { 1274 !JSFunction::cast(*bindee)->IsBuiltin()) {
1324 Handle<JSFunction> bindee_function(JSFunction::cast(*bindee)); 1275 Handle<SharedFunctionInfo> shared_info(JSFunction::cast(*bindee)->shared());
1325 Debug::FloodWithOneShot(bindee_function); 1276 Debug::FloodWithOneShot(shared_info);
1326 } 1277 }
1327 } 1278 }
1328 1279
1329 1280
1330 void Debug::FloodHandlerWithOneShot() { 1281 void Debug::FloodHandlerWithOneShot() {
1331 // Iterate through the JavaScript stack looking for handlers. 1282 // Iterate through the JavaScript stack looking for handlers.
1332 StackFrame::Id id = break_frame_id(); 1283 StackFrame::Id id = break_frame_id();
1333 if (id == StackFrame::NO_ID) { 1284 if (id == StackFrame::NO_ID) {
1334 // If there is no JavaScript stack don't do anything. 1285 // If there is no JavaScript stack don't do anything.
1335 return; 1286 return;
1336 } 1287 }
1337 for (JavaScriptFrameIterator it(isolate_, id); !it.done(); it.Advance()) { 1288 for (JavaScriptFrameIterator it(isolate_, id); !it.done(); it.Advance()) {
1338 JavaScriptFrame* frame = it.frame(); 1289 JavaScriptFrame* frame = it.frame();
1339 if (frame->HasHandler()) { 1290 if (frame->HasHandler()) {
1291 Handle<SharedFunctionInfo> shared =
1292 Handle<SharedFunctionInfo>(
1293 JSFunction::cast(frame->function())->shared());
1340 // Flood the function with the catch block with break points 1294 // Flood the function with the catch block with break points
1341 JSFunction* function = JSFunction::cast(frame->function()); 1295 FloodWithOneShot(shared);
1342 FloodWithOneShot(Handle<JSFunction>(function));
1343 return; 1296 return;
1344 } 1297 }
1345 } 1298 }
1346 } 1299 }
1347 1300
1348 1301
1349 void Debug::ChangeBreakOnException(ExceptionBreakType type, bool enable) { 1302 void Debug::ChangeBreakOnException(ExceptionBreakType type, bool enable) {
1350 if (type == BreakUncaughtException) { 1303 if (type == BreakUncaughtException) {
1351 break_on_uncaught_exception_ = enable; 1304 break_on_uncaught_exception_ = enable;
1352 } else { 1305 } else {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1399 1352
1400 // If the function on the top frame is unresolved perform step out. This will 1353 // If the function on the top frame is unresolved perform step out. This will
1401 // be the case when calling unknown functions and having the debugger stopped 1354 // be the case when calling unknown functions and having the debugger stopped
1402 // in an unhandled exception. 1355 // in an unhandled exception.
1403 if (!frame->function()->IsJSFunction()) { 1356 if (!frame->function()->IsJSFunction()) {
1404 // Step out: Find the calling JavaScript frame and flood it with 1357 // Step out: Find the calling JavaScript frame and flood it with
1405 // breakpoints. 1358 // breakpoints.
1406 frames_it.Advance(); 1359 frames_it.Advance();
1407 // Fill the function to return to with one-shot break points. 1360 // Fill the function to return to with one-shot break points.
1408 JSFunction* function = JSFunction::cast(frames_it.frame()->function()); 1361 JSFunction* function = JSFunction::cast(frames_it.frame()->function());
1409 FloodWithOneShot(Handle<JSFunction>(function)); 1362 FloodWithOneShot(Handle<SharedFunctionInfo>(function->shared()));
1410 return; 1363 return;
1411 } 1364 }
1412 1365
1413 // Get the debug info (create it if it does not exist). 1366 // Get the debug info (create it if it does not exist).
1414 Handle<JSFunction> function(JSFunction::cast(frame->function())); 1367 Handle<SharedFunctionInfo> shared =
1415 Handle<SharedFunctionInfo> shared(function->shared()); 1368 Handle<SharedFunctionInfo>(JSFunction::cast(frame->function())->shared());
1416 if (!EnsureDebugInfo(shared, function)) { 1369 if (!EnsureDebugInfo(shared)) {
1417 // Return if ensuring debug info failed. 1370 // Return if ensuring debug info failed.
1418 return; 1371 return;
1419 } 1372 }
1420 Handle<DebugInfo> debug_info = GetDebugInfo(shared); 1373 Handle<DebugInfo> debug_info = GetDebugInfo(shared);
1421 1374
1422 // Find the break location where execution has stopped. 1375 // Find the break location where execution has stopped.
1423 BreakLocationIterator it(debug_info, ALL_BREAK_LOCATIONS); 1376 BreakLocationIterator it(debug_info, ALL_BREAK_LOCATIONS);
1424 it.FindBreakLocationFromAddress(frame->pc()); 1377 it.FindBreakLocationFromAddress(frame->pc());
1425 1378
1426 // Compute whether or not the target is a call target. 1379 // Compute whether or not the target is a call target.
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1476 // Skip builtin functions on the stack. 1429 // Skip builtin functions on the stack.
1477 while (!frames_it.done() && 1430 while (!frames_it.done() &&
1478 JSFunction::cast(frames_it.frame()->function())->IsBuiltin()) { 1431 JSFunction::cast(frames_it.frame()->function())->IsBuiltin()) {
1479 frames_it.Advance(); 1432 frames_it.Advance();
1480 } 1433 }
1481 // Step out: If there is a JavaScript caller frame, we need to 1434 // Step out: If there is a JavaScript caller frame, we need to
1482 // flood it with breakpoints. 1435 // flood it with breakpoints.
1483 if (!frames_it.done()) { 1436 if (!frames_it.done()) {
1484 // Fill the function to return to with one-shot break points. 1437 // Fill the function to return to with one-shot break points.
1485 JSFunction* function = JSFunction::cast(frames_it.frame()->function()); 1438 JSFunction* function = JSFunction::cast(frames_it.frame()->function());
1486 FloodWithOneShot(Handle<JSFunction>(function)); 1439 FloodWithOneShot(Handle<SharedFunctionInfo>(function->shared()));
1487 // Set target frame pointer. 1440 // Set target frame pointer.
1488 ActivateStepOut(frames_it.frame()); 1441 ActivateStepOut(frames_it.frame());
1489 } 1442 }
1490 } else if (!(is_inline_cache_stub || RelocInfo::IsConstructCall(it.rmode()) || 1443 } else if (!(is_inline_cache_stub || RelocInfo::IsConstructCall(it.rmode()) ||
1491 !call_function_stub.is_null() || is_at_restarted_function) 1444 !call_function_stub.is_null() || is_at_restarted_function)
1492 || step_action == StepNext || step_action == StepMin) { 1445 || step_action == StepNext || step_action == StepMin) {
1493 // Step next or step min. 1446 // Step next or step min.
1494 1447
1495 // Fill the current function with one-shot break points. 1448 // Fill the current function with one-shot break points.
1496 FloodWithOneShot(function); 1449 FloodWithOneShot(shared);
1497 1450
1498 // Remember source position and frame to handle step next. 1451 // Remember source position and frame to handle step next.
1499 thread_local_.last_statement_position_ = 1452 thread_local_.last_statement_position_ =
1500 debug_info->code()->SourceStatementPosition(frame->pc()); 1453 debug_info->code()->SourceStatementPosition(frame->pc());
1501 thread_local_.last_fp_ = frame->UnpaddedFP(); 1454 thread_local_.last_fp_ = frame->UnpaddedFP();
1502 } else { 1455 } else {
1503 // If there's restarter frame on top of the stack, just get the pointer 1456 // If there's restarter frame on top of the stack, just get the pointer
1504 // to function which is going to be restarted. 1457 // to function which is going to be restarted.
1505 if (is_at_restarted_function) { 1458 if (is_at_restarted_function) {
1506 Handle<JSFunction> restarted_function( 1459 Handle<JSFunction> restarted_function(
1507 JSFunction::cast(*thread_local_.restarter_frame_function_pointer_)); 1460 JSFunction::cast(*thread_local_.restarter_frame_function_pointer_));
1508 FloodWithOneShot(restarted_function); 1461 Handle<SharedFunctionInfo> restarted_shared(
1462 restarted_function->shared());
1463 FloodWithOneShot(restarted_shared);
1509 } else if (!call_function_stub.is_null()) { 1464 } else if (!call_function_stub.is_null()) {
1510 // If it's CallFunction stub ensure target function is compiled and flood 1465 // If it's CallFunction stub ensure target function is compiled and flood
1511 // it with one shot breakpoints. 1466 // it with one shot breakpoints.
1512 1467
1513 // Find out number of arguments from the stub minor key. 1468 // Find out number of arguments from the stub minor key.
1514 // Reverse lookup required as the minor key cannot be retrieved 1469 // Reverse lookup required as the minor key cannot be retrieved
1515 // from the code object. 1470 // from the code object.
1516 Handle<Object> obj( 1471 Handle<Object> obj(
1517 isolate_->heap()->code_stubs()->SlowReverseLookup( 1472 isolate_->heap()->code_stubs()->SlowReverseLookup(
1518 *call_function_stub)); 1473 *call_function_stub));
(...skipping 21 matching lines...) Expand all
1540 ASSERT(expressions_count - 2 - call_function_arg_count >= 0); 1495 ASSERT(expressions_count - 2 - call_function_arg_count >= 0);
1541 Object* fun = frame->GetExpression( 1496 Object* fun = frame->GetExpression(
1542 expressions_count - 2 - call_function_arg_count); 1497 expressions_count - 2 - call_function_arg_count);
1543 if (fun->IsJSFunction()) { 1498 if (fun->IsJSFunction()) {
1544 Handle<JSFunction> js_function(JSFunction::cast(fun)); 1499 Handle<JSFunction> js_function(JSFunction::cast(fun));
1545 if (js_function->shared()->bound()) { 1500 if (js_function->shared()->bound()) {
1546 Debug::FloodBoundFunctionWithOneShot(js_function); 1501 Debug::FloodBoundFunctionWithOneShot(js_function);
1547 } else if (!js_function->IsBuiltin()) { 1502 } else if (!js_function->IsBuiltin()) {
1548 // Don't step into builtins. 1503 // Don't step into builtins.
1549 // It will also compile target function if it's not compiled yet. 1504 // It will also compile target function if it's not compiled yet.
1550 FloodWithOneShot(js_function); 1505 FloodWithOneShot(Handle<SharedFunctionInfo>(js_function->shared()));
1551 } 1506 }
1552 } 1507 }
1553 } 1508 }
1554 1509
1555 // Fill the current function with one-shot break points even for step in on 1510 // Fill the current function with one-shot break points even for step in on
1556 // a call target as the function called might be a native function for 1511 // a call target as the function called might be a native function for
1557 // which step in will not stop. It also prepares for stepping in 1512 // which step in will not stop. It also prepares for stepping in
1558 // getters/setters. 1513 // getters/setters.
1559 FloodWithOneShot(function); 1514 FloodWithOneShot(shared);
1560 1515
1561 if (is_load_or_store) { 1516 if (is_load_or_store) {
1562 // Remember source position and frame to handle step in getter/setter. If 1517 // Remember source position and frame to handle step in getter/setter. If
1563 // there is a custom getter/setter it will be handled in 1518 // there is a custom getter/setter it will be handled in
1564 // Object::Get/SetPropertyWithCallback, otherwise the step action will be 1519 // Object::Get/SetPropertyWithCallback, otherwise the step action will be
1565 // propagated on the next Debug::Break. 1520 // propagated on the next Debug::Break.
1566 thread_local_.last_statement_position_ = 1521 thread_local_.last_statement_position_ =
1567 debug_info->code()->SourceStatementPosition(frame->pc()); 1522 debug_info->code()->SourceStatementPosition(frame->pc());
1568 thread_local_.last_fp_ = frame->UnpaddedFP(); 1523 thread_local_.last_fp_ = frame->UnpaddedFP();
1569 } 1524 }
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
1749 if (function->shared()->code() == 1704 if (function->shared()->code() ==
1750 Isolate::Current()->builtins()->builtin(Builtins::kFunctionApply) || 1705 Isolate::Current()->builtins()->builtin(Builtins::kFunctionApply) ||
1751 function->shared()->code() == 1706 function->shared()->code() ==
1752 Isolate::Current()->builtins()->builtin(Builtins::kFunctionCall)) { 1707 Isolate::Current()->builtins()->builtin(Builtins::kFunctionCall)) {
1753 // Handle function.apply and function.call separately to flood the 1708 // Handle function.apply and function.call separately to flood the
1754 // function to be called and not the code for Builtins::FunctionApply or 1709 // function to be called and not the code for Builtins::FunctionApply or
1755 // Builtins::FunctionCall. The receiver of call/apply is the target 1710 // Builtins::FunctionCall. The receiver of call/apply is the target
1756 // function. 1711 // function.
1757 if (!holder.is_null() && holder->IsJSFunction() && 1712 if (!holder.is_null() && holder->IsJSFunction() &&
1758 !JSFunction::cast(*holder)->IsBuiltin()) { 1713 !JSFunction::cast(*holder)->IsBuiltin()) {
1759 Handle<JSFunction> js_function = Handle<JSFunction>::cast(holder); 1714 Handle<SharedFunctionInfo> shared_info(
1760 Debug::FloodWithOneShot(js_function); 1715 JSFunction::cast(*holder)->shared());
1716 Debug::FloodWithOneShot(shared_info);
1761 } 1717 }
1762 } else { 1718 } else {
1763 Debug::FloodWithOneShot(function); 1719 Debug::FloodWithOneShot(Handle<SharedFunctionInfo>(function->shared()));
1764 } 1720 }
1765 } 1721 }
1766 } 1722 }
1767 } 1723 }
1768 1724
1769 1725
1770 void Debug::ClearStepping() { 1726 void Debug::ClearStepping() {
1771 // Clear the various stepping setup. 1727 // Clear the various stepping setup.
1772 ClearOneShot(); 1728 ClearOneShot();
1773 ClearStepIn(); 1729 ClearStepIn();
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1993 1949
1994 void Debug::PrepareForBreakPoints() { 1950 void Debug::PrepareForBreakPoints() {
1995 // If preparing for the first break point make sure to deoptimize all 1951 // If preparing for the first break point make sure to deoptimize all
1996 // functions as debugging does not work with optimized code. 1952 // functions as debugging does not work with optimized code.
1997 if (!has_break_points_) { 1953 if (!has_break_points_) {
1998 Deoptimizer::DeoptimizeAll(); 1954 Deoptimizer::DeoptimizeAll();
1999 1955
2000 Handle<Code> lazy_compile = 1956 Handle<Code> lazy_compile =
2001 Handle<Code>(isolate_->builtins()->builtin(Builtins::kLazyCompile)); 1957 Handle<Code>(isolate_->builtins()->builtin(Builtins::kLazyCompile));
2002 1958
2003 // There will be at least one break point when we are done.
2004 has_break_points_ = true;
2005
2006 // Keep the list of activated functions in a handlified list as it 1959 // Keep the list of activated functions in a handlified list as it
2007 // is used both in GC and non-GC code. 1960 // is used both in GC and non-GC code.
2008 List<Handle<JSFunction> > active_functions(100); 1961 List<Handle<JSFunction> > active_functions(100);
2009 1962
2010 { 1963 {
2011 // We are going to iterate heap to find all functions without 1964 // We are going to iterate heap to find all functions without
2012 // debug break slots. 1965 // debug break slots.
2013 isolate_->heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask, 1966 isolate_->heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask,
2014 "preparing for breakpoints"); 1967 "preparing for breakpoints");
2015 1968
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
2103 isolate_->thread_local_top()); 2056 isolate_->thread_local_top());
2104 2057
2105 ActiveFunctionsRedirector active_functions_redirector; 2058 ActiveFunctionsRedirector active_functions_redirector;
2106 isolate_->thread_manager()->IterateArchivedThreads( 2059 isolate_->thread_manager()->IterateArchivedThreads(
2107 &active_functions_redirector); 2060 &active_functions_redirector);
2108 } 2061 }
2109 } 2062 }
2110 2063
2111 2064
2112 // Ensures the debug information is present for shared. 2065 // Ensures the debug information is present for shared.
2113 bool Debug::EnsureDebugInfo(Handle<SharedFunctionInfo> shared, 2066 bool Debug::EnsureDebugInfo(Handle<SharedFunctionInfo> shared) {
2114 Handle<JSFunction> function) {
2115 // Return if we already have the debug info for shared. 2067 // Return if we already have the debug info for shared.
2116 if (HasDebugInfo(shared)) { 2068 if (HasDebugInfo(shared)) {
2117 ASSERT(shared->is_compiled()); 2069 ASSERT(shared->is_compiled());
2118 return true; 2070 return true;
2119 } 2071 }
2120 2072
2121 // There will be at least one break point when we are done. 2073 // Ensure shared in compiled. Return false if this failed.
2122 has_break_points_ = true; 2074 if (!SharedFunctionInfo::EnsureCompiled(shared, CLEAR_EXCEPTION)) {
2123
2124 // Ensure function is compiled. Return false if this failed.
2125 if (!function.is_null() &&
2126 !JSFunction::EnsureCompiled(function, CLEAR_EXCEPTION)) {
2127 return false; 2075 return false;
2128 } 2076 }
2129 2077
2130 // Create the debug info object. 2078 // Create the debug info object.
2131 Handle<DebugInfo> debug_info = FACTORY->NewDebugInfo(shared); 2079 Handle<DebugInfo> debug_info = FACTORY->NewDebugInfo(shared);
2132 2080
2133 // Add debug info to the list. 2081 // Add debug info to the list.
2134 DebugInfoListNode* node = new DebugInfoListNode(*debug_info); 2082 DebugInfoListNode* node = new DebugInfoListNode(*debug_info);
2135 node->set_next(debug_info_list_); 2083 node->set_next(debug_info_list_);
2136 debug_info_list_ = node; 2084 debug_info_list_ = node;
2137 2085
2086 // Now there is at least one break point.
2087 has_break_points_ = true;
2088
2138 return true; 2089 return true;
2139 } 2090 }
2140 2091
2141 2092
2142 void Debug::RemoveDebugInfo(Handle<DebugInfo> debug_info) { 2093 void Debug::RemoveDebugInfo(Handle<DebugInfo> debug_info) {
2143 ASSERT(debug_info_list_ != NULL); 2094 ASSERT(debug_info_list_ != NULL);
2144 // Run through the debug info objects to find this one and remove it. 2095 // Run through the debug info objects to find this one and remove it.
2145 DebugInfoListNode* prev = NULL; 2096 DebugInfoListNode* prev = NULL;
2146 DebugInfoListNode* current = debug_info_list_; 2097 DebugInfoListNode* current = debug_info_list_;
2147 while (current != NULL) { 2098 while (current != NULL) {
(...skipping 21 matching lines...) Expand all
2169 UNREACHABLE(); 2120 UNREACHABLE();
2170 } 2121 }
2171 2122
2172 2123
2173 void Debug::SetAfterBreakTarget(JavaScriptFrame* frame) { 2124 void Debug::SetAfterBreakTarget(JavaScriptFrame* frame) {
2174 HandleScope scope(isolate_); 2125 HandleScope scope(isolate_);
2175 2126
2176 PrepareForBreakPoints(); 2127 PrepareForBreakPoints();
2177 2128
2178 // Get the executing function in which the debug break occurred. 2129 // Get the executing function in which the debug break occurred.
2179 Handle<JSFunction> function(JSFunction::cast(frame->function())); 2130 Handle<SharedFunctionInfo> shared =
2180 Handle<SharedFunctionInfo> shared(function->shared()); 2131 Handle<SharedFunctionInfo>(JSFunction::cast(frame->function())->shared());
2181 if (!EnsureDebugInfo(shared, function)) { 2132 if (!EnsureDebugInfo(shared)) {
2182 // Return if we failed to retrieve the debug info. 2133 // Return if we failed to retrieve the debug info.
2183 return; 2134 return;
2184 } 2135 }
2185 Handle<DebugInfo> debug_info = GetDebugInfo(shared); 2136 Handle<DebugInfo> debug_info = GetDebugInfo(shared);
2186 Handle<Code> code(debug_info->code()); 2137 Handle<Code> code(debug_info->code());
2187 Handle<Code> original_code(debug_info->original_code()); 2138 Handle<Code> original_code(debug_info->original_code());
2188 #ifdef DEBUG 2139 #ifdef DEBUG
2189 // Get the code which is actually executing. 2140 // Get the code which is actually executing.
2190 Handle<Code> frame_code(frame->LookupCode()); 2141 Handle<Code> frame_code(frame->LookupCode());
2191 ASSERT(frame_code.is_identical_to(code)); 2142 ASSERT(frame_code.is_identical_to(code));
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
2261 // If there are no break points this cannot be break at return, as 2212 // If there are no break points this cannot be break at return, as
2262 // the debugger statement and stack guard bebug break cannot be at 2213 // the debugger statement and stack guard bebug break cannot be at
2263 // return. 2214 // return.
2264 if (!has_break_points_) { 2215 if (!has_break_points_) {
2265 return false; 2216 return false;
2266 } 2217 }
2267 2218
2268 PrepareForBreakPoints(); 2219 PrepareForBreakPoints();
2269 2220
2270 // Get the executing function in which the debug break occurred. 2221 // Get the executing function in which the debug break occurred.
2271 Handle<JSFunction> function(JSFunction::cast(frame->function())); 2222 Handle<SharedFunctionInfo> shared =
2272 Handle<SharedFunctionInfo> shared(function->shared()); 2223 Handle<SharedFunctionInfo>(JSFunction::cast(frame->function())->shared());
2273 if (!EnsureDebugInfo(shared, function)) { 2224 if (!EnsureDebugInfo(shared)) {
2274 // Return if we failed to retrieve the debug info. 2225 // Return if we failed to retrieve the debug info.
2275 return false; 2226 return false;
2276 } 2227 }
2277 Handle<DebugInfo> debug_info = GetDebugInfo(shared); 2228 Handle<DebugInfo> debug_info = GetDebugInfo(shared);
2278 Handle<Code> code(debug_info->code()); 2229 Handle<Code> code(debug_info->code());
2279 #ifdef DEBUG 2230 #ifdef DEBUG
2280 // Get the code which is actually executing. 2231 // Get the code which is actually executing.
2281 Handle<Code> frame_code(frame->LookupCode()); 2232 Handle<Code> frame_code(frame->LookupCode());
2282 ASSERT(frame_code.is_identical_to(code)); 2233 ASSERT(frame_code.is_identical_to(code));
2283 #endif 2234 #endif
(...skipping 1386 matching lines...) Expand 10 before | Expand all | Expand 10 after
3670 { 3621 {
3671 Locker locker; 3622 Locker locker;
3672 Isolate::Current()->debugger()->CallMessageDispatchHandler(); 3623 Isolate::Current()->debugger()->CallMessageDispatchHandler();
3673 } 3624 }
3674 } 3625 }
3675 } 3626 }
3676 3627
3677 #endif // ENABLE_DEBUGGER_SUPPORT 3628 #endif // ENABLE_DEBUGGER_SUPPORT
3678 3629
3679 } } // namespace v8::internal 3630 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/debug.h ('k') | src/full-codegen.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698