| 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" |
| 11 #include "src/debug/debug.h" | 11 #include "src/debug/debug.h" |
| 12 #include "src/debug/liveedit.h" | 12 #include "src/debug/liveedit.h" |
| 13 #include "src/frames-inl.h" | 13 #include "src/frames-inl.h" |
| 14 #include "src/globals.h" | 14 #include "src/globals.h" |
| 15 #include "src/interpreter/bytecodes.h" | 15 #include "src/interpreter/bytecodes.h" |
| 16 #include "src/interpreter/interpreter.h" | 16 #include "src/interpreter/interpreter.h" |
| 17 #include "src/isolate-inl.h" | 17 #include "src/isolate-inl.h" |
| 18 #include "src/runtime/runtime.h" | 18 #include "src/runtime/runtime.h" |
| 19 #include "src/wasm/wasm-module.h" | 19 #include "src/wasm/wasm-module.h" |
| 20 #include "src/wasm/wasm-objects.h" | 20 #include "src/wasm/wasm-objects.h" |
| 21 | 21 |
| 22 namespace v8 { | 22 namespace v8 { |
| 23 namespace internal { | 23 namespace internal { |
| 24 | 24 |
| 25 RUNTIME_FUNCTION(Runtime_DebugBreak) { | 25 RUNTIME_FUNCTION(Runtime_DebugBreak) { |
| 26 SealHandleScope shs(isolate); | 26 SealHandleScope shs(isolate); |
| 27 DCHECK(args.length() == 1); | 27 DCHECK_EQ(1, args.length()); |
| 28 CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); | 28 CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); |
| 29 isolate->debug()->set_return_value(value); | 29 isolate->debug()->set_return_value(value); |
| 30 | 30 |
| 31 // Get the top-most JavaScript frame. | 31 // Get the top-most JavaScript frame. |
| 32 JavaScriptFrameIterator it(isolate); | 32 JavaScriptFrameIterator it(isolate); |
| 33 isolate->debug()->Break(it.frame()); | 33 isolate->debug()->Break(it.frame()); |
| 34 | 34 |
| 35 isolate->debug()->SetAfterBreakTarget(it.frame()); | 35 isolate->debug()->SetAfterBreakTarget(it.frame()); |
| 36 return *isolate->debug()->return_value(); | 36 return *isolate->debug()->return_value(); |
| 37 } | 37 } |
| 38 | 38 |
| 39 RUNTIME_FUNCTION(Runtime_DebugBreakOnBytecode) { | 39 RUNTIME_FUNCTION(Runtime_DebugBreakOnBytecode) { |
| 40 SealHandleScope shs(isolate); | 40 SealHandleScope shs(isolate); |
| 41 DCHECK(args.length() == 1); | 41 DCHECK_EQ(1, args.length()); |
| 42 CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); | 42 CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); |
| 43 isolate->debug()->set_return_value(value); | 43 isolate->debug()->set_return_value(value); |
| 44 | 44 |
| 45 // Get the top-most JavaScript frame. | 45 // Get the top-most JavaScript frame. |
| 46 JavaScriptFrameIterator it(isolate); | 46 JavaScriptFrameIterator it(isolate); |
| 47 isolate->debug()->Break(it.frame()); | 47 isolate->debug()->Break(it.frame()); |
| 48 | 48 |
| 49 // If live-edit has dropped frames, we are not going back to dispatch. | 49 // If live-edit has dropped frames, we are not going back to dispatch. |
| 50 if (LiveEdit::SetAfterBreakTarget(isolate->debug())) return Smi::kZero; | 50 if (LiveEdit::SetAfterBreakTarget(isolate->debug())) return Smi::kZero; |
| 51 | 51 |
| 52 // Return the handler from the original bytecode array. | 52 // Return the handler from the original bytecode array. |
| 53 DCHECK(it.frame()->is_interpreted()); | 53 DCHECK(it.frame()->is_interpreted()); |
| 54 InterpretedFrame* interpreted_frame = | 54 InterpretedFrame* interpreted_frame = |
| 55 reinterpret_cast<InterpretedFrame*>(it.frame()); | 55 reinterpret_cast<InterpretedFrame*>(it.frame()); |
| 56 SharedFunctionInfo* shared = interpreted_frame->function()->shared(); | 56 SharedFunctionInfo* shared = interpreted_frame->function()->shared(); |
| 57 BytecodeArray* bytecode_array = shared->bytecode_array(); | 57 BytecodeArray* bytecode_array = shared->bytecode_array(); |
| 58 int bytecode_offset = interpreted_frame->GetBytecodeOffset(); | 58 int bytecode_offset = interpreted_frame->GetBytecodeOffset(); |
| 59 interpreter::Bytecode bytecode = | 59 interpreter::Bytecode bytecode = |
| 60 interpreter::Bytecodes::FromByte(bytecode_array->get(bytecode_offset)); | 60 interpreter::Bytecodes::FromByte(bytecode_array->get(bytecode_offset)); |
| 61 return isolate->interpreter()->GetBytecodeHandler( | 61 return isolate->interpreter()->GetBytecodeHandler( |
| 62 bytecode, interpreter::OperandScale::kSingle); | 62 bytecode, interpreter::OperandScale::kSingle); |
| 63 } | 63 } |
| 64 | 64 |
| 65 | 65 |
| 66 RUNTIME_FUNCTION(Runtime_HandleDebuggerStatement) { | 66 RUNTIME_FUNCTION(Runtime_HandleDebuggerStatement) { |
| 67 SealHandleScope shs(isolate); | 67 SealHandleScope shs(isolate); |
| 68 DCHECK(args.length() == 0); | 68 DCHECK_EQ(0, args.length()); |
| 69 if (isolate->debug()->break_points_active()) { | 69 if (isolate->debug()->break_points_active()) { |
| 70 isolate->debug()->HandleDebugBreak(); | 70 isolate->debug()->HandleDebugBreak(); |
| 71 } | 71 } |
| 72 return isolate->heap()->undefined_value(); | 72 return isolate->heap()->undefined_value(); |
| 73 } | 73 } |
| 74 | 74 |
| 75 | 75 |
| 76 // Adds a JavaScript function as a debug event listener. | 76 // Adds a JavaScript function as a debug event listener. |
| 77 // args[0]: debug event listener function to set or null or undefined for | 77 // args[0]: debug event listener function to set or null or undefined for |
| 78 // clearing the event listener function | 78 // clearing the event listener function |
| 79 // args[1]: object supplied during callback | 79 // args[1]: object supplied during callback |
| 80 RUNTIME_FUNCTION(Runtime_SetDebugEventListener) { | 80 RUNTIME_FUNCTION(Runtime_SetDebugEventListener) { |
| 81 SealHandleScope shs(isolate); | 81 SealHandleScope shs(isolate); |
| 82 DCHECK(args.length() == 2); | 82 DCHECK_EQ(2, args.length()); |
| 83 CHECK(args[0]->IsJSFunction() || args[0]->IsUndefined(isolate) || | 83 CHECK(args[0]->IsJSFunction() || args[0]->IsUndefined(isolate) || |
| 84 args[0]->IsNull(isolate)); | 84 args[0]->IsNull(isolate)); |
| 85 CONVERT_ARG_HANDLE_CHECKED(Object, callback, 0); | 85 CONVERT_ARG_HANDLE_CHECKED(Object, callback, 0); |
| 86 CONVERT_ARG_HANDLE_CHECKED(Object, data, 1); | 86 CONVERT_ARG_HANDLE_CHECKED(Object, data, 1); |
| 87 isolate->debug()->SetEventListener(callback, data); | 87 isolate->debug()->SetEventListener(callback, data); |
| 88 | 88 |
| 89 return isolate->heap()->undefined_value(); | 89 return isolate->heap()->undefined_value(); |
| 90 } | 90 } |
| 91 | 91 |
| 92 | 92 |
| 93 RUNTIME_FUNCTION(Runtime_ScheduleBreak) { | 93 RUNTIME_FUNCTION(Runtime_ScheduleBreak) { |
| 94 SealHandleScope shs(isolate); | 94 SealHandleScope shs(isolate); |
| 95 DCHECK(args.length() == 0); | 95 DCHECK_EQ(0, args.length()); |
| 96 isolate->stack_guard()->RequestDebugBreak(); | 96 isolate->stack_guard()->RequestDebugBreak(); |
| 97 return isolate->heap()->undefined_value(); | 97 return isolate->heap()->undefined_value(); |
| 98 } | 98 } |
| 99 | 99 |
| 100 | 100 |
| 101 static Handle<Object> DebugGetProperty(LookupIterator* it, | 101 static Handle<Object> DebugGetProperty(LookupIterator* it, |
| 102 bool* has_caught = NULL) { | 102 bool* has_caught = NULL) { |
| 103 for (; it->IsFound(); it->Next()) { | 103 for (; it->IsFound(); it->Next()) { |
| 104 switch (it->state()) { | 104 switch (it->state()) { |
| 105 case LookupIterator::NOT_FOUND: | 105 case LookupIterator::NOT_FOUND: |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 result->set(0, *primitive_value); | 283 result->set(0, *primitive_value); |
| 284 result->set(1, js_value->value()); | 284 result->set(1, js_value->value()); |
| 285 return factory->NewJSArrayWithElements(result); | 285 return factory->NewJSArrayWithElements(result); |
| 286 } | 286 } |
| 287 return factory->NewJSArray(0); | 287 return factory->NewJSArray(0); |
| 288 } | 288 } |
| 289 | 289 |
| 290 | 290 |
| 291 RUNTIME_FUNCTION(Runtime_DebugGetInternalProperties) { | 291 RUNTIME_FUNCTION(Runtime_DebugGetInternalProperties) { |
| 292 HandleScope scope(isolate); | 292 HandleScope scope(isolate); |
| 293 DCHECK(args.length() == 1); | 293 DCHECK_EQ(1, args.length()); |
| 294 CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0); | 294 CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0); |
| 295 RETURN_RESULT_OR_FAILURE(isolate, | 295 RETURN_RESULT_OR_FAILURE(isolate, |
| 296 Runtime::GetInternalProperties(isolate, obj)); | 296 Runtime::GetInternalProperties(isolate, obj)); |
| 297 } | 297 } |
| 298 | 298 |
| 299 | 299 |
| 300 // Get debugger related details for an object property, in the following format: | 300 // Get debugger related details for an object property, in the following format: |
| 301 // 0: Property value | 301 // 0: Property value |
| 302 // 1: Property details | 302 // 1: Property details |
| 303 // 2: Property value is exception | 303 // 2: Property value is exception |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 details->set(5, *setter); | 375 details->set(5, *setter); |
| 376 } | 376 } |
| 377 | 377 |
| 378 return *isolate->factory()->NewJSArrayWithElements(details); | 378 return *isolate->factory()->NewJSArrayWithElements(details); |
| 379 } | 379 } |
| 380 | 380 |
| 381 | 381 |
| 382 RUNTIME_FUNCTION(Runtime_DebugGetProperty) { | 382 RUNTIME_FUNCTION(Runtime_DebugGetProperty) { |
| 383 HandleScope scope(isolate); | 383 HandleScope scope(isolate); |
| 384 | 384 |
| 385 DCHECK(args.length() == 2); | 385 DCHECK_EQ(2, args.length()); |
| 386 | 386 |
| 387 CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0); | 387 CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0); |
| 388 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); | 388 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
| 389 | 389 |
| 390 LookupIterator it(obj, name); | 390 LookupIterator it(obj, name); |
| 391 return *DebugGetProperty(&it); | 391 return *DebugGetProperty(&it); |
| 392 } | 392 } |
| 393 | 393 |
| 394 | 394 |
| 395 // Return the property type calculated from the property details. | 395 // Return the property type calculated from the property details. |
| 396 // args[0]: smi with property details. | 396 // args[0]: smi with property details. |
| 397 RUNTIME_FUNCTION(Runtime_DebugPropertyTypeFromDetails) { | 397 RUNTIME_FUNCTION(Runtime_DebugPropertyTypeFromDetails) { |
| 398 SealHandleScope shs(isolate); | 398 SealHandleScope shs(isolate); |
| 399 DCHECK(args.length() == 1); | 399 DCHECK_EQ(1, args.length()); |
| 400 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0); | 400 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0); |
| 401 return Smi::FromInt(static_cast<int>(details.type())); | 401 return Smi::FromInt(static_cast<int>(details.type())); |
| 402 } | 402 } |
| 403 | 403 |
| 404 | 404 |
| 405 // Return the property attribute calculated from the property details. | 405 // Return the property attribute calculated from the property details. |
| 406 // args[0]: smi with property details. | 406 // args[0]: smi with property details. |
| 407 RUNTIME_FUNCTION(Runtime_DebugPropertyAttributesFromDetails) { | 407 RUNTIME_FUNCTION(Runtime_DebugPropertyAttributesFromDetails) { |
| 408 SealHandleScope shs(isolate); | 408 SealHandleScope shs(isolate); |
| 409 DCHECK(args.length() == 1); | 409 DCHECK_EQ(1, args.length()); |
| 410 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0); | 410 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0); |
| 411 return Smi::FromInt(static_cast<int>(details.attributes())); | 411 return Smi::FromInt(static_cast<int>(details.attributes())); |
| 412 } | 412 } |
| 413 | 413 |
| 414 | 414 |
| 415 RUNTIME_FUNCTION(Runtime_CheckExecutionState) { | 415 RUNTIME_FUNCTION(Runtime_CheckExecutionState) { |
| 416 SealHandleScope shs(isolate); | 416 SealHandleScope shs(isolate); |
| 417 DCHECK(args.length() == 1); | 417 DCHECK_EQ(1, args.length()); |
| 418 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); | 418 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); |
| 419 CHECK(isolate->debug()->CheckExecutionState(break_id)); | 419 CHECK(isolate->debug()->CheckExecutionState(break_id)); |
| 420 return isolate->heap()->true_value(); | 420 return isolate->heap()->true_value(); |
| 421 } | 421 } |
| 422 | 422 |
| 423 | 423 |
| 424 RUNTIME_FUNCTION(Runtime_GetFrameCount) { | 424 RUNTIME_FUNCTION(Runtime_GetFrameCount) { |
| 425 HandleScope scope(isolate); | 425 HandleScope scope(isolate); |
| 426 DCHECK(args.length() == 1); | 426 DCHECK_EQ(1, args.length()); |
| 427 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); | 427 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); |
| 428 CHECK(isolate->debug()->CheckExecutionState(break_id)); | 428 CHECK(isolate->debug()->CheckExecutionState(break_id)); |
| 429 | 429 |
| 430 // Count all frames which are relevant to debugging stack trace. | 430 // Count all frames which are relevant to debugging stack trace. |
| 431 int n = 0; | 431 int n = 0; |
| 432 StackFrame::Id id = isolate->debug()->break_frame_id(); | 432 StackFrame::Id id = isolate->debug()->break_frame_id(); |
| 433 if (id == StackFrame::NO_ID) { | 433 if (id == StackFrame::NO_ID) { |
| 434 // If there is no JavaScript stack frame count is 0. | 434 // If there is no JavaScript stack frame count is 0. |
| 435 return Smi::kZero; | 435 return Smi::kZero; |
| 436 } | 436 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 // 5: Local count | 476 // 5: Local count |
| 477 // 6: Source position | 477 // 6: Source position |
| 478 // 7: Constructor call | 478 // 7: Constructor call |
| 479 // 8: Is at return | 479 // 8: Is at return |
| 480 // 9: Flags | 480 // 9: Flags |
| 481 // Arguments name, value | 481 // Arguments name, value |
| 482 // Locals name, value | 482 // Locals name, value |
| 483 // Return value if any | 483 // Return value if any |
| 484 RUNTIME_FUNCTION(Runtime_GetFrameDetails) { | 484 RUNTIME_FUNCTION(Runtime_GetFrameDetails) { |
| 485 HandleScope scope(isolate); | 485 HandleScope scope(isolate); |
| 486 DCHECK(args.length() == 2); | 486 DCHECK_EQ(2, args.length()); |
| 487 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); | 487 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); |
| 488 CHECK(isolate->debug()->CheckExecutionState(break_id)); | 488 CHECK(isolate->debug()->CheckExecutionState(break_id)); |
| 489 | 489 |
| 490 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); | 490 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); |
| 491 Heap* heap = isolate->heap(); | 491 Heap* heap = isolate->heap(); |
| 492 | 492 |
| 493 // Find the relevant frame with the requested index. | 493 // Find the relevant frame with the requested index. |
| 494 StackFrame::Id id = isolate->debug()->break_frame_id(); | 494 StackFrame::Id id = isolate->debug()->break_frame_id(); |
| 495 if (id == StackFrame::NO_ID) { | 495 if (id == StackFrame::NO_ID) { |
| 496 // If there are no JavaScript stack frames return undefined. | 496 // If there are no JavaScript stack frames return undefined. |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 757 DCHECK_IMPLIES(is_sloppy(shared->language_mode()), receiver->IsJSReceiver()); | 757 DCHECK_IMPLIES(is_sloppy(shared->language_mode()), receiver->IsJSReceiver()); |
| 758 details->set(kFrameDetailsReceiverIndex, *receiver); | 758 details->set(kFrameDetailsReceiverIndex, *receiver); |
| 759 | 759 |
| 760 DCHECK_EQ(details_size, details_index); | 760 DCHECK_EQ(details_size, details_index); |
| 761 return *isolate->factory()->NewJSArrayWithElements(details); | 761 return *isolate->factory()->NewJSArrayWithElements(details); |
| 762 } | 762 } |
| 763 | 763 |
| 764 | 764 |
| 765 RUNTIME_FUNCTION(Runtime_GetScopeCount) { | 765 RUNTIME_FUNCTION(Runtime_GetScopeCount) { |
| 766 HandleScope scope(isolate); | 766 HandleScope scope(isolate); |
| 767 DCHECK(args.length() == 2); | 767 DCHECK_EQ(2, args.length()); |
| 768 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); | 768 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); |
| 769 CHECK(isolate->debug()->CheckExecutionState(break_id)); | 769 CHECK(isolate->debug()->CheckExecutionState(break_id)); |
| 770 | 770 |
| 771 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); | 771 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); |
| 772 | 772 |
| 773 // Get the frame where the debugging is performed. | 773 // Get the frame where the debugging is performed. |
| 774 StackFrame::Id id = DebugFrameHelper::UnwrapFrameId(wrapped_id); | 774 StackFrame::Id id = DebugFrameHelper::UnwrapFrameId(wrapped_id); |
| 775 JavaScriptFrameIterator it(isolate, id); | 775 JavaScriptFrameIterator it(isolate, id); |
| 776 JavaScriptFrame* frame = it.frame(); | 776 JavaScriptFrame* frame = it.frame(); |
| 777 FrameInspector frame_inspector(frame, 0, isolate); | 777 FrameInspector frame_inspector(frame, 0, isolate); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 790 // args[0]: number: break id | 790 // args[0]: number: break id |
| 791 // args[1]: number: frame index | 791 // args[1]: number: frame index |
| 792 // args[2]: number: inlined frame index | 792 // args[2]: number: inlined frame index |
| 793 // args[3]: number: scope index | 793 // args[3]: number: scope index |
| 794 // | 794 // |
| 795 // The array returned contains the following information: | 795 // The array returned contains the following information: |
| 796 // 0: Scope type | 796 // 0: Scope type |
| 797 // 1: Scope object | 797 // 1: Scope object |
| 798 RUNTIME_FUNCTION(Runtime_GetScopeDetails) { | 798 RUNTIME_FUNCTION(Runtime_GetScopeDetails) { |
| 799 HandleScope scope(isolate); | 799 HandleScope scope(isolate); |
| 800 DCHECK(args.length() == 4); | 800 DCHECK_EQ(4, args.length()); |
| 801 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); | 801 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); |
| 802 CHECK(isolate->debug()->CheckExecutionState(break_id)); | 802 CHECK(isolate->debug()->CheckExecutionState(break_id)); |
| 803 | 803 |
| 804 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); | 804 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); |
| 805 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); | 805 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); |
| 806 CONVERT_NUMBER_CHECKED(int, index, Int32, args[3]); | 806 CONVERT_NUMBER_CHECKED(int, index, Int32, args[3]); |
| 807 | 807 |
| 808 // Get the frame where the debugging is performed. | 808 // Get the frame where the debugging is performed. |
| 809 StackFrame::Id id = DebugFrameHelper::UnwrapFrameId(wrapped_id); | 809 StackFrame::Id id = DebugFrameHelper::UnwrapFrameId(wrapped_id); |
| 810 JavaScriptFrameIterator frame_it(isolate, id); | 810 JavaScriptFrameIterator frame_it(isolate, id); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 886 n++; | 886 n++; |
| 887 } | 887 } |
| 888 } | 888 } |
| 889 | 889 |
| 890 return Smi::FromInt(n); | 890 return Smi::FromInt(n); |
| 891 } | 891 } |
| 892 | 892 |
| 893 | 893 |
| 894 RUNTIME_FUNCTION(Runtime_GetFunctionScopeDetails) { | 894 RUNTIME_FUNCTION(Runtime_GetFunctionScopeDetails) { |
| 895 HandleScope scope(isolate); | 895 HandleScope scope(isolate); |
| 896 DCHECK(args.length() == 2); | 896 DCHECK_EQ(2, args.length()); |
| 897 | 897 |
| 898 // Check arguments. | 898 // Check arguments. |
| 899 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); | 899 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); |
| 900 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); | 900 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); |
| 901 | 901 |
| 902 // Find the requested scope. | 902 // Find the requested scope. |
| 903 int n = 0; | 903 int n = 0; |
| 904 ScopeIterator it(isolate, fun); | 904 ScopeIterator it(isolate, fun); |
| 905 for (; !it.Done() && n < index; it.Next()) { | 905 for (; !it.Done() && n < index; it.Next()) { |
| 906 n++; | 906 n++; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 925 int n = 0; | 925 int n = 0; |
| 926 for (ScopeIterator it(isolate, gen); !it.Done(); it.Next()) { | 926 for (ScopeIterator it(isolate, gen); !it.Done(); it.Next()) { |
| 927 n++; | 927 n++; |
| 928 } | 928 } |
| 929 | 929 |
| 930 return Smi::FromInt(n); | 930 return Smi::FromInt(n); |
| 931 } | 931 } |
| 932 | 932 |
| 933 RUNTIME_FUNCTION(Runtime_GetGeneratorScopeDetails) { | 933 RUNTIME_FUNCTION(Runtime_GetGeneratorScopeDetails) { |
| 934 HandleScope scope(isolate); | 934 HandleScope scope(isolate); |
| 935 DCHECK(args.length() == 2); | 935 DCHECK_EQ(2, args.length()); |
| 936 | 936 |
| 937 if (!args[0]->IsJSGeneratorObject()) { | 937 if (!args[0]->IsJSGeneratorObject()) { |
| 938 return isolate->heap()->undefined_value(); | 938 return isolate->heap()->undefined_value(); |
| 939 } | 939 } |
| 940 | 940 |
| 941 // Check arguments. | 941 // Check arguments. |
| 942 CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, gen, 0); | 942 CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, gen, 0); |
| 943 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); | 943 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); |
| 944 | 944 |
| 945 // Find the requested scope. | 945 // Find the requested scope. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 972 // args[0]: number or JsFunction: break id or function | 972 // args[0]: number or JsFunction: break id or function |
| 973 // args[1]: number: frame index (when arg[0] is break id) | 973 // args[1]: number: frame index (when arg[0] is break id) |
| 974 // args[2]: number: inlined frame index (when arg[0] is break id) | 974 // args[2]: number: inlined frame index (when arg[0] is break id) |
| 975 // args[3]: number: scope index | 975 // args[3]: number: scope index |
| 976 // args[4]: string: variable name | 976 // args[4]: string: variable name |
| 977 // args[5]: object: new value | 977 // args[5]: object: new value |
| 978 // | 978 // |
| 979 // Return true if success and false otherwise | 979 // Return true if success and false otherwise |
| 980 RUNTIME_FUNCTION(Runtime_SetScopeVariableValue) { | 980 RUNTIME_FUNCTION(Runtime_SetScopeVariableValue) { |
| 981 HandleScope scope(isolate); | 981 HandleScope scope(isolate); |
| 982 DCHECK(args.length() == 6); | 982 DCHECK_EQ(6, args.length()); |
| 983 | 983 |
| 984 // Check arguments. | 984 // Check arguments. |
| 985 CONVERT_NUMBER_CHECKED(int, index, Int32, args[3]); | 985 CONVERT_NUMBER_CHECKED(int, index, Int32, args[3]); |
| 986 CONVERT_ARG_HANDLE_CHECKED(String, variable_name, 4); | 986 CONVERT_ARG_HANDLE_CHECKED(String, variable_name, 4); |
| 987 CONVERT_ARG_HANDLE_CHECKED(Object, new_value, 5); | 987 CONVERT_ARG_HANDLE_CHECKED(Object, new_value, 5); |
| 988 | 988 |
| 989 bool res; | 989 bool res; |
| 990 if (args[0]->IsNumber()) { | 990 if (args[0]->IsNumber()) { |
| 991 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); | 991 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); |
| 992 CHECK(isolate->debug()->CheckExecutionState(break_id)); | 992 CHECK(isolate->debug()->CheckExecutionState(break_id)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1011 ScopeIterator it(isolate, gen); | 1011 ScopeIterator it(isolate, gen); |
| 1012 res = SetScopeVariableValue(&it, index, variable_name, new_value); | 1012 res = SetScopeVariableValue(&it, index, variable_name, new_value); |
| 1013 } | 1013 } |
| 1014 | 1014 |
| 1015 return isolate->heap()->ToBoolean(res); | 1015 return isolate->heap()->ToBoolean(res); |
| 1016 } | 1016 } |
| 1017 | 1017 |
| 1018 | 1018 |
| 1019 RUNTIME_FUNCTION(Runtime_DebugPrintScopes) { | 1019 RUNTIME_FUNCTION(Runtime_DebugPrintScopes) { |
| 1020 HandleScope scope(isolate); | 1020 HandleScope scope(isolate); |
| 1021 DCHECK(args.length() == 0); | 1021 DCHECK_EQ(0, args.length()); |
| 1022 | 1022 |
| 1023 #ifdef DEBUG | 1023 #ifdef DEBUG |
| 1024 // Print the scopes for the top frame. | 1024 // Print the scopes for the top frame. |
| 1025 StackFrameLocator locator(isolate); | 1025 StackFrameLocator locator(isolate); |
| 1026 JavaScriptFrame* frame = locator.FindJavaScriptFrame(0); | 1026 JavaScriptFrame* frame = locator.FindJavaScriptFrame(0); |
| 1027 FrameInspector frame_inspector(frame, 0, isolate); | 1027 FrameInspector frame_inspector(frame, 0, isolate); |
| 1028 | 1028 |
| 1029 for (ScopeIterator it(isolate, &frame_inspector); !it.Done(); it.Next()) { | 1029 for (ScopeIterator it(isolate, &frame_inspector); !it.Done(); it.Next()) { |
| 1030 it.DebugPrint(); | 1030 it.DebugPrint(); |
| 1031 } | 1031 } |
| 1032 #endif | 1032 #endif |
| 1033 return isolate->heap()->undefined_value(); | 1033 return isolate->heap()->undefined_value(); |
| 1034 } | 1034 } |
| 1035 | 1035 |
| 1036 | 1036 |
| 1037 // Sets the disable break state | 1037 // Sets the disable break state |
| 1038 // args[0]: disable break state | 1038 // args[0]: disable break state |
| 1039 RUNTIME_FUNCTION(Runtime_SetBreakPointsActive) { | 1039 RUNTIME_FUNCTION(Runtime_SetBreakPointsActive) { |
| 1040 HandleScope scope(isolate); | 1040 HandleScope scope(isolate); |
| 1041 DCHECK(args.length() == 1); | 1041 DCHECK_EQ(1, args.length()); |
| 1042 CONVERT_BOOLEAN_ARG_CHECKED(active, 0); | 1042 CONVERT_BOOLEAN_ARG_CHECKED(active, 0); |
| 1043 isolate->debug()->set_break_points_active(active); | 1043 isolate->debug()->set_break_points_active(active); |
| 1044 return isolate->heap()->undefined_value(); | 1044 return isolate->heap()->undefined_value(); |
| 1045 } | 1045 } |
| 1046 | 1046 |
| 1047 | 1047 |
| 1048 static bool IsPositionAlignmentCodeCorrect(int alignment) { | 1048 static bool IsPositionAlignmentCodeCorrect(int alignment) { |
| 1049 return alignment == STATEMENT_ALIGNED || alignment == BREAK_POSITION_ALIGNED; | 1049 return alignment == STATEMENT_ALIGNED || alignment == BREAK_POSITION_ALIGNED; |
| 1050 } | 1050 } |
| 1051 | 1051 |
| 1052 | 1052 |
| 1053 RUNTIME_FUNCTION(Runtime_GetBreakLocations) { | 1053 RUNTIME_FUNCTION(Runtime_GetBreakLocations) { |
| 1054 HandleScope scope(isolate); | 1054 HandleScope scope(isolate); |
| 1055 DCHECK(args.length() == 2); | 1055 DCHECK_EQ(2, args.length()); |
| 1056 CHECK(isolate->debug()->is_active()); | 1056 CHECK(isolate->debug()->is_active()); |
| 1057 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); | 1057 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); |
| 1058 CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[1]); | 1058 CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[1]); |
| 1059 | 1059 |
| 1060 if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) { | 1060 if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) { |
| 1061 return isolate->ThrowIllegalOperation(); | 1061 return isolate->ThrowIllegalOperation(); |
| 1062 } | 1062 } |
| 1063 BreakPositionAlignment alignment = | 1063 BreakPositionAlignment alignment = |
| 1064 static_cast<BreakPositionAlignment>(statement_aligned_code); | 1064 static_cast<BreakPositionAlignment>(statement_aligned_code); |
| 1065 | 1065 |
| 1066 Handle<SharedFunctionInfo> shared(fun->shared()); | 1066 Handle<SharedFunctionInfo> shared(fun->shared()); |
| 1067 // Find the number of break points | 1067 // Find the number of break points |
| 1068 Handle<Object> break_locations = | 1068 Handle<Object> break_locations = |
| 1069 Debug::GetSourceBreakLocations(shared, alignment); | 1069 Debug::GetSourceBreakLocations(shared, alignment); |
| 1070 if (break_locations->IsUndefined(isolate)) { | 1070 if (break_locations->IsUndefined(isolate)) { |
| 1071 return isolate->heap()->undefined_value(); | 1071 return isolate->heap()->undefined_value(); |
| 1072 } | 1072 } |
| 1073 // Return array as JS array | 1073 // Return array as JS array |
| 1074 return *isolate->factory()->NewJSArrayWithElements( | 1074 return *isolate->factory()->NewJSArrayWithElements( |
| 1075 Handle<FixedArray>::cast(break_locations)); | 1075 Handle<FixedArray>::cast(break_locations)); |
| 1076 } | 1076 } |
| 1077 | 1077 |
| 1078 | 1078 |
| 1079 // Set a break point in a function. | 1079 // Set a break point in a function. |
| 1080 // args[0]: function | 1080 // args[0]: function |
| 1081 // args[1]: number: break source position (within the function source) | 1081 // args[1]: number: break source position (within the function source) |
| 1082 // args[2]: number: break point object | 1082 // args[2]: number: break point object |
| 1083 RUNTIME_FUNCTION(Runtime_SetFunctionBreakPoint) { | 1083 RUNTIME_FUNCTION(Runtime_SetFunctionBreakPoint) { |
| 1084 HandleScope scope(isolate); | 1084 HandleScope scope(isolate); |
| 1085 DCHECK(args.length() == 3); | 1085 DCHECK_EQ(3, args.length()); |
| 1086 CHECK(isolate->debug()->is_active()); | 1086 CHECK(isolate->debug()->is_active()); |
| 1087 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 1087 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
| 1088 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); | 1088 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); |
| 1089 CHECK(source_position >= function->shared()->start_position() && | 1089 CHECK(source_position >= function->shared()->start_position() && |
| 1090 source_position <= function->shared()->end_position()); | 1090 source_position <= function->shared()->end_position()); |
| 1091 CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 2); | 1091 CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 2); |
| 1092 | 1092 |
| 1093 // Set break point. | 1093 // Set break point. |
| 1094 CHECK(isolate->debug()->SetBreakPoint(function, break_point_object_arg, | 1094 CHECK(isolate->debug()->SetBreakPoint(function, break_point_object_arg, |
| 1095 &source_position)); | 1095 &source_position)); |
| 1096 | 1096 |
| 1097 return Smi::FromInt(source_position); | 1097 return Smi::FromInt(source_position); |
| 1098 } | 1098 } |
| 1099 | 1099 |
| 1100 | 1100 |
| 1101 // Changes the state of a break point in a script and returns source position | 1101 // Changes the state of a break point in a script and returns source position |
| 1102 // where break point was set. NOTE: Regarding performance see the NOTE for | 1102 // where break point was set. NOTE: Regarding performance see the NOTE for |
| 1103 // GetScriptFromScriptData. | 1103 // GetScriptFromScriptData. |
| 1104 // args[0]: script to set break point in | 1104 // args[0]: script to set break point in |
| 1105 // args[1]: number: break source position (within the script source) | 1105 // args[1]: number: break source position (within the script source) |
| 1106 // args[2]: number, breakpoint position alignment | 1106 // args[2]: number, breakpoint position alignment |
| 1107 // args[3]: number: break point object | 1107 // args[3]: number: break point object |
| 1108 RUNTIME_FUNCTION(Runtime_SetScriptBreakPoint) { | 1108 RUNTIME_FUNCTION(Runtime_SetScriptBreakPoint) { |
| 1109 HandleScope scope(isolate); | 1109 HandleScope scope(isolate); |
| 1110 DCHECK(args.length() == 4); | 1110 DCHECK_EQ(4, args.length()); |
| 1111 CHECK(isolate->debug()->is_active()); | 1111 CHECK(isolate->debug()->is_active()); |
| 1112 CONVERT_ARG_HANDLE_CHECKED(JSValue, wrapper, 0); | 1112 CONVERT_ARG_HANDLE_CHECKED(JSValue, wrapper, 0); |
| 1113 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); | 1113 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); |
| 1114 CHECK(source_position >= 0); | 1114 CHECK(source_position >= 0); |
| 1115 CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[2]); | 1115 CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[2]); |
| 1116 CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 3); | 1116 CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 3); |
| 1117 | 1117 |
| 1118 if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) { | 1118 if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) { |
| 1119 return isolate->ThrowIllegalOperation(); | 1119 return isolate->ThrowIllegalOperation(); |
| 1120 } | 1120 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1132 } | 1132 } |
| 1133 | 1133 |
| 1134 return Smi::FromInt(source_position); | 1134 return Smi::FromInt(source_position); |
| 1135 } | 1135 } |
| 1136 | 1136 |
| 1137 | 1137 |
| 1138 // Clear a break point | 1138 // Clear a break point |
| 1139 // args[0]: number: break point object | 1139 // args[0]: number: break point object |
| 1140 RUNTIME_FUNCTION(Runtime_ClearBreakPoint) { | 1140 RUNTIME_FUNCTION(Runtime_ClearBreakPoint) { |
| 1141 HandleScope scope(isolate); | 1141 HandleScope scope(isolate); |
| 1142 DCHECK(args.length() == 1); | 1142 DCHECK_EQ(1, args.length()); |
| 1143 CHECK(isolate->debug()->is_active()); | 1143 CHECK(isolate->debug()->is_active()); |
| 1144 CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 0); | 1144 CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 0); |
| 1145 | 1145 |
| 1146 // Clear break point. | 1146 // Clear break point. |
| 1147 isolate->debug()->ClearBreakPoint(break_point_object_arg); | 1147 isolate->debug()->ClearBreakPoint(break_point_object_arg); |
| 1148 | 1148 |
| 1149 return isolate->heap()->undefined_value(); | 1149 return isolate->heap()->undefined_value(); |
| 1150 } | 1150 } |
| 1151 | 1151 |
| 1152 | 1152 |
| 1153 // Change the state of break on exceptions. | 1153 // Change the state of break on exceptions. |
| 1154 // args[0]: Enum value indicating whether to affect caught/uncaught exceptions. | 1154 // args[0]: Enum value indicating whether to affect caught/uncaught exceptions. |
| 1155 // args[1]: Boolean indicating on/off. | 1155 // args[1]: Boolean indicating on/off. |
| 1156 RUNTIME_FUNCTION(Runtime_ChangeBreakOnException) { | 1156 RUNTIME_FUNCTION(Runtime_ChangeBreakOnException) { |
| 1157 HandleScope scope(isolate); | 1157 HandleScope scope(isolate); |
| 1158 DCHECK(args.length() == 2); | 1158 DCHECK_EQ(2, args.length()); |
| 1159 CONVERT_NUMBER_CHECKED(uint32_t, type_arg, Uint32, args[0]); | 1159 CONVERT_NUMBER_CHECKED(uint32_t, type_arg, Uint32, args[0]); |
| 1160 CONVERT_BOOLEAN_ARG_CHECKED(enable, 1); | 1160 CONVERT_BOOLEAN_ARG_CHECKED(enable, 1); |
| 1161 | 1161 |
| 1162 // If the number doesn't match an enum value, the ChangeBreakOnException | 1162 // If the number doesn't match an enum value, the ChangeBreakOnException |
| 1163 // function will default to affecting caught exceptions. | 1163 // function will default to affecting caught exceptions. |
| 1164 ExceptionBreakType type = static_cast<ExceptionBreakType>(type_arg); | 1164 ExceptionBreakType type = static_cast<ExceptionBreakType>(type_arg); |
| 1165 // Update break point state. | 1165 // Update break point state. |
| 1166 isolate->debug()->ChangeBreakOnException(type, enable); | 1166 isolate->debug()->ChangeBreakOnException(type, enable); |
| 1167 return isolate->heap()->undefined_value(); | 1167 return isolate->heap()->undefined_value(); |
| 1168 } | 1168 } |
| 1169 | 1169 |
| 1170 | 1170 |
| 1171 // Returns the state of break on exceptions | 1171 // Returns the state of break on exceptions |
| 1172 // args[0]: boolean indicating uncaught exceptions | 1172 // args[0]: boolean indicating uncaught exceptions |
| 1173 RUNTIME_FUNCTION(Runtime_IsBreakOnException) { | 1173 RUNTIME_FUNCTION(Runtime_IsBreakOnException) { |
| 1174 HandleScope scope(isolate); | 1174 HandleScope scope(isolate); |
| 1175 DCHECK(args.length() == 1); | 1175 DCHECK_EQ(1, args.length()); |
| 1176 CONVERT_NUMBER_CHECKED(uint32_t, type_arg, Uint32, args[0]); | 1176 CONVERT_NUMBER_CHECKED(uint32_t, type_arg, Uint32, args[0]); |
| 1177 | 1177 |
| 1178 ExceptionBreakType type = static_cast<ExceptionBreakType>(type_arg); | 1178 ExceptionBreakType type = static_cast<ExceptionBreakType>(type_arg); |
| 1179 bool result = isolate->debug()->IsBreakOnException(type); | 1179 bool result = isolate->debug()->IsBreakOnException(type); |
| 1180 return Smi::FromInt(result); | 1180 return Smi::FromInt(result); |
| 1181 } | 1181 } |
| 1182 | 1182 |
| 1183 | 1183 |
| 1184 // Prepare for stepping | 1184 // Prepare for stepping |
| 1185 // args[0]: break id for checking execution state | 1185 // args[0]: break id for checking execution state |
| 1186 // args[1]: step action from the enumeration StepAction | 1186 // args[1]: step action from the enumeration StepAction |
| 1187 // args[2]: number of times to perform the step, for step out it is the number | 1187 // args[2]: number of times to perform the step, for step out it is the number |
| 1188 // of frames to step down. | 1188 // of frames to step down. |
| 1189 RUNTIME_FUNCTION(Runtime_PrepareStep) { | 1189 RUNTIME_FUNCTION(Runtime_PrepareStep) { |
| 1190 HandleScope scope(isolate); | 1190 HandleScope scope(isolate); |
| 1191 DCHECK(args.length() == 2); | 1191 DCHECK_EQ(2, args.length()); |
| 1192 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); | 1192 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); |
| 1193 CHECK(isolate->debug()->CheckExecutionState(break_id)); | 1193 CHECK(isolate->debug()->CheckExecutionState(break_id)); |
| 1194 | 1194 |
| 1195 if (!args[1]->IsNumber()) { | 1195 if (!args[1]->IsNumber()) { |
| 1196 return isolate->Throw(isolate->heap()->illegal_argument_string()); | 1196 return isolate->Throw(isolate->heap()->illegal_argument_string()); |
| 1197 } | 1197 } |
| 1198 | 1198 |
| 1199 // Get the step action and check validity. | 1199 // Get the step action and check validity. |
| 1200 StepAction step_action = static_cast<StepAction>(NumberToInt32(args[1])); | 1200 StepAction step_action = static_cast<StepAction>(NumberToInt32(args[1])); |
| 1201 if (step_action != StepIn && step_action != StepNext && | 1201 if (step_action != StepIn && step_action != StepNext && |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1220 isolate->debug()->ClearStepping(); | 1220 isolate->debug()->ClearStepping(); |
| 1221 | 1221 |
| 1222 // Prepare step. | 1222 // Prepare step. |
| 1223 isolate->debug()->PrepareStep(StepFrame); | 1223 isolate->debug()->PrepareStep(StepFrame); |
| 1224 return isolate->heap()->undefined_value(); | 1224 return isolate->heap()->undefined_value(); |
| 1225 } | 1225 } |
| 1226 | 1226 |
| 1227 // Clear all stepping set by PrepareStep. | 1227 // Clear all stepping set by PrepareStep. |
| 1228 RUNTIME_FUNCTION(Runtime_ClearStepping) { | 1228 RUNTIME_FUNCTION(Runtime_ClearStepping) { |
| 1229 HandleScope scope(isolate); | 1229 HandleScope scope(isolate); |
| 1230 DCHECK(args.length() == 0); | 1230 DCHECK_EQ(0, args.length()); |
| 1231 CHECK(isolate->debug()->is_active()); | 1231 CHECK(isolate->debug()->is_active()); |
| 1232 isolate->debug()->ClearStepping(); | 1232 isolate->debug()->ClearStepping(); |
| 1233 return isolate->heap()->undefined_value(); | 1233 return isolate->heap()->undefined_value(); |
| 1234 } | 1234 } |
| 1235 | 1235 |
| 1236 | 1236 |
| 1237 RUNTIME_FUNCTION(Runtime_DebugEvaluate) { | 1237 RUNTIME_FUNCTION(Runtime_DebugEvaluate) { |
| 1238 HandleScope scope(isolate); | 1238 HandleScope scope(isolate); |
| 1239 | 1239 |
| 1240 // Check the execution state and decode arguments frame and source to be | 1240 // Check the execution state and decode arguments frame and source to be |
| 1241 // evaluated. | 1241 // evaluated. |
| 1242 DCHECK(args.length() == 4); | 1242 DCHECK_EQ(4, args.length()); |
| 1243 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); | 1243 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); |
| 1244 CHECK(isolate->debug()->CheckExecutionState(break_id)); | 1244 CHECK(isolate->debug()->CheckExecutionState(break_id)); |
| 1245 | 1245 |
| 1246 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); | 1246 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); |
| 1247 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); | 1247 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); |
| 1248 CONVERT_ARG_HANDLE_CHECKED(String, source, 3); | 1248 CONVERT_ARG_HANDLE_CHECKED(String, source, 3); |
| 1249 | 1249 |
| 1250 StackFrame::Id id = DebugFrameHelper::UnwrapFrameId(wrapped_id); | 1250 StackFrame::Id id = DebugFrameHelper::UnwrapFrameId(wrapped_id); |
| 1251 | 1251 |
| 1252 RETURN_RESULT_OR_FAILURE( | 1252 RETURN_RESULT_OR_FAILURE( |
| 1253 isolate, | 1253 isolate, |
| 1254 DebugEvaluate::Local(isolate, id, inlined_jsframe_index, source)); | 1254 DebugEvaluate::Local(isolate, id, inlined_jsframe_index, source)); |
| 1255 } | 1255 } |
| 1256 | 1256 |
| 1257 | 1257 |
| 1258 RUNTIME_FUNCTION(Runtime_DebugEvaluateGlobal) { | 1258 RUNTIME_FUNCTION(Runtime_DebugEvaluateGlobal) { |
| 1259 HandleScope scope(isolate); | 1259 HandleScope scope(isolate); |
| 1260 | 1260 |
| 1261 // Check the execution state and decode arguments frame and source to be | 1261 // Check the execution state and decode arguments frame and source to be |
| 1262 // evaluated. | 1262 // evaluated. |
| 1263 DCHECK(args.length() == 2); | 1263 DCHECK_EQ(2, args.length()); |
| 1264 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); | 1264 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); |
| 1265 CHECK(isolate->debug()->CheckExecutionState(break_id)); | 1265 CHECK(isolate->debug()->CheckExecutionState(break_id)); |
| 1266 | 1266 |
| 1267 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); | 1267 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); |
| 1268 | 1268 |
| 1269 RETURN_RESULT_OR_FAILURE(isolate, DebugEvaluate::Global(isolate, source)); | 1269 RETURN_RESULT_OR_FAILURE(isolate, DebugEvaluate::Global(isolate, source)); |
| 1270 } | 1270 } |
| 1271 | 1271 |
| 1272 | 1272 |
| 1273 RUNTIME_FUNCTION(Runtime_DebugGetLoadedScripts) { | 1273 RUNTIME_FUNCTION(Runtime_DebugGetLoadedScripts) { |
| 1274 HandleScope scope(isolate); | 1274 HandleScope scope(isolate); |
| 1275 DCHECK(args.length() == 0); | 1275 DCHECK_EQ(0, args.length()); |
| 1276 | 1276 |
| 1277 // This runtime function is used by the debugger to determine whether the | 1277 // This runtime function is used by the debugger to determine whether the |
| 1278 // debugger is active or not. Hence we fail gracefully here and don't crash. | 1278 // debugger is active or not. Hence we fail gracefully here and don't crash. |
| 1279 if (!isolate->debug()->is_active()) return isolate->ThrowIllegalOperation(); | 1279 if (!isolate->debug()->is_active()) return isolate->ThrowIllegalOperation(); |
| 1280 | 1280 |
| 1281 Handle<FixedArray> instances; | 1281 Handle<FixedArray> instances; |
| 1282 { | 1282 { |
| 1283 DebugScope debug_scope(isolate->debug()); | 1283 DebugScope debug_scope(isolate->debug()); |
| 1284 if (debug_scope.failed()) { | 1284 if (debug_scope.failed()) { |
| 1285 DCHECK(isolate->has_pending_exception()); | 1285 DCHECK(isolate->has_pending_exception()); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1316 } | 1316 } |
| 1317 } | 1317 } |
| 1318 | 1318 |
| 1319 | 1319 |
| 1320 // Scan the heap for objects with direct references to an object | 1320 // Scan the heap for objects with direct references to an object |
| 1321 // args[0]: the object to find references to | 1321 // args[0]: the object to find references to |
| 1322 // args[1]: constructor function for instances to exclude (Mirror) | 1322 // args[1]: constructor function for instances to exclude (Mirror) |
| 1323 // args[2]: the the maximum number of objects to return | 1323 // args[2]: the the maximum number of objects to return |
| 1324 RUNTIME_FUNCTION(Runtime_DebugReferencedBy) { | 1324 RUNTIME_FUNCTION(Runtime_DebugReferencedBy) { |
| 1325 HandleScope scope(isolate); | 1325 HandleScope scope(isolate); |
| 1326 DCHECK(args.length() == 3); | 1326 DCHECK_EQ(3, args.length()); |
| 1327 CONVERT_ARG_HANDLE_CHECKED(JSObject, target, 0); | 1327 CONVERT_ARG_HANDLE_CHECKED(JSObject, target, 0); |
| 1328 CONVERT_ARG_HANDLE_CHECKED(Object, filter, 1); | 1328 CONVERT_ARG_HANDLE_CHECKED(Object, filter, 1); |
| 1329 CHECK(filter->IsUndefined(isolate) || filter->IsJSObject()); | 1329 CHECK(filter->IsUndefined(isolate) || filter->IsJSObject()); |
| 1330 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[2]); | 1330 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[2]); |
| 1331 CHECK(max_references >= 0); | 1331 CHECK(max_references >= 0); |
| 1332 | 1332 |
| 1333 List<Handle<JSObject> > instances; | 1333 List<Handle<JSObject> > instances; |
| 1334 Heap* heap = isolate->heap(); | 1334 Heap* heap = isolate->heap(); |
| 1335 { | 1335 { |
| 1336 HeapIterator iterator(heap, HeapIterator::kFilterUnreachable); | 1336 HeapIterator iterator(heap, HeapIterator::kFilterUnreachable); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1373 } | 1373 } |
| 1374 return *isolate->factory()->NewJSArrayWithElements(result); | 1374 return *isolate->factory()->NewJSArrayWithElements(result); |
| 1375 } | 1375 } |
| 1376 | 1376 |
| 1377 | 1377 |
| 1378 // Scan the heap for objects constructed by a specific function. | 1378 // Scan the heap for objects constructed by a specific function. |
| 1379 // args[0]: the constructor to find instances of | 1379 // args[0]: the constructor to find instances of |
| 1380 // args[1]: the the maximum number of objects to return | 1380 // args[1]: the the maximum number of objects to return |
| 1381 RUNTIME_FUNCTION(Runtime_DebugConstructedBy) { | 1381 RUNTIME_FUNCTION(Runtime_DebugConstructedBy) { |
| 1382 HandleScope scope(isolate); | 1382 HandleScope scope(isolate); |
| 1383 DCHECK(args.length() == 2); | 1383 DCHECK_EQ(2, args.length()); |
| 1384 CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 0); | 1384 CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 0); |
| 1385 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[1]); | 1385 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[1]); |
| 1386 CHECK(max_references >= 0); | 1386 CHECK(max_references >= 0); |
| 1387 | 1387 |
| 1388 List<Handle<JSObject> > instances; | 1388 List<Handle<JSObject> > instances; |
| 1389 Heap* heap = isolate->heap(); | 1389 Heap* heap = isolate->heap(); |
| 1390 { | 1390 { |
| 1391 HeapIterator iterator(heap, HeapIterator::kFilterUnreachable); | 1391 HeapIterator iterator(heap, HeapIterator::kFilterUnreachable); |
| 1392 HeapObject* heap_obj; | 1392 HeapObject* heap_obj; |
| 1393 while ((heap_obj = iterator.next())) { | 1393 while ((heap_obj = iterator.next())) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1406 isolate->factory()->NewFixedArray(instances.length()); | 1406 isolate->factory()->NewFixedArray(instances.length()); |
| 1407 for (int i = 0; i < instances.length(); ++i) result->set(i, *instances[i]); | 1407 for (int i = 0; i < instances.length(); ++i) result->set(i, *instances[i]); |
| 1408 return *isolate->factory()->NewJSArrayWithElements(result); | 1408 return *isolate->factory()->NewJSArrayWithElements(result); |
| 1409 } | 1409 } |
| 1410 | 1410 |
| 1411 | 1411 |
| 1412 // Find the effective prototype object as returned by __proto__. | 1412 // Find the effective prototype object as returned by __proto__. |
| 1413 // args[0]: the object to find the prototype for. | 1413 // args[0]: the object to find the prototype for. |
| 1414 RUNTIME_FUNCTION(Runtime_DebugGetPrototype) { | 1414 RUNTIME_FUNCTION(Runtime_DebugGetPrototype) { |
| 1415 HandleScope shs(isolate); | 1415 HandleScope shs(isolate); |
| 1416 DCHECK(args.length() == 1); | 1416 DCHECK_EQ(1, args.length()); |
| 1417 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); | 1417 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
| 1418 // TODO(1543): Come up with a solution for clients to handle potential errors | 1418 // TODO(1543): Come up with a solution for clients to handle potential errors |
| 1419 // thrown by an intermediate proxy. | 1419 // thrown by an intermediate proxy. |
| 1420 RETURN_RESULT_OR_FAILURE(isolate, JSReceiver::GetPrototype(isolate, obj)); | 1420 RETURN_RESULT_OR_FAILURE(isolate, JSReceiver::GetPrototype(isolate, obj)); |
| 1421 } | 1421 } |
| 1422 | 1422 |
| 1423 | 1423 |
| 1424 // Patches script source (should be called upon BeforeCompile event). | 1424 // Patches script source (should be called upon BeforeCompile event). |
| 1425 // TODO(5530): Remove once uses in debug.js are gone. | 1425 // TODO(5530): Remove once uses in debug.js are gone. |
| 1426 RUNTIME_FUNCTION(Runtime_DebugSetScriptSource) { | 1426 RUNTIME_FUNCTION(Runtime_DebugSetScriptSource) { |
| 1427 HandleScope scope(isolate); | 1427 HandleScope scope(isolate); |
| 1428 DCHECK(args.length() == 2); | 1428 DCHECK_EQ(2, args.length()); |
| 1429 | 1429 |
| 1430 CONVERT_ARG_HANDLE_CHECKED(JSValue, script_wrapper, 0); | 1430 CONVERT_ARG_HANDLE_CHECKED(JSValue, script_wrapper, 0); |
| 1431 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); | 1431 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); |
| 1432 | 1432 |
| 1433 CHECK(script_wrapper->value()->IsScript()); | 1433 CHECK(script_wrapper->value()->IsScript()); |
| 1434 Handle<Script> script(Script::cast(script_wrapper->value())); | 1434 Handle<Script> script(Script::cast(script_wrapper->value())); |
| 1435 | 1435 |
| 1436 // The following condition is not guaranteed to hold and a failure is also | 1436 // The following condition is not guaranteed to hold and a failure is also |
| 1437 // propagated to callers. Hence we fail gracefully here and don't crash. | 1437 // propagated to callers. Hence we fail gracefully here and don't crash. |
| 1438 if (script->compilation_state() != Script::COMPILATION_STATE_INITIAL) { | 1438 if (script->compilation_state() != Script::COMPILATION_STATE_INITIAL) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1471 return *JSFunction::GetDebugName(Handle<JSFunction>::cast(function)); | 1471 return *JSFunction::GetDebugName(Handle<JSFunction>::cast(function)); |
| 1472 } | 1472 } |
| 1473 } | 1473 } |
| 1474 | 1474 |
| 1475 | 1475 |
| 1476 // Calls specified function with or without entering the debugger. | 1476 // Calls specified function with or without entering the debugger. |
| 1477 // This is used in unit tests to run code as if debugger is entered or simply | 1477 // This is used in unit tests to run code as if debugger is entered or simply |
| 1478 // to have a stack with C++ frame in the middle. | 1478 // to have a stack with C++ frame in the middle. |
| 1479 RUNTIME_FUNCTION(Runtime_ExecuteInDebugContext) { | 1479 RUNTIME_FUNCTION(Runtime_ExecuteInDebugContext) { |
| 1480 HandleScope scope(isolate); | 1480 HandleScope scope(isolate); |
| 1481 DCHECK(args.length() == 1); | 1481 DCHECK_EQ(1, args.length()); |
| 1482 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 1482 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
| 1483 | 1483 |
| 1484 DebugScope debug_scope(isolate->debug()); | 1484 DebugScope debug_scope(isolate->debug()); |
| 1485 if (debug_scope.failed()) { | 1485 if (debug_scope.failed()) { |
| 1486 DCHECK(isolate->has_pending_exception()); | 1486 DCHECK(isolate->has_pending_exception()); |
| 1487 return isolate->heap()->exception(); | 1487 return isolate->heap()->exception(); |
| 1488 } | 1488 } |
| 1489 | 1489 |
| 1490 RETURN_RESULT_OR_FAILURE( | 1490 RETURN_RESULT_OR_FAILURE( |
| 1491 isolate, Execution::Call(isolate, function, | 1491 isolate, Execution::Call(isolate, function, |
| 1492 handle(function->global_proxy()), 0, NULL)); | 1492 handle(function->global_proxy()), 0, NULL)); |
| 1493 } | 1493 } |
| 1494 | 1494 |
| 1495 | 1495 |
| 1496 RUNTIME_FUNCTION(Runtime_GetDebugContext) { | 1496 RUNTIME_FUNCTION(Runtime_GetDebugContext) { |
| 1497 HandleScope scope(isolate); | 1497 HandleScope scope(isolate); |
| 1498 DCHECK(args.length() == 0); | 1498 DCHECK_EQ(0, args.length()); |
| 1499 Handle<Context> context; | 1499 Handle<Context> context; |
| 1500 { | 1500 { |
| 1501 DebugScope debug_scope(isolate->debug()); | 1501 DebugScope debug_scope(isolate->debug()); |
| 1502 if (debug_scope.failed()) { | 1502 if (debug_scope.failed()) { |
| 1503 DCHECK(isolate->has_pending_exception()); | 1503 DCHECK(isolate->has_pending_exception()); |
| 1504 return isolate->heap()->exception(); | 1504 return isolate->heap()->exception(); |
| 1505 } | 1505 } |
| 1506 context = isolate->debug()->GetDebugContext(); | 1506 context = isolate->debug()->GetDebugContext(); |
| 1507 } | 1507 } |
| 1508 if (context.is_null()) return isolate->heap()->undefined_value(); | 1508 if (context.is_null()) return isolate->heap()->undefined_value(); |
| 1509 context->set_security_token(isolate->native_context()->security_token()); | 1509 context->set_security_token(isolate->native_context()->security_token()); |
| 1510 return context->global_proxy(); | 1510 return context->global_proxy(); |
| 1511 } | 1511 } |
| 1512 | 1512 |
| 1513 | 1513 |
| 1514 // Performs a GC. | 1514 // Performs a GC. |
| 1515 // Presently, it only does a full GC. | 1515 // Presently, it only does a full GC. |
| 1516 RUNTIME_FUNCTION(Runtime_CollectGarbage) { | 1516 RUNTIME_FUNCTION(Runtime_CollectGarbage) { |
| 1517 SealHandleScope shs(isolate); | 1517 SealHandleScope shs(isolate); |
| 1518 DCHECK(args.length() == 1); | 1518 DCHECK_EQ(1, args.length()); |
| 1519 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 1519 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
| 1520 GarbageCollectionReason::kRuntime); | 1520 GarbageCollectionReason::kRuntime); |
| 1521 return isolate->heap()->undefined_value(); | 1521 return isolate->heap()->undefined_value(); |
| 1522 } | 1522 } |
| 1523 | 1523 |
| 1524 | 1524 |
| 1525 // Gets the current heap usage. | 1525 // Gets the current heap usage. |
| 1526 RUNTIME_FUNCTION(Runtime_GetHeapUsage) { | 1526 RUNTIME_FUNCTION(Runtime_GetHeapUsage) { |
| 1527 SealHandleScope shs(isolate); | 1527 SealHandleScope shs(isolate); |
| 1528 DCHECK(args.length() == 0); | 1528 DCHECK_EQ(0, args.length()); |
| 1529 int usage = static_cast<int>(isolate->heap()->SizeOfObjects()); | 1529 int usage = static_cast<int>(isolate->heap()->SizeOfObjects()); |
| 1530 if (!Smi::IsValid(usage)) { | 1530 if (!Smi::IsValid(usage)) { |
| 1531 return *isolate->factory()->NewNumberFromInt(usage); | 1531 return *isolate->factory()->NewNumberFromInt(usage); |
| 1532 } | 1532 } |
| 1533 return Smi::FromInt(usage); | 1533 return Smi::FromInt(usage); |
| 1534 } | 1534 } |
| 1535 | 1535 |
| 1536 | 1536 |
| 1537 // Finds the script object from the script data. NOTE: This operation uses | 1537 // Finds the script object from the script data. NOTE: This operation uses |
| 1538 // heap traversal to find the function generated for the source position | 1538 // heap traversal to find the function generated for the source position |
| 1539 // for the requested break point. For lazily compiled functions several heap | 1539 // for the requested break point. For lazily compiled functions several heap |
| 1540 // traversals might be required rendering this operation as a rather slow | 1540 // traversals might be required rendering this operation as a rather slow |
| 1541 // operation. However for setting break points which is normally done through | 1541 // operation. However for setting break points which is normally done through |
| 1542 // some kind of user interaction the performance is not crucial. | 1542 // some kind of user interaction the performance is not crucial. |
| 1543 RUNTIME_FUNCTION(Runtime_GetScript) { | 1543 RUNTIME_FUNCTION(Runtime_GetScript) { |
| 1544 HandleScope scope(isolate); | 1544 HandleScope scope(isolate); |
| 1545 DCHECK(args.length() == 1); | 1545 DCHECK_EQ(1, args.length()); |
| 1546 CONVERT_ARG_HANDLE_CHECKED(String, script_name, 0); | 1546 CONVERT_ARG_HANDLE_CHECKED(String, script_name, 0); |
| 1547 | 1547 |
| 1548 Handle<Script> found; | 1548 Handle<Script> found; |
| 1549 { | 1549 { |
| 1550 Script::Iterator iterator(isolate); | 1550 Script::Iterator iterator(isolate); |
| 1551 Script* script = NULL; | 1551 Script* script = NULL; |
| 1552 while ((script = iterator.Next()) != NULL) { | 1552 while ((script = iterator.Next()) != NULL) { |
| 1553 if (!script->name()->IsString()) continue; | 1553 if (!script->name()->IsString()) continue; |
| 1554 String* name = String::cast(script->name()); | 1554 String* name = String::cast(script->name()); |
| 1555 if (name->Equals(*script_name)) { | 1555 if (name->Equals(*script_name)) { |
| 1556 found = Handle<Script>(script, isolate); | 1556 found = Handle<Script>(script, isolate); |
| 1557 break; | 1557 break; |
| 1558 } | 1558 } |
| 1559 } | 1559 } |
| 1560 } | 1560 } |
| 1561 | 1561 |
| 1562 if (found.is_null()) return isolate->heap()->undefined_value(); | 1562 if (found.is_null()) return isolate->heap()->undefined_value(); |
| 1563 return *Script::GetWrapper(found); | 1563 return *Script::GetWrapper(found); |
| 1564 } | 1564 } |
| 1565 | 1565 |
| 1566 // TODO(5530): Remove once uses in debug.js are gone. | 1566 // TODO(5530): Remove once uses in debug.js are gone. |
| 1567 RUNTIME_FUNCTION(Runtime_ScriptLineCount) { | 1567 RUNTIME_FUNCTION(Runtime_ScriptLineCount) { |
| 1568 HandleScope scope(isolate); | 1568 HandleScope scope(isolate); |
| 1569 DCHECK(args.length() == 1); | 1569 DCHECK_EQ(1, args.length()); |
| 1570 CONVERT_ARG_CHECKED(JSValue, script, 0); | 1570 CONVERT_ARG_CHECKED(JSValue, script, 0); |
| 1571 | 1571 |
| 1572 CHECK(script->value()->IsScript()); | 1572 CHECK(script->value()->IsScript()); |
| 1573 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | 1573 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); |
| 1574 | 1574 |
| 1575 if (script_handle->type() == Script::TYPE_WASM) { | 1575 if (script_handle->type() == Script::TYPE_WASM) { |
| 1576 // Return 0 for now; this function will disappear soon anyway. | 1576 // Return 0 for now; this function will disappear soon anyway. |
| 1577 return Smi::FromInt(0); | 1577 return Smi::FromInt(0); |
| 1578 } | 1578 } |
| 1579 | 1579 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1603 // If line == line_count, we return the first position beyond the last line. | 1603 // If line == line_count, we return the first position beyond the last line. |
| 1604 if (line > line_count) return -1; | 1604 if (line > line_count) return -1; |
| 1605 return Smi::cast(line_ends_array->get(line - 1))->value() + 1; | 1605 return Smi::cast(line_ends_array->get(line - 1))->value() + 1; |
| 1606 } | 1606 } |
| 1607 | 1607 |
| 1608 } // namespace | 1608 } // namespace |
| 1609 | 1609 |
| 1610 // TODO(5530): Remove once uses in debug.js are gone. | 1610 // TODO(5530): Remove once uses in debug.js are gone. |
| 1611 RUNTIME_FUNCTION(Runtime_ScriptLineStartPosition) { | 1611 RUNTIME_FUNCTION(Runtime_ScriptLineStartPosition) { |
| 1612 HandleScope scope(isolate); | 1612 HandleScope scope(isolate); |
| 1613 DCHECK(args.length() == 2); | 1613 DCHECK_EQ(2, args.length()); |
| 1614 CONVERT_ARG_CHECKED(JSValue, script, 0); | 1614 CONVERT_ARG_CHECKED(JSValue, script, 0); |
| 1615 CONVERT_NUMBER_CHECKED(int32_t, line, Int32, args[1]); | 1615 CONVERT_NUMBER_CHECKED(int32_t, line, Int32, args[1]); |
| 1616 | 1616 |
| 1617 CHECK(script->value()->IsScript()); | 1617 CHECK(script->value()->IsScript()); |
| 1618 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | 1618 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); |
| 1619 | 1619 |
| 1620 return Smi::FromInt(ScriptLinePosition(script_handle, line)); | 1620 return Smi::FromInt(ScriptLinePosition(script_handle, line)); |
| 1621 } | 1621 } |
| 1622 | 1622 |
| 1623 // TODO(5530): Remove once uses in debug.js are gone. | 1623 // TODO(5530): Remove once uses in debug.js are gone. |
| 1624 RUNTIME_FUNCTION(Runtime_ScriptLineEndPosition) { | 1624 RUNTIME_FUNCTION(Runtime_ScriptLineEndPosition) { |
| 1625 HandleScope scope(isolate); | 1625 HandleScope scope(isolate); |
| 1626 DCHECK(args.length() == 2); | 1626 DCHECK_EQ(2, args.length()); |
| 1627 CONVERT_ARG_CHECKED(JSValue, script, 0); | 1627 CONVERT_ARG_CHECKED(JSValue, script, 0); |
| 1628 CONVERT_NUMBER_CHECKED(int32_t, line, Int32, args[1]); | 1628 CONVERT_NUMBER_CHECKED(int32_t, line, Int32, args[1]); |
| 1629 | 1629 |
| 1630 CHECK(script->value()->IsScript()); | 1630 CHECK(script->value()->IsScript()); |
| 1631 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | 1631 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); |
| 1632 | 1632 |
| 1633 if (script_handle->type() == Script::TYPE_WASM) { | 1633 if (script_handle->type() == Script::TYPE_WASM) { |
| 1634 // Return zero for now; this function will disappear soon anyway. | 1634 // Return zero for now; this function will disappear soon anyway. |
| 1635 return Smi::FromInt(0); | 1635 return Smi::FromInt(0); |
| 1636 } | 1636 } |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1741 // fixed source position. This function is used to find a source position from | 1741 // fixed source position. This function is used to find a source position from |
| 1742 // a line and column position. The fixed source position offset is typically | 1742 // a line and column position. The fixed source position offset is typically |
| 1743 // used to find a source position in a function based on a line and column in | 1743 // used to find a source position in a function based on a line and column in |
| 1744 // the source for the function alone. The offset passed will then be the | 1744 // the source for the function alone. The offset passed will then be the |
| 1745 // start position of the source for the function within the full script source. | 1745 // start position of the source for the function within the full script source. |
| 1746 // Note that incoming line and column parameters may be undefined, and are | 1746 // Note that incoming line and column parameters may be undefined, and are |
| 1747 // assumed to be passed *with* offsets. | 1747 // assumed to be passed *with* offsets. |
| 1748 // TODO(5530): Remove once uses in debug.js are gone. | 1748 // TODO(5530): Remove once uses in debug.js are gone. |
| 1749 RUNTIME_FUNCTION(Runtime_ScriptLocationFromLine) { | 1749 RUNTIME_FUNCTION(Runtime_ScriptLocationFromLine) { |
| 1750 HandleScope scope(isolate); | 1750 HandleScope scope(isolate); |
| 1751 DCHECK(args.length() == 4); | 1751 DCHECK_EQ(4, args.length()); |
| 1752 CONVERT_ARG_HANDLE_CHECKED(JSValue, script, 0); | 1752 CONVERT_ARG_HANDLE_CHECKED(JSValue, script, 0); |
| 1753 CONVERT_ARG_HANDLE_CHECKED(Object, opt_line, 1); | 1753 CONVERT_ARG_HANDLE_CHECKED(Object, opt_line, 1); |
| 1754 CONVERT_ARG_HANDLE_CHECKED(Object, opt_column, 2); | 1754 CONVERT_ARG_HANDLE_CHECKED(Object, opt_column, 2); |
| 1755 CONVERT_NUMBER_CHECKED(int32_t, offset, Int32, args[3]); | 1755 CONVERT_NUMBER_CHECKED(int32_t, offset, Int32, args[3]); |
| 1756 | 1756 |
| 1757 CHECK(script->value()->IsScript()); | 1757 CHECK(script->value()->IsScript()); |
| 1758 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | 1758 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); |
| 1759 | 1759 |
| 1760 return *ScriptLocationFromLine(isolate, script_handle, opt_line, opt_column, | 1760 return *ScriptLocationFromLine(isolate, script_handle, opt_line, opt_column, |
| 1761 offset); | 1761 offset); |
| 1762 } | 1762 } |
| 1763 | 1763 |
| 1764 // TODO(5530): Rename once conflicting function has been deleted. | 1764 // TODO(5530): Rename once conflicting function has been deleted. |
| 1765 RUNTIME_FUNCTION(Runtime_ScriptLocationFromLine2) { | 1765 RUNTIME_FUNCTION(Runtime_ScriptLocationFromLine2) { |
| 1766 HandleScope scope(isolate); | 1766 HandleScope scope(isolate); |
| 1767 DCHECK(args.length() == 4); | 1767 DCHECK_EQ(4, args.length()); |
| 1768 CONVERT_NUMBER_CHECKED(int32_t, scriptid, Int32, args[0]); | 1768 CONVERT_NUMBER_CHECKED(int32_t, scriptid, Int32, args[0]); |
| 1769 CONVERT_ARG_HANDLE_CHECKED(Object, opt_line, 1); | 1769 CONVERT_ARG_HANDLE_CHECKED(Object, opt_line, 1); |
| 1770 CONVERT_ARG_HANDLE_CHECKED(Object, opt_column, 2); | 1770 CONVERT_ARG_HANDLE_CHECKED(Object, opt_column, 2); |
| 1771 CONVERT_NUMBER_CHECKED(int32_t, offset, Int32, args[3]); | 1771 CONVERT_NUMBER_CHECKED(int32_t, offset, Int32, args[3]); |
| 1772 | 1772 |
| 1773 Handle<Script> script; | 1773 Handle<Script> script; |
| 1774 CHECK(GetScriptById(isolate, scriptid, &script)); | 1774 CHECK(GetScriptById(isolate, scriptid, &script)); |
| 1775 | 1775 |
| 1776 return *ScriptLocationFromLine(isolate, script, opt_line, opt_column, offset); | 1776 return *ScriptLocationFromLine(isolate, script, opt_line, opt_column, offset); |
| 1777 } | 1777 } |
| 1778 | 1778 |
| 1779 // TODO(5530): Remove once uses in debug.js are gone. | 1779 // TODO(5530): Remove once uses in debug.js are gone. |
| 1780 RUNTIME_FUNCTION(Runtime_ScriptPositionInfo) { | 1780 RUNTIME_FUNCTION(Runtime_ScriptPositionInfo) { |
| 1781 HandleScope scope(isolate); | 1781 HandleScope scope(isolate); |
| 1782 DCHECK(args.length() == 3); | 1782 DCHECK_EQ(3, args.length()); |
| 1783 CONVERT_ARG_CHECKED(JSValue, script, 0); | 1783 CONVERT_ARG_CHECKED(JSValue, script, 0); |
| 1784 CONVERT_NUMBER_CHECKED(int32_t, position, Int32, args[1]); | 1784 CONVERT_NUMBER_CHECKED(int32_t, position, Int32, args[1]); |
| 1785 CONVERT_BOOLEAN_ARG_CHECKED(with_offset, 2); | 1785 CONVERT_BOOLEAN_ARG_CHECKED(with_offset, 2); |
| 1786 | 1786 |
| 1787 CHECK(script->value()->IsScript()); | 1787 CHECK(script->value()->IsScript()); |
| 1788 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | 1788 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); |
| 1789 | 1789 |
| 1790 const Script::OffsetFlag offset_flag = | 1790 const Script::OffsetFlag offset_flag = |
| 1791 with_offset ? Script::WITH_OFFSET : Script::NO_OFFSET; | 1791 with_offset ? Script::WITH_OFFSET : Script::NO_OFFSET; |
| 1792 return *GetJSPositionInfo(script_handle, position, offset_flag, isolate); | 1792 return *GetJSPositionInfo(script_handle, position, offset_flag, isolate); |
| 1793 } | 1793 } |
| 1794 | 1794 |
| 1795 // TODO(5530): Rename once conflicting function has been deleted. | 1795 // TODO(5530): Rename once conflicting function has been deleted. |
| 1796 RUNTIME_FUNCTION(Runtime_ScriptPositionInfo2) { | 1796 RUNTIME_FUNCTION(Runtime_ScriptPositionInfo2) { |
| 1797 HandleScope scope(isolate); | 1797 HandleScope scope(isolate); |
| 1798 DCHECK(args.length() == 3); | 1798 DCHECK_EQ(3, args.length()); |
| 1799 CONVERT_NUMBER_CHECKED(int32_t, scriptid, Int32, args[0]); | 1799 CONVERT_NUMBER_CHECKED(int32_t, scriptid, Int32, args[0]); |
| 1800 CONVERT_NUMBER_CHECKED(int32_t, position, Int32, args[1]); | 1800 CONVERT_NUMBER_CHECKED(int32_t, position, Int32, args[1]); |
| 1801 CONVERT_BOOLEAN_ARG_CHECKED(with_offset, 2); | 1801 CONVERT_BOOLEAN_ARG_CHECKED(with_offset, 2); |
| 1802 | 1802 |
| 1803 Handle<Script> script; | 1803 Handle<Script> script; |
| 1804 CHECK(GetScriptById(isolate, scriptid, &script)); | 1804 CHECK(GetScriptById(isolate, scriptid, &script)); |
| 1805 | 1805 |
| 1806 const Script::OffsetFlag offset_flag = | 1806 const Script::OffsetFlag offset_flag = |
| 1807 with_offset ? Script::WITH_OFFSET : Script::NO_OFFSET; | 1807 with_offset ? Script::WITH_OFFSET : Script::NO_OFFSET; |
| 1808 return *GetJSPositionInfo(script, position, offset_flag, isolate); | 1808 return *GetJSPositionInfo(script, position, offset_flag, isolate); |
| 1809 } | 1809 } |
| 1810 | 1810 |
| 1811 // Returns the given line as a string, or null if line is out of bounds. | 1811 // Returns the given line as a string, or null if line is out of bounds. |
| 1812 // The parameter line is expected to include the script's line offset. | 1812 // The parameter line is expected to include the script's line offset. |
| 1813 // TODO(5530): Remove once uses in debug.js are gone. | 1813 // TODO(5530): Remove once uses in debug.js are gone. |
| 1814 RUNTIME_FUNCTION(Runtime_ScriptSourceLine) { | 1814 RUNTIME_FUNCTION(Runtime_ScriptSourceLine) { |
| 1815 HandleScope scope(isolate); | 1815 HandleScope scope(isolate); |
| 1816 DCHECK(args.length() == 2); | 1816 DCHECK_EQ(2, args.length()); |
| 1817 CONVERT_ARG_CHECKED(JSValue, script, 0); | 1817 CONVERT_ARG_CHECKED(JSValue, script, 0); |
| 1818 CONVERT_NUMBER_CHECKED(int32_t, line, Int32, args[1]); | 1818 CONVERT_NUMBER_CHECKED(int32_t, line, Int32, args[1]); |
| 1819 | 1819 |
| 1820 CHECK(script->value()->IsScript()); | 1820 CHECK(script->value()->IsScript()); |
| 1821 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | 1821 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); |
| 1822 | 1822 |
| 1823 if (script_handle->type() == Script::TYPE_WASM) { | 1823 if (script_handle->type() == Script::TYPE_WASM) { |
| 1824 // Return null for now; this function will disappear soon anyway. | 1824 // Return null for now; this function will disappear soon anyway. |
| 1825 return isolate->heap()->null_value(); | 1825 return isolate->heap()->null_value(); |
| 1826 } | 1826 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1868 RUNTIME_FUNCTION(Runtime_DebugRecordGenerator) { | 1868 RUNTIME_FUNCTION(Runtime_DebugRecordGenerator) { |
| 1869 HandleScope scope(isolate); | 1869 HandleScope scope(isolate); |
| 1870 DCHECK_EQ(1, args.length()); | 1870 DCHECK_EQ(1, args.length()); |
| 1871 CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0); | 1871 CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0); |
| 1872 CHECK(isolate->debug()->last_step_action() >= StepNext); | 1872 CHECK(isolate->debug()->last_step_action() >= StepNext); |
| 1873 isolate->debug()->RecordGenerator(generator); | 1873 isolate->debug()->RecordGenerator(generator); |
| 1874 return isolate->heap()->undefined_value(); | 1874 return isolate->heap()->undefined_value(); |
| 1875 } | 1875 } |
| 1876 | 1876 |
| 1877 RUNTIME_FUNCTION(Runtime_DebugPushPromise) { | 1877 RUNTIME_FUNCTION(Runtime_DebugPushPromise) { |
| 1878 DCHECK(args.length() == 1); | 1878 DCHECK_EQ(1, args.length()); |
| 1879 HandleScope scope(isolate); | 1879 HandleScope scope(isolate); |
| 1880 CONVERT_ARG_HANDLE_CHECKED(JSObject, promise, 0); | 1880 CONVERT_ARG_HANDLE_CHECKED(JSObject, promise, 0); |
| 1881 isolate->PushPromise(promise); | 1881 isolate->PushPromise(promise); |
| 1882 return isolate->heap()->undefined_value(); | 1882 return isolate->heap()->undefined_value(); |
| 1883 } | 1883 } |
| 1884 | 1884 |
| 1885 | 1885 |
| 1886 RUNTIME_FUNCTION(Runtime_DebugPopPromise) { | 1886 RUNTIME_FUNCTION(Runtime_DebugPopPromise) { |
| 1887 DCHECK(args.length() == 0); | 1887 DCHECK_EQ(0, args.length()); |
| 1888 SealHandleScope shs(isolate); | 1888 SealHandleScope shs(isolate); |
| 1889 isolate->PopPromise(); | 1889 isolate->PopPromise(); |
| 1890 return isolate->heap()->undefined_value(); | 1890 return isolate->heap()->undefined_value(); |
| 1891 } | 1891 } |
| 1892 | 1892 |
| 1893 RUNTIME_FUNCTION(Runtime_DebugNextMicrotaskId) { | 1893 RUNTIME_FUNCTION(Runtime_DebugNextMicrotaskId) { |
| 1894 HandleScope scope(isolate); | 1894 HandleScope scope(isolate); |
| 1895 DCHECK(args.length() == 0); | 1895 DCHECK_EQ(0, args.length()); |
| 1896 return Smi::FromInt(isolate->GetNextDebugMicrotaskId()); | 1896 return Smi::FromInt(isolate->GetNextDebugMicrotaskId()); |
| 1897 } | 1897 } |
| 1898 | 1898 |
| 1899 RUNTIME_FUNCTION(Runtime_DebugAsyncTaskEvent) { | 1899 RUNTIME_FUNCTION(Runtime_DebugAsyncTaskEvent) { |
| 1900 DCHECK(args.length() == 3); | 1900 DCHECK_EQ(3, args.length()); |
| 1901 HandleScope scope(isolate); | 1901 HandleScope scope(isolate); |
| 1902 CONVERT_SMI_ARG_CHECKED(type, 0); | 1902 CONVERT_SMI_ARG_CHECKED(type, 0); |
| 1903 CONVERT_SMI_ARG_CHECKED(id, 1); | 1903 CONVERT_SMI_ARG_CHECKED(id, 1); |
| 1904 CONVERT_SMI_ARG_CHECKED(name, 2); | 1904 CONVERT_SMI_ARG_CHECKED(name, 2); |
| 1905 isolate->debug()->OnAsyncTaskEvent(static_cast<PromiseDebugActionType>(type), | 1905 isolate->debug()->OnAsyncTaskEvent(static_cast<PromiseDebugActionType>(type), |
| 1906 id, | 1906 id, |
| 1907 static_cast<PromiseDebugActionName>(name)); | 1907 static_cast<PromiseDebugActionName>(name)); |
| 1908 return isolate->heap()->undefined_value(); | 1908 return isolate->heap()->undefined_value(); |
| 1909 } | 1909 } |
| 1910 | 1910 |
| 1911 | 1911 |
| 1912 RUNTIME_FUNCTION(Runtime_DebugIsActive) { | 1912 RUNTIME_FUNCTION(Runtime_DebugIsActive) { |
| 1913 SealHandleScope shs(isolate); | 1913 SealHandleScope shs(isolate); |
| 1914 return Smi::FromInt(isolate->debug()->is_active()); | 1914 return Smi::FromInt(isolate->debug()->is_active()); |
| 1915 } | 1915 } |
| 1916 | 1916 |
| 1917 | 1917 |
| 1918 RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) { | 1918 RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) { |
| 1919 UNIMPLEMENTED(); | 1919 UNIMPLEMENTED(); |
| 1920 return NULL; | 1920 return NULL; |
| 1921 } | 1921 } |
| 1922 | 1922 |
| 1923 } // namespace internal | 1923 } // namespace internal |
| 1924 } // namespace v8 | 1924 } // namespace v8 |
| OLD | NEW |