| OLD | NEW | 
|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/accessors.h" | 7 #include "src/accessors.h" | 
| 8 #include "src/arguments.h" | 8 #include "src/arguments.h" | 
| 9 #include "src/compiler.h" | 9 #include "src/compiler.h" | 
| 10 #include "src/debug.h" | 10 #include "src/debug.h" | 
| (...skipping 2165 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2176 | 2176 | 
| 2177 | 2177 | 
| 2178 static bool IsPositionAlignmentCodeCorrect(int alignment) { | 2178 static bool IsPositionAlignmentCodeCorrect(int alignment) { | 
| 2179   return alignment == STATEMENT_ALIGNED || alignment == BREAK_POSITION_ALIGNED; | 2179   return alignment == STATEMENT_ALIGNED || alignment == BREAK_POSITION_ALIGNED; | 
| 2180 } | 2180 } | 
| 2181 | 2181 | 
| 2182 | 2182 | 
| 2183 RUNTIME_FUNCTION(Runtime_GetBreakLocations) { | 2183 RUNTIME_FUNCTION(Runtime_GetBreakLocations) { | 
| 2184   HandleScope scope(isolate); | 2184   HandleScope scope(isolate); | 
| 2185   DCHECK(args.length() == 2); | 2185   DCHECK(args.length() == 2); | 
| 2186 | 2186   RUNTIME_ASSERT(isolate->debug()->is_active()); | 
| 2187   CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); | 2187   CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); | 
| 2188   CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[1]); | 2188   CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[1]); | 
| 2189 | 2189 | 
| 2190   if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) { | 2190   if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) { | 
| 2191     return isolate->ThrowIllegalOperation(); | 2191     return isolate->ThrowIllegalOperation(); | 
| 2192   } | 2192   } | 
| 2193   BreakPositionAlignment alignment = | 2193   BreakPositionAlignment alignment = | 
| 2194       static_cast<BreakPositionAlignment>(statement_aligned_code); | 2194       static_cast<BreakPositionAlignment>(statement_aligned_code); | 
| 2195 | 2195 | 
| 2196   Handle<SharedFunctionInfo> shared(fun->shared()); | 2196   Handle<SharedFunctionInfo> shared(fun->shared()); | 
| 2197   // Find the number of break points | 2197   // Find the number of break points | 
| 2198   Handle<Object> break_locations = | 2198   Handle<Object> break_locations = | 
| 2199       Debug::GetSourceBreakLocations(shared, alignment); | 2199       Debug::GetSourceBreakLocations(shared, alignment); | 
| 2200   if (break_locations->IsUndefined()) return isolate->heap()->undefined_value(); | 2200   if (break_locations->IsUndefined()) return isolate->heap()->undefined_value(); | 
| 2201   // Return array as JS array | 2201   // Return array as JS array | 
| 2202   return *isolate->factory()->NewJSArrayWithElements( | 2202   return *isolate->factory()->NewJSArrayWithElements( | 
| 2203       Handle<FixedArray>::cast(break_locations)); | 2203       Handle<FixedArray>::cast(break_locations)); | 
| 2204 } | 2204 } | 
| 2205 | 2205 | 
| 2206 | 2206 | 
| 2207 // Set a break point in a function. | 2207 // Set a break point in a function. | 
| 2208 // args[0]: function | 2208 // args[0]: function | 
| 2209 // args[1]: number: break source position (within the function source) | 2209 // args[1]: number: break source position (within the function source) | 
| 2210 // args[2]: number: break point object | 2210 // args[2]: number: break point object | 
| 2211 RUNTIME_FUNCTION(Runtime_SetFunctionBreakPoint) { | 2211 RUNTIME_FUNCTION(Runtime_SetFunctionBreakPoint) { | 
| 2212   HandleScope scope(isolate); | 2212   HandleScope scope(isolate); | 
| 2213   DCHECK(args.length() == 3); | 2213   DCHECK(args.length() == 3); | 
|  | 2214   RUNTIME_ASSERT(isolate->debug()->is_active()); | 
| 2214   CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 2215   CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 
| 2215   CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); | 2216   CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); | 
| 2216   RUNTIME_ASSERT(source_position >= function->shared()->start_position() && | 2217   RUNTIME_ASSERT(source_position >= function->shared()->start_position() && | 
| 2217                  source_position <= function->shared()->end_position()); | 2218                  source_position <= function->shared()->end_position()); | 
| 2218   CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 2); | 2219   CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 2); | 
| 2219 | 2220 | 
| 2220   // Set break point. | 2221   // Set break point. | 
| 2221   RUNTIME_ASSERT(isolate->debug()->SetBreakPoint( | 2222   RUNTIME_ASSERT(isolate->debug()->SetBreakPoint( | 
| 2222       function, break_point_object_arg, &source_position)); | 2223       function, break_point_object_arg, &source_position)); | 
| 2223 | 2224 | 
| 2224   return Smi::FromInt(source_position); | 2225   return Smi::FromInt(source_position); | 
| 2225 } | 2226 } | 
| 2226 | 2227 | 
| 2227 | 2228 | 
| 2228 // Changes the state of a break point in a script and returns source position | 2229 // Changes the state of a break point in a script and returns source position | 
| 2229 // where break point was set. NOTE: Regarding performance see the NOTE for | 2230 // where break point was set. NOTE: Regarding performance see the NOTE for | 
| 2230 // GetScriptFromScriptData. | 2231 // GetScriptFromScriptData. | 
| 2231 // args[0]: script to set break point in | 2232 // args[0]: script to set break point in | 
| 2232 // args[1]: number: break source position (within the script source) | 2233 // args[1]: number: break source position (within the script source) | 
| 2233 // args[2]: number, breakpoint position alignment | 2234 // args[2]: number, breakpoint position alignment | 
| 2234 // args[3]: number: break point object | 2235 // args[3]: number: break point object | 
| 2235 RUNTIME_FUNCTION(Runtime_SetScriptBreakPoint) { | 2236 RUNTIME_FUNCTION(Runtime_SetScriptBreakPoint) { | 
| 2236   HandleScope scope(isolate); | 2237   HandleScope scope(isolate); | 
| 2237   DCHECK(args.length() == 4); | 2238   DCHECK(args.length() == 4); | 
|  | 2239   RUNTIME_ASSERT(isolate->debug()->is_active()); | 
| 2238   CONVERT_ARG_HANDLE_CHECKED(JSValue, wrapper, 0); | 2240   CONVERT_ARG_HANDLE_CHECKED(JSValue, wrapper, 0); | 
| 2239   CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); | 2241   CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); | 
| 2240   RUNTIME_ASSERT(source_position >= 0); | 2242   RUNTIME_ASSERT(source_position >= 0); | 
| 2241   CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[2]); | 2243   CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[2]); | 
| 2242   CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 3); | 2244   CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 3); | 
| 2243 | 2245 | 
| 2244   if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) { | 2246   if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) { | 
| 2245     return isolate->ThrowIllegalOperation(); | 2247     return isolate->ThrowIllegalOperation(); | 
| 2246   } | 2248   } | 
| 2247   BreakPositionAlignment alignment = | 2249   BreakPositionAlignment alignment = | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 2259 | 2261 | 
| 2260   return Smi::FromInt(source_position); | 2262   return Smi::FromInt(source_position); | 
| 2261 } | 2263 } | 
| 2262 | 2264 | 
| 2263 | 2265 | 
| 2264 // Clear a break point | 2266 // Clear a break point | 
| 2265 // args[0]: number: break point object | 2267 // args[0]: number: break point object | 
| 2266 RUNTIME_FUNCTION(Runtime_ClearBreakPoint) { | 2268 RUNTIME_FUNCTION(Runtime_ClearBreakPoint) { | 
| 2267   HandleScope scope(isolate); | 2269   HandleScope scope(isolate); | 
| 2268   DCHECK(args.length() == 1); | 2270   DCHECK(args.length() == 1); | 
|  | 2271   RUNTIME_ASSERT(isolate->debug()->is_active()); | 
| 2269   CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 0); | 2272   CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 0); | 
| 2270 | 2273 | 
| 2271   // Clear break point. | 2274   // Clear break point. | 
| 2272   isolate->debug()->ClearBreakPoint(break_point_object_arg); | 2275   isolate->debug()->ClearBreakPoint(break_point_object_arg); | 
| 2273 | 2276 | 
| 2274   return isolate->heap()->undefined_value(); | 2277   return isolate->heap()->undefined_value(); | 
| 2275 } | 2278 } | 
| 2276 | 2279 | 
| 2277 | 2280 | 
| 2278 // Change the state of break on exceptions. | 2281 // Change the state of break on exceptions. | 
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2356   isolate->debug()->PrepareStep(static_cast<StepAction>(step_action), | 2359   isolate->debug()->PrepareStep(static_cast<StepAction>(step_action), | 
| 2357                                 step_count, frame_id); | 2360                                 step_count, frame_id); | 
| 2358   return isolate->heap()->undefined_value(); | 2361   return isolate->heap()->undefined_value(); | 
| 2359 } | 2362 } | 
| 2360 | 2363 | 
| 2361 | 2364 | 
| 2362 // Clear all stepping set by PrepareStep. | 2365 // Clear all stepping set by PrepareStep. | 
| 2363 RUNTIME_FUNCTION(Runtime_ClearStepping) { | 2366 RUNTIME_FUNCTION(Runtime_ClearStepping) { | 
| 2364   HandleScope scope(isolate); | 2367   HandleScope scope(isolate); | 
| 2365   DCHECK(args.length() == 0); | 2368   DCHECK(args.length() == 0); | 
|  | 2369   RUNTIME_ASSERT(isolate->debug()->is_active()); | 
| 2366   isolate->debug()->ClearStepping(); | 2370   isolate->debug()->ClearStepping(); | 
| 2367   return isolate->heap()->undefined_value(); | 2371   return isolate->heap()->undefined_value(); | 
| 2368 } | 2372 } | 
| 2369 | 2373 | 
| 2370 | 2374 | 
| 2371 // Helper function to find or create the arguments object for | 2375 // Helper function to find or create the arguments object for | 
| 2372 // Runtime_DebugEvaluate. | 2376 // Runtime_DebugEvaluate. | 
| 2373 static void MaterializeArgumentsObject(Isolate* isolate, | 2377 static void MaterializeArgumentsObject(Isolate* isolate, | 
| 2374                                        Handle<JSObject> target, | 2378                                        Handle<JSObject> target, | 
| 2375                                        Handle<JSFunction> function) { | 2379                                        Handle<JSFunction> function) { | 
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2702   ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2706   ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 
| 2703       isolate, result, DebugEvaluate(isolate, outer_info, context, | 2707       isolate, result, DebugEvaluate(isolate, outer_info, context, | 
| 2704                                      context_extension, receiver, source)); | 2708                                      context_extension, receiver, source)); | 
| 2705   return *result; | 2709   return *result; | 
| 2706 } | 2710 } | 
| 2707 | 2711 | 
| 2708 | 2712 | 
| 2709 RUNTIME_FUNCTION(Runtime_DebugGetLoadedScripts) { | 2713 RUNTIME_FUNCTION(Runtime_DebugGetLoadedScripts) { | 
| 2710   HandleScope scope(isolate); | 2714   HandleScope scope(isolate); | 
| 2711   DCHECK(args.length() == 0); | 2715   DCHECK(args.length() == 0); | 
|  | 2716   RUNTIME_ASSERT(isolate->debug()->is_active()); | 
| 2712 | 2717 | 
| 2713   Handle<FixedArray> instances; | 2718   Handle<FixedArray> instances; | 
| 2714   { | 2719   { | 
| 2715     DebugScope debug_scope(isolate->debug()); | 2720     DebugScope debug_scope(isolate->debug()); | 
| 2716     if (debug_scope.failed()) { | 2721     if (debug_scope.failed()) { | 
| 2717       DCHECK(isolate->has_pending_exception()); | 2722       DCHECK(isolate->has_pending_exception()); | 
| 2718       return isolate->heap()->exception(); | 2723       return isolate->heap()->exception(); | 
| 2719     } | 2724     } | 
| 2720     // Fill the script objects. | 2725     // Fill the script objects. | 
| 2721     instances = isolate->debug()->GetLoadedScripts(); | 2726     instances = isolate->debug()->GetLoadedScripts(); | 
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2969   return f->shared()->inferred_name(); | 2974   return f->shared()->inferred_name(); | 
| 2970 } | 2975 } | 
| 2971 | 2976 | 
| 2972 | 2977 | 
| 2973 // A testing entry. Returns statement position which is the closest to | 2978 // A testing entry. Returns statement position which is the closest to | 
| 2974 // source_position. | 2979 // source_position. | 
| 2975 RUNTIME_FUNCTION(Runtime_GetFunctionCodePositionFromSource) { | 2980 RUNTIME_FUNCTION(Runtime_GetFunctionCodePositionFromSource) { | 
| 2976   HandleScope scope(isolate); | 2981   HandleScope scope(isolate); | 
| 2977   CHECK(isolate->debug()->live_edit_enabled()); | 2982   CHECK(isolate->debug()->live_edit_enabled()); | 
| 2978   DCHECK(args.length() == 2); | 2983   DCHECK(args.length() == 2); | 
|  | 2984   RUNTIME_ASSERT(isolate->debug()->is_active()); | 
| 2979   CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 2985   CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 
| 2980   CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); | 2986   CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); | 
| 2981 | 2987 | 
| 2982   Handle<Code> code(function->code(), isolate); | 2988   Handle<Code> code(function->code(), isolate); | 
| 2983 | 2989 | 
| 2984   if (code->kind() != Code::FUNCTION && | 2990   if (code->kind() != Code::FUNCTION && | 
| 2985       code->kind() != Code::OPTIMIZED_FUNCTION) { | 2991       code->kind() != Code::OPTIMIZED_FUNCTION) { | 
| 2986     return isolate->heap()->undefined_value(); | 2992     return isolate->heap()->undefined_value(); | 
| 2987   } | 2993   } | 
| 2988 | 2994 | 
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3110       callback->IsJSFunction() && | 3116       callback->IsJSFunction() && | 
| 3111       (!JSFunction::cast(callback)->IsBuiltin() || | 3117       (!JSFunction::cast(callback)->IsBuiltin() || | 
| 3112        JSFunction::cast(callback)->shared()->bound())); | 3118        JSFunction::cast(callback)->shared()->bound())); | 
| 3113 } | 3119 } | 
| 3114 | 3120 | 
| 3115 | 3121 | 
| 3116 // Set one shot breakpoints for the callback function that is passed to a | 3122 // Set one shot breakpoints for the callback function that is passed to a | 
| 3117 // built-in function such as Array.forEach to enable stepping into the callback. | 3123 // built-in function such as Array.forEach to enable stepping into the callback. | 
| 3118 RUNTIME_FUNCTION(Runtime_DebugPrepareStepInIfStepping) { | 3124 RUNTIME_FUNCTION(Runtime_DebugPrepareStepInIfStepping) { | 
| 3119   DCHECK(args.length() == 1); | 3125   DCHECK(args.length() == 1); | 
|  | 3126   RUNTIME_ASSERT(isolate->debug()->is_active()); | 
|  | 3127 | 
| 3120   Debug* debug = isolate->debug(); | 3128   Debug* debug = isolate->debug(); | 
| 3121   if (!debug->IsStepping()) return isolate->heap()->undefined_value(); | 3129   if (!debug->IsStepping()) return isolate->heap()->undefined_value(); | 
| 3122 | 3130 | 
| 3123   HandleScope scope(isolate); | 3131   HandleScope scope(isolate); | 
| 3124   CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); | 3132   CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); | 
| 3125   RUNTIME_ASSERT(object->IsJSFunction() || object->IsJSGeneratorObject()); | 3133   RUNTIME_ASSERT(object->IsJSFunction() || object->IsJSGeneratorObject()); | 
| 3126   Handle<JSFunction> fun; | 3134   Handle<JSFunction> fun; | 
| 3127   if (object->IsJSFunction()) { | 3135   if (object->IsJSFunction()) { | 
| 3128     fun = Handle<JSFunction>::cast(object); | 3136     fun = Handle<JSFunction>::cast(object); | 
| 3129   } else { | 3137   } else { | 
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3180   return Smi::FromInt(isolate->debug()->is_active()); | 3188   return Smi::FromInt(isolate->debug()->is_active()); | 
| 3181 } | 3189 } | 
| 3182 | 3190 | 
| 3183 | 3191 | 
| 3184 RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) { | 3192 RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) { | 
| 3185   UNIMPLEMENTED(); | 3193   UNIMPLEMENTED(); | 
| 3186   return NULL; | 3194   return NULL; | 
| 3187 } | 3195 } | 
| 3188 }  // namespace internal | 3196 }  // namespace internal | 
| 3189 }  // namespace v8 | 3197 }  // namespace v8 | 
| OLD | NEW | 
|---|