From 87394009b66d1c983faeeeea7b29ae4a35ebc0f0 Mon Sep 17 00:00:00 2001 From: "yangguo@chromium.org" Date: Mon, 28 Apr 2014 11:42:19 +0000 Subject: [PATCH] Ignore debug stepin in optimized code for array builtins. R=dslomov@chromium.org Review URL: https://codereview.chromium.org/251933004 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@21013 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/array.js | 178 ++++++++++++++++---------------------------------------- src/hydrogen.cc | 8 +++ src/runtime.h | 5 +- 3 files changed, 61 insertions(+), 130 deletions(-) diff --git a/src/array.js b/src/array.js index 104fe3f..ab8bb39 100644 --- a/src/array.js +++ b/src/array.js @@ -1147,28 +1147,16 @@ function ArrayFilter(f, receiver) { var result = new $Array(); var accumulator = new InternalArray(); var accumulator_length = 0; - if (%DebugCallbackSupportsStepping(f)) { - for (var i = 0; i < length; i++) { - if (i in array) { - var element = array[i]; - // Prepare break slots for debugger step in. - %DebugPrepareStepInIfStepping(f); - if (%_CallFunction(receiver, element, i, array, f)) { - accumulator[accumulator_length++] = element; - } - } - } - } else { - // This is a duplicate of the previous loop sans debug stepping. - for (var i = 0; i < length; i++) { - if (i in array) { - var element = array[i]; - if (%_CallFunction(receiver, element, i, array, f)) { - accumulator[accumulator_length++] = element; - } + var stepping = %_DebugCallbackSupportsStepping(f); + for (var i = 0; i < length; i++) { + if (i in array) { + var element = array[i]; + // Prepare break slots for debugger step in. + if (stepping) %DebugPrepareStepInIfStepping(f); + if (%_CallFunction(receiver, element, i, array, f)) { + accumulator[accumulator_length++] = element; } } - // End of duplicate. } %MoveArrayContents(accumulator, result); return result; @@ -1192,24 +1180,14 @@ function ArrayForEach(f, receiver) { receiver = ToObject(receiver); } - if (%DebugCallbackSupportsStepping(f)) { - for (var i = 0; i < length; i++) { - if (i in array) { - var element = array[i]; - // Prepare break slots for debugger step in. - %DebugPrepareStepInIfStepping(f); - %_CallFunction(receiver, element, i, array, f); - } - } - } else { - // This is a duplicate of the previous loop sans debug stepping. - for (var i = 0; i < length; i++) { - if (i in array) { - var element = array[i]; - %_CallFunction(receiver, element, i, array, f); - } + var stepping = %_DebugCallbackSupportsStepping(f); + for (var i = 0; i < length; i++) { + if (i in array) { + var element = array[i]; + // Prepare break slots for debugger step in. + if (stepping) %DebugPrepareStepInIfStepping(f); + %_CallFunction(receiver, element, i, array, f); } - // End of duplicate. } } @@ -1233,24 +1211,14 @@ function ArraySome(f, receiver) { receiver = ToObject(receiver); } - if (%DebugCallbackSupportsStepping(f)) { - for (var i = 0; i < length; i++) { - if (i in array) { - var element = array[i]; - // Prepare break slots for debugger step in. - %DebugPrepareStepInIfStepping(f); - if (%_CallFunction(receiver, element, i, array, f)) return true; - } + var stepping = %_DebugCallbackSupportsStepping(f); + for (var i = 0; i < length; i++) { + if (i in array) { + var element = array[i]; + // Prepare break slots for debugger step in. + if (stepping) %DebugPrepareStepInIfStepping(f); + if (%_CallFunction(receiver, element, i, array, f)) return true; } - } else { - // This is a duplicate of the previous loop sans debug stepping. - for (var i = 0; i < length; i++) { - if (i in array) { - var element = array[i]; - if (%_CallFunction(receiver, element, i, array, f)) return true; - } - } - // End of duplicate. } return false; } @@ -1273,24 +1241,14 @@ function ArrayEvery(f, receiver) { receiver = ToObject(receiver); } - if (%DebugCallbackSupportsStepping(f)) { - for (var i = 0; i < length; i++) { - if (i in array) { - var element = array[i]; - // Prepare break slots for debugger step in. - %DebugPrepareStepInIfStepping(f); - if (!%_CallFunction(receiver, element, i, array, f)) return false; - } + var stepping = %_DebugCallbackSupportsStepping(f); + for (var i = 0; i < length; i++) { + if (i in array) { + var element = array[i]; + // Prepare break slots for debugger step in. + if (stepping) %DebugPrepareStepInIfStepping(f); + if (!%_CallFunction(receiver, element, i, array, f)) return false; } - } else { - // This is a duplicate of the previous loop sans debug stepping. - for (var i = 0; i < length; i++) { - if (i in array) { - var element = array[i]; - if (!%_CallFunction(receiver, element, i, array, f)) return false; - } - } - // End of duplicate. } return true; } @@ -1314,24 +1272,14 @@ function ArrayMap(f, receiver) { var result = new $Array(); var accumulator = new InternalArray(length); - if (%DebugCallbackSupportsStepping(f)) { - for (var i = 0; i < length; i++) { - if (i in array) { - var element = array[i]; - // Prepare break slots for debugger step in. - %DebugPrepareStepInIfStepping(f); - accumulator[i] = %_CallFunction(receiver, element, i, array, f); - } + var stepping = %_DebugCallbackSupportsStepping(f); + for (var i = 0; i < length; i++) { + if (i in array) { + var element = array[i]; + // Prepare break slots for debugger step in. + if (stepping) %DebugPrepareStepInIfStepping(f); + accumulator[i] = %_CallFunction(receiver, element, i, array, f); } - } else { - // This is a duplicate of the previous loop sans debug stepping. - for (var i = 0; i < length; i++) { - if (i in array) { - var element = array[i]; - accumulator[i] = %_CallFunction(receiver, element, i, array, f); - } - } - // End of duplicate. } %MoveArrayContents(accumulator, result); return result; @@ -1471,27 +1419,14 @@ function ArrayReduce(callback, current) { } var receiver = %GetDefaultReceiver(callback); - - if (%DebugCallbackSupportsStepping(callback)) { - for (; i < length; i++) { - if (i in array) { - var element = array[i]; - // Prepare break slots for debugger step in. - %DebugPrepareStepInIfStepping(callback); - current = - %_CallFunction(receiver, current, element, i, array, callback); - } + var stepping = %_DebugCallbackSupportsStepping(callback); + for (; i < length; i++) { + if (i in array) { + var element = array[i]; + // Prepare break slots for debugger step in. + if (stepping) %DebugPrepareStepInIfStepping(callback); + current = %_CallFunction(receiver, current, element, i, array, callback); } - } else { - // This is a duplicate of the previous loop sans debug stepping. - for (; i < length; i++) { - if (i in array) { - var element = array[i]; - current = - %_CallFunction(receiver, current, element, i, array, callback); - } - } - // End of duplicate. } return current; } @@ -1521,27 +1456,14 @@ function ArrayReduceRight(callback, current) { } var receiver = %GetDefaultReceiver(callback); - - if (%DebugCallbackSupportsStepping(callback)) { - for (; i >= 0; i--) { - if (i in array) { - var element = array[i]; - // Prepare break slots for debugger step in. - %DebugPrepareStepInIfStepping(callback); - current = - %_CallFunction(receiver, current, element, i, array, callback); - } - } - } else { - // This is a duplicate of the previous loop sans debug stepping. - for (; i >= 0; i--) { - if (i in array) { - var element = array[i]; - current = - %_CallFunction(receiver, current, element, i, array, callback); - } + var stepping = %_DebugCallbackSupportsStepping(callback); + for (; i >= 0; i--) { + if (i in array) { + var element = array[i]; + // Prepare break slots for debugger step in. + if (stepping) %DebugPrepareStepInIfStepping(callback); + current = %_CallFunction(receiver, current, element, i, array, callback); } - // End of duplicate. } return current; } diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 76360c5..a41b80e 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -11055,6 +11055,14 @@ void HOptimizedGraphBuilder::GenerateDebugBreakInOptimizedCode( } +void HOptimizedGraphBuilder::GenerateDebugCallbackSupportsStepping( + CallRuntime* call) { + ASSERT(call->arguments()->length() == 1); + // Debugging is not supported in optimized code. + return ast_context()->ReturnValue(graph()->GetConstantFalse()); +} + + #undef CHECK_BAILOUT #undef CHECK_ALIVE diff --git a/src/runtime.h b/src/runtime.h index 3ce332b..9dca233 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -97,7 +97,6 @@ namespace internal { F(SetNativeFlag, 1, 1) \ F(SetInlineBuiltinFlag, 1, 1) \ F(StoreArrayLiteralElement, 5, 1) \ - F(DebugCallbackSupportsStepping, 1, 1) \ F(DebugPrepareStepInIfStepping, 1, 1) \ F(DebugPendingExceptionInPromise, 2, 1) \ F(FlattenString, 1, 1) \ @@ -707,7 +706,9 @@ namespace internal { F(DoubleHi, 1, 1) \ F(DoubleLo, 1, 1) \ F(MathSqrt, 1, 1) \ - F(MathLog, 1, 1) + F(MathLog, 1, 1) \ + /* Debugger */ \ + F(DebugCallbackSupportsStepping, 1, 1) //--------------------------------------------------------------------------- -- 2.7.4