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

Side by Side Diff: src/debug.cc

Issue 725983002: Classes: Add support for stepping through default constructors (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove stray change Created 6 years, 1 month 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
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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/arguments.h" 8 #include "src/arguments.h"
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 1207 matching lines...) Expand 10 before | Expand all | Expand 10 after
1218 1218
1219 1219
1220 void Debug::FloodBoundFunctionWithOneShot(Handle<JSFunction> function) { 1220 void Debug::FloodBoundFunctionWithOneShot(Handle<JSFunction> function) {
1221 Handle<FixedArray> new_bindings(function->function_bindings()); 1221 Handle<FixedArray> new_bindings(function->function_bindings());
1222 Handle<Object> bindee(new_bindings->get(JSFunction::kBoundFunctionIndex), 1222 Handle<Object> bindee(new_bindings->get(JSFunction::kBoundFunctionIndex),
1223 isolate_); 1223 isolate_);
1224 1224
1225 if (!bindee.is_null() && bindee->IsJSFunction() && 1225 if (!bindee.is_null() && bindee->IsJSFunction() &&
1226 !JSFunction::cast(*bindee)->IsFromNativeScript()) { 1226 !JSFunction::cast(*bindee)->IsFromNativeScript()) {
1227 Handle<JSFunction> bindee_function(JSFunction::cast(*bindee)); 1227 Handle<JSFunction> bindee_function(JSFunction::cast(*bindee));
1228 FloodWithOneShot(bindee_function); 1228 if (bindee_function->shared()->is_default_constructor()) {
1229 FloodDefaultConstructorWithOneShot(bindee_function);
1230 } else {
1231 FloodWithOneShot(bindee_function);
1232 }
1229 } 1233 }
1230 } 1234 }
1231 1235
1236
1237 void Debug::FloodDefaultConstructorWithOneShot(Handle<JSFunction> function) {
1238 DCHECK(function->shared()->is_default_constructor());
1239 // Instead of stepping into the function we directly step into the super class
1240 // constructor.
1241 Isolate* isolate = function->GetIsolate();
1242 PrototypeIterator iter(isolate, function);
1243 Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
1244 if (!proto->IsJSFunction()) return; // Object.prototype
1245 Handle<JSFunction> function_proto = Handle<JSFunction>::cast(proto);
1246
1247 if (function_proto->shared()->bound()) {
aandrey 2014/11/14 19:27:13 this if-else block is repeated several times below
arv (Not doing code reviews) 2014/11/14 22:02:22 Done.
1248 FloodBoundFunctionWithOneShot(function_proto);
1249 } else if (function_proto->shared()->is_default_constructor()) {
1250 FloodDefaultConstructorWithOneShot(function_proto);
1251 } else if (!function_proto->IsFromNativeScript()) {
1252 FloodWithOneShot(function_proto);
1253 }
1254 }
1255
1232 1256
1233 void Debug::FloodHandlerWithOneShot() { 1257 void Debug::FloodHandlerWithOneShot() {
1234 // Iterate through the JavaScript stack looking for handlers. 1258 // Iterate through the JavaScript stack looking for handlers.
1235 StackFrame::Id id = break_frame_id(); 1259 StackFrame::Id id = break_frame_id();
1236 if (id == StackFrame::NO_ID) { 1260 if (id == StackFrame::NO_ID) {
1237 // If there is no JavaScript stack don't do anything. 1261 // If there is no JavaScript stack don't do anything.
1238 return; 1262 return;
1239 } 1263 }
1240 for (JavaScriptFrameIterator it(isolate_, id); !it.done(); it.Advance()) { 1264 for (JavaScriptFrameIterator it(isolate_, id); !it.done(); it.Advance()) {
1241 JavaScriptFrame* frame = it.frame(); 1265 JavaScriptFrame* frame = it.frame();
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
1457 while (fun->IsJSFunction()) { 1481 while (fun->IsJSFunction()) {
1458 Code* code = JSFunction::cast(fun)->shared()->code(); 1482 Code* code = JSFunction::cast(fun)->shared()->code();
1459 if (code != apply && code != call) break; 1483 if (code != apply && code != call) break;
1460 fun = frame->GetExpression( 1484 fun = frame->GetExpression(
1461 expressions_count - 1 - call_function_arg_count); 1485 expressions_count - 1 - call_function_arg_count);
1462 } 1486 }
1463 } 1487 }
1464 1488
1465 if (fun->IsJSFunction()) { 1489 if (fun->IsJSFunction()) {
1466 Handle<JSFunction> js_function(JSFunction::cast(fun)); 1490 Handle<JSFunction> js_function(JSFunction::cast(fun));
1467 if (js_function->shared()->bound()) { 1491 if (js_function->shared()->bound()) {
aandrey 2014/11/14 19:27:13 repeated again
arv (Not doing code reviews) 2014/11/14 22:02:22 Done.
1468 FloodBoundFunctionWithOneShot(js_function); 1492 FloodBoundFunctionWithOneShot(js_function);
1493 } else if (js_function->shared()->is_default_constructor()) {
1494 FloodDefaultConstructorWithOneShot(js_function);
1469 } else if (!js_function->IsFromNativeScript()) { 1495 } else if (!js_function->IsFromNativeScript()) {
1470 // Don't step into builtins. 1496 // Don't step into builtins.
1471 // It will also compile target function if it's not compiled yet. 1497 // It will also compile target function if it's not compiled yet.
1472 FloodWithOneShot(js_function); 1498 FloodWithOneShot(js_function);
1473 } 1499 }
1474 } 1500 }
1475 } 1501 }
1476 1502
1477 // Fill the current function with one-shot break points even for step in on 1503 // Fill the current function with one-shot break points even for step in on
1478 // a call target as the function called might be a native function for 1504 // a call target as the function called might be a native function for
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1605 if (is_constructor) { 1631 if (is_constructor) {
1606 DCHECK(it.frame()->is_construct()); 1632 DCHECK(it.frame()->is_construct());
1607 it.Advance(); 1633 it.Advance();
1608 } 1634 }
1609 fp = it.frame()->fp(); 1635 fp = it.frame()->fp();
1610 } 1636 }
1611 1637
1612 // Flood the function with one-shot break points if it is called from where 1638 // Flood the function with one-shot break points if it is called from where
1613 // step into was requested, or when stepping into a new frame. 1639 // step into was requested, or when stepping into a new frame.
1614 if (fp == thread_local_.step_into_fp_ || step_frame) { 1640 if (fp == thread_local_.step_into_fp_ || step_frame) {
1615 if (function->shared()->bound()) { 1641 if (function->shared()->bound()) {
aandrey 2014/11/14 19:27:13 repeated once more.
arv (Not doing code reviews) 2014/11/14 22:02:22 Done.
1616 // Handle Function.prototype.bind 1642 // Handle Function.prototype.bind
1617 FloodBoundFunctionWithOneShot(function); 1643 FloodBoundFunctionWithOneShot(function);
1644 } else if (function->shared()->is_default_constructor()) {
1645 FloodDefaultConstructorWithOneShot(function);
1618 } else if (!function->IsFromNativeScript()) { 1646 } else if (!function->IsFromNativeScript()) {
1619 // Don't allow step into functions in the native context. 1647 // Don't allow step into functions in the native context.
1620 if (function->shared()->code() == 1648 if (function->shared()->code() ==
aandrey 2014/11/14 19:27:13 maybe the following apply & call checks should be
arv (Not doing code reviews) 2014/11/14 22:02:22 This is the only place where we have the holder.
1621 isolate->builtins()->builtin(Builtins::kFunctionApply) || 1649 isolate->builtins()->builtin(Builtins::kFunctionApply) ||
1622 function->shared()->code() == 1650 function->shared()->code() ==
1623 isolate->builtins()->builtin(Builtins::kFunctionCall)) { 1651 isolate->builtins()->builtin(Builtins::kFunctionCall)) {
1624 // Handle function.apply and function.call separately to flood the 1652 // Handle function.apply and function.call separately to flood the
1625 // function to be called and not the code for Builtins::FunctionApply or 1653 // function to be called and not the code for Builtins::FunctionApply or
1626 // Builtins::FunctionCall. The receiver of call/apply is the target 1654 // Builtins::FunctionCall. The receiver of call/apply is the target
1627 // function. 1655 // function.
1628 if (!holder.is_null() && holder->IsJSFunction()) { 1656 if (!holder.is_null() && holder->IsJSFunction()) {
1629 Handle<JSFunction> js_function = Handle<JSFunction>::cast(holder); 1657 Handle<JSFunction> js_function = Handle<JSFunction>::cast(holder);
1630 if (!js_function->IsFromNativeScript()) { 1658 if (!js_function->IsFromNativeScript()) {
aandrey 2014/11/14 19:27:13 BTW, is this in the correct order?
arv (Not doing code reviews) 2014/11/14 19:36:57 Yeah. This looks wrong.
arv (Not doing code reviews) 2014/11/14 22:02:22 Done.
1631 FloodWithOneShot(js_function); 1659 FloodWithOneShot(js_function);
1632 } else if (js_function->shared()->bound()) { 1660 } else if (js_function->shared()->bound()) {
1633 // Handle Function.prototype.bind 1661 // Handle Function.prototype.bind
1634 FloodBoundFunctionWithOneShot(js_function); 1662 FloodBoundFunctionWithOneShot(js_function);
1663 } else if (js_function->shared()->is_default_constructor()) {
1664 FloodDefaultConstructorWithOneShot(js_function);
1635 } 1665 }
1636 } 1666 }
1637 } else { 1667 } else {
1638 FloodWithOneShot(function); 1668 FloodWithOneShot(function);
1639 } 1669 }
1640 } 1670 }
1641 } 1671 }
1642 } 1672 }
1643 1673
1644 1674
(...skipping 1781 matching lines...) Expand 10 before | Expand all | Expand 10 after
3426 logger_->DebugEvent("Put", message.text()); 3456 logger_->DebugEvent("Put", message.text());
3427 } 3457 }
3428 3458
3429 3459
3430 void LockingCommandMessageQueue::Clear() { 3460 void LockingCommandMessageQueue::Clear() {
3431 base::LockGuard<base::Mutex> lock_guard(&mutex_); 3461 base::LockGuard<base::Mutex> lock_guard(&mutex_);
3432 queue_.Clear(); 3462 queue_.Clear();
3433 } 3463 }
3434 3464
3435 } } // namespace v8::internal 3465 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698