Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index d8da56ced5a4bc7c9f6e9b2f23226f3f5e1bc155..60779388443b3003ee4a52371cad344e1501c5ac 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -4696,6 +4696,36 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreArrayLiteralElement) { |
} |
+// Check whether debugger and is about to step into the callback that is passed |
+// to a built-in function such as Array.forEach. |
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugStepIntoBuiltinCallback) { |
+ if (!isolate->IsDebuggerActive()) return isolate->heap()->false_value(); |
+ CONVERT_ARG_CHECKED(Object, callback, 0); |
+ // We do not step into the callback if it's a builtin or not even a function. |
+ if (!callback->IsJSFunction() || JSFunction::cast(callback)->IsBuiltin()) { |
+ return isolate->heap()->false_value(); |
+ } |
+ return isolate->heap()->true_value(); |
+} |
+ |
+ |
+// Set break slots for the callback function that is passed to a buil-tin |
Søren Gjesse
2012/04/20 08:33:25
"break slots" -> "one shot breakpoints"
Yang
2012/04/20 11:06:54
Done.
|
+// function such as Array.forEach to enables stepping into callback functions. |
+RUNTIME_FUNCTION(MaybeObject*, Runtime_PrepareBreakSlotsForCallback) { |
+ Debug* debug = isolate->debug(); |
+ if (!debug->IsStepping()) return NULL; |
+ CONVERT_ARG_CHECKED(Object, callback, 0); |
+ HandleScope scope(isolate); |
+ Handle<SharedFunctionInfo> shared_info(JSFunction::cast(callback)->shared()); |
+ // When leaving the callback, step out has been activated, but not performed |
+ // if we do not leave the builtin. To be able to step into the callback |
+ // again, we need to clear the step out at this point. |
+ debug->ClearStepOut(); |
+ debug->FloodWithOneShot(shared_info); |
+ return NULL; |
+} |
+ |
+ |
// Set a local property, even if it is READ_ONLY. If the property does not |
// exist, it will be added with attributes NONE. |
RUNTIME_FUNCTION(MaybeObject*, Runtime_IgnoreAttributesAndSetProperty) { |