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

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

Issue 102453002: VM debugger: fix closures in mixed-in functions (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years 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 | « no previous file | runtime/vm/object.cc » ('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 2008 matching lines...) Expand 10 before | Expand all | Expand 10 after
2019 // debugger wire protocol messages. 2019 // debugger wire protocol messages.
2020 isolate_id_ = isolate->main_port(); 2020 isolate_id_ = isolate->main_port();
2021 initialized_ = true; 2021 initialized_ = true;
2022 2022
2023 // Signal isolate creation event. 2023 // Signal isolate creation event.
2024 SignalIsolateEvent(Debugger::kIsolateCreated); 2024 SignalIsolateEvent(Debugger::kIsolateCreated);
2025 } 2025 }
2026 2026
2027 2027
2028 static RawFunction* GetOriginalFunction(const Function& func) { 2028 static RawFunction* GetOriginalFunction(const Function& func) {
2029 if (func.IsClosureFunction()) {
2030 // Local functions (closures) in mixin functions do not have
2031 // an original function they were cloned from.
2032 // Note: this is a problem when a breakpoint is set in a mixed-in
2033 // closure. The breakpoint is linked to the closure attached to the
2034 // mixin application class, not the mixin class. When the same
2035 // closure is compiled for another mixin application class, we
2036 // don't find the breakpoint since we'll be looking in the
2037 // mixin class.
2038 return func.raw();
2039 }
2029 const Class& origin_class = Class::Handle(func.origin()); 2040 const Class& origin_class = Class::Handle(func.origin());
2030 if (origin_class.is_patch()) { 2041 if (origin_class.is_patch()) {
2031 // Patched functions from patch classes are removed from the 2042 // Patched functions from patch classes are removed from the
2032 // function array of the patch class, so we will not find an 2043 // function array of the patch class, so we will not find an
2033 // original function object. 2044 // original function object.
2034 return func.raw(); 2045 return func.raw();
2035 } 2046 }
2036 const Array& functions = Array::Handle(origin_class.functions()); 2047 const Array& functions = Array::Handle(origin_class.functions());
2037 Object& orig_func = Object::Handle(); 2048 Object& orig_func = Object::Handle();
2038 for (intptr_t i = 0; i < functions.Length(); i++) { 2049 for (intptr_t i = 0; i < functions.Length(); i++) {
(...skipping 27 matching lines...) Expand all
2066 if (lookup_function.Owner() != lookup_function.origin()) { 2077 if (lookup_function.Owner() != lookup_function.origin()) {
2067 // This is a cloned function from a mixin class. If a breakpoint 2078 // This is a cloned function from a mixin class. If a breakpoint
2068 // was set in this function, it is registered using the function 2079 // was set in this function, it is registered using the function
2069 // of the origin class. 2080 // of the origin class.
2070 lookup_function = GetOriginalFunction(lookup_function); 2081 lookup_function = GetOriginalFunction(lookup_function);
2071 } 2082 }
2072 SourceBreakpoint* bpt = src_breakpoints_; 2083 SourceBreakpoint* bpt = src_breakpoints_;
2073 while (bpt != NULL) { 2084 while (bpt != NULL) {
2074 if (lookup_function.raw() == bpt->function()) { 2085 if (lookup_function.raw() == bpt->function()) {
2075 // Check if the breakpoint is inside a closure or local function 2086 // Check if the breakpoint is inside a closure or local function
2076 // within the newly compiled function. 2087 // within the newly compiled function. Note that we must look
2077 Class& owner = Class::Handle(lookup_function.Owner()); 2088 // in the owner class of the function that just got compiled
2089 // (i.e. func), not the owner class of the function we use to
2090 // record the breakpoint (lookup_function).
2091 Class& owner = Class::Handle(func.Owner());
2078 Function& closure = 2092 Function& closure =
2079 Function::Handle(owner.LookupClosureFunction(bpt->token_pos())); 2093 Function::Handle(owner.LookupClosureFunction(bpt->token_pos()));
2080 if (!closure.IsNull() && (closure.raw() != lookup_function.raw())) { 2094 if (!closure.IsNull() && (closure.raw() != lookup_function.raw())) {
2081 if (FLAG_verbose_debug) { 2095 if (FLAG_verbose_debug) {
2082 OS::Print("Resetting pending breakpoint to function %s\n", 2096 OS::Print("Resetting pending breakpoint to function %s\n",
2083 closure.ToFullyQualifiedCString()); 2097 closure.ToFullyQualifiedCString());
2084 } 2098 }
2085 bpt->set_function(closure); 2099 bpt->set_function(closure);
2086 } else { 2100 } else {
2087 if (FLAG_verbose_debug) { 2101 if (FLAG_verbose_debug) {
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
2226 } 2240 }
2227 2241
2228 2242
2229 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { 2243 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) {
2230 ASSERT(bpt->next() == NULL); 2244 ASSERT(bpt->next() == NULL);
2231 bpt->set_next(code_breakpoints_); 2245 bpt->set_next(code_breakpoints_);
2232 code_breakpoints_ = bpt; 2246 code_breakpoints_ = bpt;
2233 } 2247 }
2234 2248
2235 } // namespace dart 2249 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698