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

Side by Side Diff: runtime/vm/debugger.cc

Issue 18750004: Faster invocation of fields as methods. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « runtime/vm/debugger.h ('k') | runtime/vm/object.h » ('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 (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/debugger.h" 5 #include "vm/debugger.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 8
9 #include "vm/code_generator.h" 9 #include "vm/code_generator.h"
10 #include "vm/code_patcher.h" 10 #include "vm/code_patcher.h"
(...skipping 917 matching lines...) Expand 10 before | Expand all | Expand 10 after
928 } 928 }
929 } 929 }
930 930
931 931
932 DebuggerStackTrace* Debugger::CollectStackTrace() { 932 DebuggerStackTrace* Debugger::CollectStackTrace() {
933 Isolate* isolate = Isolate::Current(); 933 Isolate* isolate = Isolate::Current();
934 DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8); 934 DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8);
935 Context& ctx = Context::Handle(isolate->top_context()); 935 Context& ctx = Context::Handle(isolate->top_context());
936 Code& code = Code::Handle(isolate); 936 Code& code = Code::Handle(isolate);
937 StackFrameIterator iterator(false); 937 StackFrameIterator iterator(false);
938 StackFrame* frame = iterator.NextFrame();
939 ActivationFrame* callee_activation = NULL; 938 ActivationFrame* callee_activation = NULL;
940 bool optimized_frame_found = false; 939 bool optimized_frame_found = false;
941 while (frame != NULL) { 940 for (StackFrame* frame = iterator.NextFrame();
941 frame != NULL;
942 frame = iterator.NextFrame()) {
942 ASSERT(frame->IsValid()); 943 ASSERT(frame->IsValid());
943 if (frame->IsDartFrame()) { 944 if (frame->IsDartFrame()) {
944 code = frame->LookupDartCode(); 945 code = frame->LookupDartCode();
945 ActivationFrame* activation = 946 ActivationFrame* activation =
946 new ActivationFrame(frame->pc(), frame->fp(), frame->sp(), code); 947 new ActivationFrame(frame->pc(), frame->fp(), frame->sp(), code);
948 // Check if frame is a debuggable function.
949 if (!IsDebuggable(activation->function())) {
950 continue;
951 }
947 // If this activation frame called a closure, the function has 952 // If this activation frame called a closure, the function has
948 // saved its context before the call. 953 // saved its context before the call.
949 if ((callee_activation != NULL) && 954 if ((callee_activation != NULL) &&
950 (callee_activation->function().IsClosureFunction())) { 955 (callee_activation->function().IsClosureFunction())) {
951 ctx = activation->GetSavedCurrentContext(); 956 ctx = activation->GetSavedCurrentContext();
952 if (FLAG_verbose_debug && ctx.IsNull()) { 957 if (FLAG_verbose_debug && ctx.IsNull()) {
953 const Function& caller = activation->function(); 958 const Function& caller = activation->function();
954 const Function& callee = callee_activation->function(); 959 const Function& callee = callee_activation->function();
955 const Script& script = 960 const Script& script =
956 Script::Handle(Class::Handle(caller.Owner()).script()); 961 Script::Handle(Class::Handle(caller.Owner()).script());
(...skipping 16 matching lines...) Expand all
973 activation->SetContext(ctx); 978 activation->SetContext(ctx);
974 } 979 }
975 stack_trace->AddActivation(activation); 980 stack_trace->AddActivation(activation);
976 callee_activation = activation; 981 callee_activation = activation;
977 // Get caller's context if this function saved it on entry. 982 // Get caller's context if this function saved it on entry.
978 ctx = activation->GetSavedEntryContext(ctx); 983 ctx = activation->GetSavedEntryContext(ctx);
979 } else if (frame->IsEntryFrame()) { 984 } else if (frame->IsEntryFrame()) {
980 ctx = reinterpret_cast<EntryFrame*>(frame)->SavedContext(); 985 ctx = reinterpret_cast<EntryFrame*>(frame)->SavedContext();
981 callee_activation = NULL; 986 callee_activation = NULL;
982 } 987 }
983 frame = iterator.NextFrame();
984 } 988 }
985 return stack_trace; 989 return stack_trace;
986 } 990 }
987 991
988 992
989 ActivationFrame* Debugger::TopDartFrame() const { 993 ActivationFrame* Debugger::TopDartFrame() const {
990 StackFrameIterator iterator(false); 994 StackFrameIterator iterator(false);
991 StackFrame* frame = iterator.NextFrame(); 995 StackFrame* frame = iterator.NextFrame();
992 while ((frame != NULL) && !frame->IsDartFrame()) { 996 while ((frame != NULL) && !frame->IsDartFrame()) {
993 frame = iterator.NextFrame(); 997 frame = iterator.NextFrame();
(...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after
1527 event_handler_ = handler; 1531 event_handler_ = handler;
1528 } 1532 }
1529 1533
1530 1534
1531 bool Debugger::IsDebuggable(const Function& func) { 1535 bool Debugger::IsDebuggable(const Function& func) {
1532 RawFunction::Kind fkind = func.kind(); 1536 RawFunction::Kind fkind = func.kind();
1533 if ((fkind == RawFunction::kImplicitGetter) || 1537 if ((fkind == RawFunction::kImplicitGetter) ||
1534 (fkind == RawFunction::kImplicitSetter) || 1538 (fkind == RawFunction::kImplicitSetter) ||
1535 (fkind == RawFunction::kConstImplicitGetter) || 1539 (fkind == RawFunction::kConstImplicitGetter) ||
1536 (fkind == RawFunction::kMethodExtractor) || 1540 (fkind == RawFunction::kMethodExtractor) ||
1537 (fkind == RawFunction::kNoSuchMethodDispatcher)) { 1541 (fkind == RawFunction::kNoSuchMethodDispatcher) ||
1542 (fkind == RawFunction::kInvokeFieldDispatcher)) {
1538 return false; 1543 return false;
1539 } 1544 }
1540 const Class& cls = Class::Handle(func.Owner()); 1545 const Class& cls = Class::Handle(func.Owner());
1541 const Library& lib = Library::Handle(cls.library()); 1546 const Library& lib = Library::Handle(cls.library());
1542 return lib.IsDebuggable(); 1547 return lib.IsDebuggable();
1543 } 1548 }
1544 1549
1545 1550
1546 void Debugger::SignalPausedEvent(ActivationFrame* top_frame) { 1551 void Debugger::SignalPausedEvent(ActivationFrame* top_frame) {
1547 resume_action_ = kContinue; 1552 resume_action_ = kContinue;
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
1855 } 1860 }
1856 1861
1857 1862
1858 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { 1863 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) {
1859 ASSERT(bpt->next() == NULL); 1864 ASSERT(bpt->next() == NULL);
1860 bpt->set_next(code_breakpoints_); 1865 bpt->set_next(code_breakpoints_);
1861 code_breakpoints_ = bpt; 1866 code_breakpoints_ = bpt;
1862 } 1867 }
1863 1868
1864 } // namespace dart 1869 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/debugger.h ('k') | runtime/vm/object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698