Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(285)

Side by Side Diff: src/debug/debug.cc

Issue 1282793002: Debugger: load debugger builtins as normal native JS. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: use InstallFunctions and InstallConstants Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/debug/debug.h ('k') | src/debug/debug.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/debug/debug.h" 7 #include "src/debug/debug.h"
8 8
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/arguments.h" 10 #include "src/arguments.h"
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 } 423 }
424 424
425 425
426 DebugInfoListNode::~DebugInfoListNode() { 426 DebugInfoListNode::~DebugInfoListNode() {
427 if (debug_info_ == nullptr) return; 427 if (debug_info_ == nullptr) return;
428 GlobalHandles::Destroy(reinterpret_cast<Object**>(debug_info_)); 428 GlobalHandles::Destroy(reinterpret_cast<Object**>(debug_info_));
429 debug_info_ = nullptr; 429 debug_info_ = nullptr;
430 } 430 }
431 431
432 432
433 bool Debug::CompileDebuggerScript(Isolate* isolate, int index) {
434 Factory* factory = isolate->factory();
435 HandleScope scope(isolate);
436
437 // Bail out if the index is invalid.
438 if (index == -1) return false;
439
440 // Find source and name for the requested script.
441 Handle<String> source_code =
442 isolate->bootstrapper()->SourceLookup<Natives>(index);
443 Vector<const char> name = Natives::GetScriptName(index);
444 Handle<String> script_name =
445 factory->NewStringFromAscii(name).ToHandleChecked();
446 Handle<Context> context = isolate->native_context();
447
448 // Compile the script.
449 Handle<SharedFunctionInfo> function_info;
450 function_info = Compiler::CompileScript(
451 source_code, script_name, 0, 0, ScriptOriginOptions(), Handle<Object>(),
452 context, NULL, NULL, ScriptCompiler::kNoCompileOptions, NATIVES_CODE,
453 false);
454 if (function_info.is_null()) return false;
455
456 // Execute the shared function in the debugger context.
457 Handle<JSFunction> function =
458 factory->NewFunctionFromSharedFunctionInfo(function_info, context);
459
460 MaybeHandle<Object> maybe_exception;
461 MaybeHandle<Object> result = Execution::TryCall(
462 function, handle(context->global_proxy()), 0, NULL, &maybe_exception);
463
464 // Check for caught exceptions.
465 if (result.is_null()) {
466 DCHECK(!isolate->has_pending_exception());
467 MessageLocation computed_location;
468 isolate->ComputeLocation(&computed_location);
469 Handle<JSMessageObject> message = MessageHandler::MakeMessageObject(
470 isolate, MessageTemplate::kDebuggerLoading, &computed_location,
471 isolate->factory()->undefined_value(), Handle<JSArray>());
472 DCHECK(!isolate->has_pending_exception());
473 Handle<Object> exception;
474 if (maybe_exception.ToHandle(&exception)) {
475 isolate->set_pending_exception(*exception);
476 MessageHandler::ReportMessage(isolate, NULL, message);
477 }
478 DCHECK(!maybe_exception.is_null());
479 return false;
480 }
481
482 // Mark this script as native and return successfully.
483 Handle<Script> script(Script::cast(function->shared()->script()));
484 script->set_type(Smi::FromInt(Script::TYPE_NATIVE));
485 return true;
486 }
487
488
489 bool Debug::Load() { 433 bool Debug::Load() {
490 // Return if debugger is already loaded. 434 // Return if debugger is already loaded.
491 if (is_loaded()) return true; 435 if (is_loaded()) return true;
492 436
493 // Bail out if we're already in the process of compiling the native 437 // Bail out if we're already in the process of compiling the native
494 // JavaScript source code for the debugger. 438 // JavaScript source code for the debugger.
495 if (is_suppressed_) return false; 439 if (is_suppressed_) return false;
496 SuppressDebug while_loading(this); 440 SuppressDebug while_loading(this);
497 441
498 // Disable breakpoints and interrupts while compiling and running the 442 // Disable breakpoints and interrupts while compiling and running the
499 // debugger scripts including the context creation code. 443 // debugger scripts including the context creation code.
500 DisableBreak disable(this, true); 444 DisableBreak disable(this, true);
501 PostponeInterruptsScope postpone(isolate_); 445 PostponeInterruptsScope postpone(isolate_);
502 446
503 // Create the debugger context. 447 // Create the debugger context.
504 HandleScope scope(isolate_); 448 HandleScope scope(isolate_);
505 ExtensionConfiguration no_extensions; 449 ExtensionConfiguration no_extensions;
506 Handle<Context> context = isolate_->bootstrapper()->CreateEnvironment( 450 Handle<Context> context = isolate_->bootstrapper()->CreateEnvironment(
507 MaybeHandle<JSGlobalProxy>(), v8::Local<ObjectTemplate>(), 451 MaybeHandle<JSGlobalProxy>(), v8::Local<ObjectTemplate>(), &no_extensions,
508 &no_extensions); 452 DEBUG_CONTEXT);
509 453
510 // Fail if no context could be created. 454 // Fail if no context could be created.
511 if (context.is_null()) return false; 455 if (context.is_null()) return false;
512 456
513 // Use the debugger context.
514 SaveContext save(isolate_);
515 isolate_->set_context(*context);
516
517 // Expose the builtins object in the debugger context.
518 Handle<String> key = isolate_->factory()->InternalizeOneByteString(
519 STATIC_CHAR_VECTOR("builtins"));
520 Handle<GlobalObject> global =
521 Handle<GlobalObject>(context->global_object(), isolate_);
522 Handle<JSBuiltinsObject> builtin =
523 Handle<JSBuiltinsObject>(global->builtins(), isolate_);
524 RETURN_ON_EXCEPTION_VALUE(
525 isolate_, Object::SetProperty(global, key, builtin, SLOPPY), false);
526
527 // Compile the JavaScript for the debugger in the debugger context.
528 bool caught_exception =
529 !CompileDebuggerScript(isolate_, Natives::GetIndex("mirrors")) ||
530 !CompileDebuggerScript(isolate_, Natives::GetIndex("debug"));
531
532 if (FLAG_enable_liveedit) {
533 caught_exception = caught_exception ||
534 !CompileDebuggerScript(isolate_, Natives::GetIndex("liveedit"));
535 }
536 // Check for caught exceptions.
537 if (caught_exception) return false;
538
539 debug_context_ = Handle<Context>::cast( 457 debug_context_ = Handle<Context>::cast(
540 isolate_->global_handles()->Create(*context)); 458 isolate_->global_handles()->Create(*context));
541 return true; 459 return true;
542 } 460 }
543 461
544 462
545 void Debug::Unload() { 463 void Debug::Unload() {
546 ClearAllBreakPoints(); 464 ClearAllBreakPoints();
547 ClearStepping(); 465 ClearStepping();
548 466
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 HandleScope scope(isolate_); 635 HandleScope scope(isolate_);
718 636
719 // Ignore check if break point object is not a JSObject. 637 // Ignore check if break point object is not a JSObject.
720 if (!break_point_object->IsJSObject()) return true; 638 if (!break_point_object->IsJSObject()) return true;
721 639
722 // Get the function IsBreakPointTriggered (defined in debug.js). 640 // Get the function IsBreakPointTriggered (defined in debug.js).
723 Handle<String> is_break_point_triggered_string = 641 Handle<String> is_break_point_triggered_string =
724 factory->InternalizeOneByteString( 642 factory->InternalizeOneByteString(
725 STATIC_CHAR_VECTOR("IsBreakPointTriggered")); 643 STATIC_CHAR_VECTOR("IsBreakPointTriggered"));
726 Handle<GlobalObject> debug_global(debug_context()->global_object()); 644 Handle<GlobalObject> debug_global(debug_context()->global_object());
727 Handle<JSFunction> check_break_point = 645 Handle<JSFunction> check_break_point = Handle<JSFunction>::cast(
728 Handle<JSFunction>::cast(Object::GetProperty( 646 Object::GetProperty(debug_utils(), is_break_point_triggered_string)
729 debug_global, is_break_point_triggered_string).ToHandleChecked()); 647 .ToHandleChecked());
730 648
731 // Get the break id as an object. 649 // Get the break id as an object.
732 Handle<Object> break_id = factory->NewNumberFromInt(Debug::break_id()); 650 Handle<Object> break_id = factory->NewNumberFromInt(Debug::break_id());
733 651
734 // Call HandleBreakPointx. 652 // Call HandleBreakPointx.
735 Handle<Object> argv[] = { break_id, break_point_object }; 653 Handle<Object> argv[] = { break_id, break_point_object };
736 Handle<Object> result; 654 Handle<Object> result;
737 if (!Execution::TryCall(check_break_point, 655 if (!Execution::TryCall(check_break_point,
738 isolate_->js_builtins_object(), 656 isolate_->js_builtins_object(),
739 arraysize(argv), 657 arraysize(argv),
(...skipping 1000 matching lines...) Expand 10 before | Expand all | Expand 10 after
1740 1658
1741 bool Debug::IsDebugGlobal(GlobalObject* global) { 1659 bool Debug::IsDebugGlobal(GlobalObject* global) {
1742 return is_loaded() && global == debug_context()->global_object(); 1660 return is_loaded() && global == debug_context()->global_object();
1743 } 1661 }
1744 1662
1745 1663
1746 void Debug::ClearMirrorCache() { 1664 void Debug::ClearMirrorCache() {
1747 PostponeInterruptsScope postpone(isolate_); 1665 PostponeInterruptsScope postpone(isolate_);
1748 HandleScope scope(isolate_); 1666 HandleScope scope(isolate_);
1749 AssertDebugContext(); 1667 AssertDebugContext();
1750 Factory* factory = isolate_->factory(); 1668
1751 Handle<GlobalObject> global(isolate_->global_object()); 1669 Handle<Object> fun =
1752 JSObject::SetProperty(global, 1670 Object::GetProperty(isolate_, debug_utils(), "ClearMirrorCache")
1753 factory->NewStringFromAsciiChecked("next_handle_"), 1671 .ToHandleChecked();
1754 handle(Smi::FromInt(0), isolate_), SLOPPY).Check(); 1672 Handle<Object> undefined = isolate_->factory()->undefined_value();
1755 JSObject::SetProperty(global, 1673 Execution::TryCall(Handle<JSFunction>::cast(fun), undefined, 0, NULL);
1756 factory->NewStringFromAsciiChecked("mirror_cache_"),
1757 factory->NewJSArray(0, FAST_ELEMENTS), SLOPPY).Check();
1758 } 1674 }
1759 1675
1760 1676
1761 Handle<FixedArray> Debug::GetLoadedScripts() { 1677 Handle<FixedArray> Debug::GetLoadedScripts() {
1762 // Create and fill the script cache when the loaded scripts is requested for 1678 // Create and fill the script cache when the loaded scripts is requested for
1763 // the first time. 1679 // the first time.
1764 if (script_cache_ == NULL) script_cache_ = new ScriptCache(isolate_); 1680 if (script_cache_ == NULL) script_cache_ = new ScriptCache(isolate_);
1765 1681
1766 // Perform GC to get unreferenced scripts evicted from the cache before 1682 // Perform GC to get unreferenced scripts evicted from the cache before
1767 // returning the content. 1683 // returning the content.
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1824 script->set_eval_from_instructions_offset(Smi::FromInt(offset)); 1740 script->set_eval_from_instructions_offset(Smi::FromInt(offset));
1825 } 1741 }
1826 } 1742 }
1827 1743
1828 1744
1829 MaybeHandle<Object> Debug::MakeJSObject(const char* constructor_name, 1745 MaybeHandle<Object> Debug::MakeJSObject(const char* constructor_name,
1830 int argc, 1746 int argc,
1831 Handle<Object> argv[]) { 1747 Handle<Object> argv[]) {
1832 AssertDebugContext(); 1748 AssertDebugContext();
1833 // Create the execution state object. 1749 // Create the execution state object.
1834 Handle<GlobalObject> global(isolate_->global_object()); 1750 Handle<Object> constructor =
1835 Handle<Object> constructor = Object::GetProperty( 1751 Object::GetProperty(isolate_, debug_utils(), constructor_name)
1836 isolate_, global, constructor_name).ToHandleChecked(); 1752 .ToHandleChecked();
1837 DCHECK(constructor->IsJSFunction()); 1753 DCHECK(constructor->IsJSFunction());
1838 if (!constructor->IsJSFunction()) return MaybeHandle<Object>(); 1754 if (!constructor->IsJSFunction()) return MaybeHandle<Object>();
1839 // We do not handle interrupts here. In particular, termination interrupts. 1755 // We do not handle interrupts here. In particular, termination interrupts.
1840 PostponeInterruptsScope no_interrupts(isolate_); 1756 PostponeInterruptsScope no_interrupts(isolate_);
1841 return Execution::TryCall(Handle<JSFunction>::cast(constructor), 1757 return Execution::TryCall(Handle<JSFunction>::cast(constructor),
1842 handle(debug_context()->global_proxy()), 1758 handle(debug_context()->global_proxy()),
1843 argc, 1759 argc,
1844 argv); 1760 argv);
1845 } 1761 }
1846 1762
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
2054 } 1970 }
2055 1971
2056 HandleScope scope(isolate_); 1972 HandleScope scope(isolate_);
2057 DebugScope debug_scope(this); 1973 DebugScope debug_scope(this);
2058 if (debug_scope.failed()) return; 1974 if (debug_scope.failed()) return;
2059 1975
2060 // If debugging there might be script break points registered for this 1976 // If debugging there might be script break points registered for this
2061 // script. Make sure that these break points are set. 1977 // script. Make sure that these break points are set.
2062 1978
2063 // Get the function UpdateScriptBreakPoints (defined in debug.js). 1979 // Get the function UpdateScriptBreakPoints (defined in debug.js).
2064 Handle<String> update_script_break_points_string =
2065 isolate_->factory()->InternalizeOneByteString(
2066 STATIC_CHAR_VECTOR("UpdateScriptBreakPoints"));
2067 Handle<GlobalObject> debug_global(debug_context()->global_object());
2068 Handle<Object> update_script_break_points = 1980 Handle<Object> update_script_break_points =
2069 Object::GetProperty( 1981 Object::GetProperty(isolate_, debug_utils(), "UpdateScriptBreakPoints")
2070 debug_global, update_script_break_points_string).ToHandleChecked(); 1982 .ToHandleChecked();
2071 if (!update_script_break_points->IsJSFunction()) { 1983 if (!update_script_break_points->IsJSFunction()) {
2072 return; 1984 return;
2073 } 1985 }
2074 DCHECK(update_script_break_points->IsJSFunction()); 1986 DCHECK(update_script_break_points->IsJSFunction());
2075 1987
2076 // Wrap the script object in a proper JS object before passing it 1988 // Wrap the script object in a proper JS object before passing it
2077 // to JavaScript. 1989 // to JavaScript.
2078 Handle<Object> wrapper = Script::GetWrapper(script); 1990 Handle<Object> wrapper = Script::GetWrapper(script);
2079 1991
2080 // Call UpdateScriptBreakPoints expect no exceptions. 1992 // Call UpdateScriptBreakPoints expect no exceptions.
(...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after
2803 } 2715 }
2804 2716
2805 2717
2806 void LockingCommandMessageQueue::Clear() { 2718 void LockingCommandMessageQueue::Clear() {
2807 base::LockGuard<base::Mutex> lock_guard(&mutex_); 2719 base::LockGuard<base::Mutex> lock_guard(&mutex_);
2808 queue_.Clear(); 2720 queue_.Clear();
2809 } 2721 }
2810 2722
2811 } // namespace internal 2723 } // namespace internal
2812 } // namespace v8 2724 } // namespace v8
OLDNEW
« no previous file with comments | « src/debug/debug.h ('k') | src/debug/debug.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698