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/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
6 | 6 |
7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
8 #include "src/debug/debug-evaluate.h" | 8 #include "src/debug/debug-evaluate.h" |
9 #include "src/debug/debug-frames.h" | 9 #include "src/debug/debug-frames.h" |
10 #include "src/debug/debug-scopes.h" | 10 #include "src/debug/debug-scopes.h" |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 return factory->NewJSArrayWithElements(result); | 306 return factory->NewJSArrayWithElements(result); |
307 } | 307 } |
308 return factory->NewJSArray(0); | 308 return factory->NewJSArray(0); |
309 } | 309 } |
310 | 310 |
311 | 311 |
312 RUNTIME_FUNCTION(Runtime_DebugGetInternalProperties) { | 312 RUNTIME_FUNCTION(Runtime_DebugGetInternalProperties) { |
313 HandleScope scope(isolate); | 313 HandleScope scope(isolate); |
314 DCHECK(args.length() == 1); | 314 DCHECK(args.length() == 1); |
315 CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0); | 315 CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0); |
316 Handle<JSArray> result; | 316 RETURN_RESULT_OR_FAILURE(isolate, |
317 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 317 Runtime::GetInternalProperties(isolate, obj)); |
318 isolate, result, Runtime::GetInternalProperties(isolate, obj)); | |
319 return *result; | |
320 } | 318 } |
321 | 319 |
322 | 320 |
323 // Get debugger related details for an object property, in the following format: | 321 // Get debugger related details for an object property, in the following format: |
324 // 0: Property value | 322 // 0: Property value |
325 // 1: Property details | 323 // 1: Property details |
326 // 2: Property value is exception | 324 // 2: Property value is exception |
327 // 3: Getter function if defined | 325 // 3: Getter function if defined |
328 // 4: Setter function if defined | 326 // 4: Setter function if defined |
329 // Items 2-4 are only filled if the property has either a getter or a setter. | 327 // Items 2-4 are only filled if the property has either a getter or a setter. |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
757 | 755 |
758 // Find the requested scope. | 756 // Find the requested scope. |
759 int n = 0; | 757 int n = 0; |
760 ScopeIterator it(isolate, &frame_inspector); | 758 ScopeIterator it(isolate, &frame_inspector); |
761 for (; !it.Done() && n < index; it.Next()) { | 759 for (; !it.Done() && n < index; it.Next()) { |
762 n++; | 760 n++; |
763 } | 761 } |
764 if (it.Done()) { | 762 if (it.Done()) { |
765 return isolate->heap()->undefined_value(); | 763 return isolate->heap()->undefined_value(); |
766 } | 764 } |
767 Handle<JSObject> details; | 765 RETURN_RESULT_OR_FAILURE(isolate, it.MaterializeScopeDetails()); |
768 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, details, | |
769 it.MaterializeScopeDetails()); | |
770 return *details; | |
771 } | 766 } |
772 | 767 |
773 | 768 |
774 // Return an array of scope details | 769 // Return an array of scope details |
775 // args[0]: number: break id | 770 // args[0]: number: break id |
776 // args[1]: number: frame index | 771 // args[1]: number: frame index |
777 // args[2]: number: inlined frame index | 772 // args[2]: number: inlined frame index |
778 // args[3]: boolean: ignore nested scopes | 773 // args[3]: boolean: ignore nested scopes |
779 // | 774 // |
780 // The array returned contains arrays with the following information: | 775 // The array returned contains arrays with the following information: |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
849 // Find the requested scope. | 844 // Find the requested scope. |
850 int n = 0; | 845 int n = 0; |
851 ScopeIterator it(isolate, fun); | 846 ScopeIterator it(isolate, fun); |
852 for (; !it.Done() && n < index; it.Next()) { | 847 for (; !it.Done() && n < index; it.Next()) { |
853 n++; | 848 n++; |
854 } | 849 } |
855 if (it.Done()) { | 850 if (it.Done()) { |
856 return isolate->heap()->undefined_value(); | 851 return isolate->heap()->undefined_value(); |
857 } | 852 } |
858 | 853 |
859 Handle<JSObject> details; | 854 RETURN_RESULT_OR_FAILURE(isolate, it.MaterializeScopeDetails()); |
860 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, details, | |
861 it.MaterializeScopeDetails()); | |
862 return *details; | |
863 } | 855 } |
864 | 856 |
865 | 857 |
866 static bool SetScopeVariableValue(ScopeIterator* it, int index, | 858 static bool SetScopeVariableValue(ScopeIterator* it, int index, |
867 Handle<String> variable_name, | 859 Handle<String> variable_name, |
868 Handle<Object> new_value) { | 860 Handle<Object> new_value) { |
869 for (int n = 0; !it->Done() && n < index; it->Next()) { | 861 for (int n = 0; !it->Done() && n < index; it->Next()) { |
870 n++; | 862 n++; |
871 } | 863 } |
872 if (it->Done()) { | 864 if (it->Done()) { |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1134 RUNTIME_ASSERT(isolate->debug()->CheckExecutionState(break_id)); | 1126 RUNTIME_ASSERT(isolate->debug()->CheckExecutionState(break_id)); |
1135 | 1127 |
1136 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); | 1128 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); |
1137 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); | 1129 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); |
1138 CONVERT_ARG_HANDLE_CHECKED(String, source, 3); | 1130 CONVERT_ARG_HANDLE_CHECKED(String, source, 3); |
1139 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 4); | 1131 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 4); |
1140 CONVERT_ARG_HANDLE_CHECKED(HeapObject, context_extension, 5); | 1132 CONVERT_ARG_HANDLE_CHECKED(HeapObject, context_extension, 5); |
1141 | 1133 |
1142 StackFrame::Id id = DebugFrameHelper::UnwrapFrameId(wrapped_id); | 1134 StackFrame::Id id = DebugFrameHelper::UnwrapFrameId(wrapped_id); |
1143 | 1135 |
1144 Handle<Object> result; | 1136 RETURN_RESULT_OR_FAILURE( |
1145 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1137 isolate, DebugEvaluate::Local(isolate, id, inlined_jsframe_index, source, |
1146 isolate, result, | 1138 disable_break, context_extension)); |
1147 DebugEvaluate::Local(isolate, id, inlined_jsframe_index, source, | |
1148 disable_break, context_extension)); | |
1149 return *result; | |
1150 } | 1139 } |
1151 | 1140 |
1152 | 1141 |
1153 RUNTIME_FUNCTION(Runtime_DebugEvaluateGlobal) { | 1142 RUNTIME_FUNCTION(Runtime_DebugEvaluateGlobal) { |
1154 HandleScope scope(isolate); | 1143 HandleScope scope(isolate); |
1155 | 1144 |
1156 // Check the execution state and decode arguments frame and source to be | 1145 // Check the execution state and decode arguments frame and source to be |
1157 // evaluated. | 1146 // evaluated. |
1158 DCHECK(args.length() == 4); | 1147 DCHECK(args.length() == 4); |
1159 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); | 1148 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); |
1160 RUNTIME_ASSERT(isolate->debug()->CheckExecutionState(break_id)); | 1149 RUNTIME_ASSERT(isolate->debug()->CheckExecutionState(break_id)); |
1161 | 1150 |
1162 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); | 1151 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); |
1163 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 2); | 1152 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 2); |
1164 CONVERT_ARG_HANDLE_CHECKED(HeapObject, context_extension, 3); | 1153 CONVERT_ARG_HANDLE_CHECKED(HeapObject, context_extension, 3); |
1165 | 1154 |
1166 Handle<Object> result; | 1155 RETURN_RESULT_OR_FAILURE( |
1167 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1156 isolate, |
1168 isolate, result, | |
1169 DebugEvaluate::Global(isolate, source, disable_break, context_extension)); | 1157 DebugEvaluate::Global(isolate, source, disable_break, context_extension)); |
1170 return *result; | |
1171 } | 1158 } |
1172 | 1159 |
1173 | 1160 |
1174 RUNTIME_FUNCTION(Runtime_DebugGetLoadedScripts) { | 1161 RUNTIME_FUNCTION(Runtime_DebugGetLoadedScripts) { |
1175 HandleScope scope(isolate); | 1162 HandleScope scope(isolate); |
1176 DCHECK(args.length() == 0); | 1163 DCHECK(args.length() == 0); |
1177 RUNTIME_ASSERT(isolate->debug()->is_active()); | 1164 RUNTIME_ASSERT(isolate->debug()->is_active()); |
1178 | 1165 |
1179 Handle<FixedArray> instances; | 1166 Handle<FixedArray> instances; |
1180 { | 1167 { |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1306 return *isolate->factory()->NewJSArrayWithElements(result); | 1293 return *isolate->factory()->NewJSArrayWithElements(result); |
1307 } | 1294 } |
1308 | 1295 |
1309 | 1296 |
1310 // Find the effective prototype object as returned by __proto__. | 1297 // Find the effective prototype object as returned by __proto__. |
1311 // args[0]: the object to find the prototype for. | 1298 // args[0]: the object to find the prototype for. |
1312 RUNTIME_FUNCTION(Runtime_DebugGetPrototype) { | 1299 RUNTIME_FUNCTION(Runtime_DebugGetPrototype) { |
1313 HandleScope shs(isolate); | 1300 HandleScope shs(isolate); |
1314 DCHECK(args.length() == 1); | 1301 DCHECK(args.length() == 1); |
1315 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); | 1302 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
1316 Handle<Object> prototype; | |
1317 // TODO(1543): Come up with a solution for clients to handle potential errors | 1303 // TODO(1543): Come up with a solution for clients to handle potential errors |
1318 // thrown by an intermediate proxy. | 1304 // thrown by an intermediate proxy. |
1319 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, prototype, | 1305 RETURN_RESULT_OR_FAILURE(isolate, JSReceiver::GetPrototype(isolate, obj)); |
1320 JSReceiver::GetPrototype(isolate, obj)); | |
1321 return *prototype; | |
1322 } | 1306 } |
1323 | 1307 |
1324 | 1308 |
1325 // Patches script source (should be called upon BeforeCompile event). | 1309 // Patches script source (should be called upon BeforeCompile event). |
1326 RUNTIME_FUNCTION(Runtime_DebugSetScriptSource) { | 1310 RUNTIME_FUNCTION(Runtime_DebugSetScriptSource) { |
1327 HandleScope scope(isolate); | 1311 HandleScope scope(isolate); |
1328 DCHECK(args.length() == 2); | 1312 DCHECK(args.length() == 2); |
1329 | 1313 |
1330 CONVERT_ARG_HANDLE_CHECKED(JSValue, script_wrapper, 0); | 1314 CONVERT_ARG_HANDLE_CHECKED(JSValue, script_wrapper, 0); |
1331 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); | 1315 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); |
(...skipping 20 matching lines...) Expand all Loading... |
1352 return isolate->heap()->empty_string(); | 1336 return isolate->heap()->empty_string(); |
1353 } | 1337 } |
1354 | 1338 |
1355 | 1339 |
1356 RUNTIME_FUNCTION(Runtime_FunctionGetDebugName) { | 1340 RUNTIME_FUNCTION(Runtime_FunctionGetDebugName) { |
1357 HandleScope scope(isolate); | 1341 HandleScope scope(isolate); |
1358 DCHECK_EQ(1, args.length()); | 1342 DCHECK_EQ(1, args.length()); |
1359 | 1343 |
1360 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, function, 0); | 1344 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, function, 0); |
1361 | 1345 |
1362 Handle<Object> name; | |
1363 if (function->IsJSBoundFunction()) { | 1346 if (function->IsJSBoundFunction()) { |
1364 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1347 RETURN_RESULT_OR_FAILURE( |
1365 isolate, name, JSBoundFunction::GetName( | 1348 isolate, JSBoundFunction::GetName( |
1366 isolate, Handle<JSBoundFunction>::cast(function))); | 1349 isolate, Handle<JSBoundFunction>::cast(function))); |
1367 } else { | 1350 } else { |
1368 name = JSFunction::GetDebugName(Handle<JSFunction>::cast(function)); | 1351 return *JSFunction::GetDebugName(Handle<JSFunction>::cast(function)); |
1369 } | 1352 } |
1370 return *name; | |
1371 } | 1353 } |
1372 | 1354 |
1373 | 1355 |
1374 // A testing entry. Returns statement position which is the closest to | 1356 // A testing entry. Returns statement position which is the closest to |
1375 // source_position. | 1357 // source_position. |
1376 RUNTIME_FUNCTION(Runtime_GetFunctionCodePositionFromSource) { | 1358 RUNTIME_FUNCTION(Runtime_GetFunctionCodePositionFromSource) { |
1377 HandleScope scope(isolate); | 1359 HandleScope scope(isolate); |
1378 CHECK(isolate->debug()->live_edit_enabled()); | 1360 CHECK(isolate->debug()->live_edit_enabled()); |
1379 DCHECK(args.length() == 2); | 1361 DCHECK(args.length() == 2); |
1380 RUNTIME_ASSERT(isolate->debug()->is_active()); | 1362 RUNTIME_ASSERT(isolate->debug()->is_active()); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1416 HandleScope scope(isolate); | 1398 HandleScope scope(isolate); |
1417 DCHECK(args.length() == 1); | 1399 DCHECK(args.length() == 1); |
1418 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 1400 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
1419 | 1401 |
1420 DebugScope debug_scope(isolate->debug()); | 1402 DebugScope debug_scope(isolate->debug()); |
1421 if (debug_scope.failed()) { | 1403 if (debug_scope.failed()) { |
1422 DCHECK(isolate->has_pending_exception()); | 1404 DCHECK(isolate->has_pending_exception()); |
1423 return isolate->heap()->exception(); | 1405 return isolate->heap()->exception(); |
1424 } | 1406 } |
1425 | 1407 |
1426 Handle<Object> result; | 1408 RETURN_RESULT_OR_FAILURE( |
1427 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1409 isolate, Execution::Call(isolate, function, |
1428 isolate, result, | 1410 handle(function->global_proxy()), 0, NULL)); |
1429 Execution::Call(isolate, function, handle(function->global_proxy()), 0, | |
1430 NULL)); | |
1431 return *result; | |
1432 } | 1411 } |
1433 | 1412 |
1434 | 1413 |
1435 RUNTIME_FUNCTION(Runtime_GetDebugContext) { | 1414 RUNTIME_FUNCTION(Runtime_GetDebugContext) { |
1436 HandleScope scope(isolate); | 1415 HandleScope scope(isolate); |
1437 DCHECK(args.length() == 0); | 1416 DCHECK(args.length() == 0); |
1438 Handle<Context> context; | 1417 Handle<Context> context; |
1439 { | 1418 { |
1440 DebugScope debug_scope(isolate->debug()); | 1419 DebugScope debug_scope(isolate->debug()); |
1441 if (debug_scope.failed()) { | 1420 if (debug_scope.failed()) { |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1647 return Smi::FromInt(isolate->debug()->is_active()); | 1626 return Smi::FromInt(isolate->debug()->is_active()); |
1648 } | 1627 } |
1649 | 1628 |
1650 | 1629 |
1651 RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) { | 1630 RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) { |
1652 UNIMPLEMENTED(); | 1631 UNIMPLEMENTED(); |
1653 return NULL; | 1632 return NULL; |
1654 } | 1633 } |
1655 } // namespace internal | 1634 } // namespace internal |
1656 } // namespace v8 | 1635 } // namespace v8 |
OLD | NEW |