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

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

Issue 1168933002: Fixes crashes in VM isolate shutdown. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Add asserts Created 5 years, 6 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
« runtime/vm/isolate.cc ('K') | « runtime/vm/parser_test.cc ('k') | no next file » | 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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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/service.h" 5 #include "vm/service.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/globals.h" 8 #include "platform/globals.h"
9 9
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 762 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 773
774 774
775 static const MethodParameter* get_stack_params[] = { 775 static const MethodParameter* get_stack_params[] = {
776 ISOLATE_PARAMETER, 776 ISOLATE_PARAMETER,
777 new BoolParameter("_full", false), 777 new BoolParameter("_full", false),
778 NULL, 778 NULL,
779 }; 779 };
780 780
781 781
782 static bool GetStack(Isolate* isolate, JSONStream* js) { 782 static bool GetStack(Isolate* isolate, JSONStream* js) {
783 ASSERT(isolate->debugger() != NULL);
783 DebuggerStackTrace* stack = isolate->debugger()->StackTrace(); 784 DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
784 // Do we want the complete script object and complete local variable objects? 785 // Do we want the complete script object and complete local variable objects?
785 // This is true for dump requests. 786 // This is true for dump requests.
786 const bool full = BoolParameter::Parse(js->LookupParam("_full"), false); 787 const bool full = BoolParameter::Parse(js->LookupParam("_full"), false);
787 JSONObject jsobj(js); 788 JSONObject jsobj(js);
788 jsobj.AddProperty("type", "Stack"); 789 jsobj.AddProperty("type", "Stack");
789 { 790 {
790 JSONArray jsarr(&jsobj, "frames"); 791 JSONArray jsarr(&jsobj, "frames");
791 792
792 intptr_t num_frames = stack->Length(); 793 intptr_t num_frames = stack->Length();
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after
1248 jsobj.AddProperty("valueAsString", "<free>"); 1249 jsobj.AddProperty("valueAsString", "<free>");
1249 break; 1250 break;
1250 default: 1251 default:
1251 UNIMPLEMENTED(); 1252 UNIMPLEMENTED();
1252 break; 1253 break;
1253 } 1254 }
1254 } 1255 }
1255 1256
1256 1257
1257 static Breakpoint* LookupBreakpoint(Isolate* isolate, const char* id) { 1258 static Breakpoint* LookupBreakpoint(Isolate* isolate, const char* id) {
1259 ASSERT(isolate->debugger() != NULL);
1258 size_t end_pos = strcspn(id, "/"); 1260 size_t end_pos = strcspn(id, "/");
1259 if (end_pos == strlen(id)) { 1261 if (end_pos == strlen(id)) {
1260 return NULL; 1262 return NULL;
1261 } 1263 }
1262 const char* rest = id + end_pos + 1; // +1 for '/'. 1264 const char* rest = id + end_pos + 1; // +1 for '/'.
1263 if (strncmp("breakpoints", id, end_pos) == 0) { 1265 if (strncmp("breakpoints", id, end_pos) == 0) {
1264 intptr_t bpt_id = 0; 1266 intptr_t bpt_id = 0;
1265 Breakpoint* bpt = NULL; 1267 Breakpoint* bpt = NULL;
1266 if (GetIntegerId(rest, &bpt_id)) { 1268 if (GetIntegerId(rest, &bpt_id)) {
1267 bpt = isolate->debugger()->GetBreakpointById(bpt_id); 1269 bpt = isolate->debugger()->GetBreakpointById(bpt_id);
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
1614 1616
1615 static const MethodParameter* evaluate_in_frame_params[] = { 1617 static const MethodParameter* evaluate_in_frame_params[] = {
1616 ISOLATE_PARAMETER, 1618 ISOLATE_PARAMETER,
1617 new UIntParameter("frameIndex", true), 1619 new UIntParameter("frameIndex", true),
1618 new MethodParameter("expression", true), 1620 new MethodParameter("expression", true),
1619 NULL, 1621 NULL,
1620 }; 1622 };
1621 1623
1622 1624
1623 static bool EvaluateInFrame(Isolate* isolate, JSONStream* js) { 1625 static bool EvaluateInFrame(Isolate* isolate, JSONStream* js) {
1626 ASSERT(isolate->debugger() != NULL);
1624 DebuggerStackTrace* stack = isolate->debugger()->StackTrace(); 1627 DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
1625 intptr_t framePos = UIntParameter::Parse(js->LookupParam("frameIndex")); 1628 intptr_t framePos = UIntParameter::Parse(js->LookupParam("frameIndex"));
1626 if (framePos > stack->Length()) { 1629 if (framePos > stack->Length()) {
1627 PrintInvalidParamError(js, "frameIndex"); 1630 PrintInvalidParamError(js, "frameIndex");
1628 return true; 1631 return true;
1629 } 1632 }
1630 ActivationFrame* frame = stack->FrameAt(framePos); 1633 ActivationFrame* frame = stack->FrameAt(framePos);
1631 1634
1632 const char* expr = js->LookupParam("expression"); 1635 const char* expr = js->LookupParam("expression");
1633 const String& expr_str = String::Handle(isolate, String::New(expr)); 1636 const String& expr_str = String::Handle(isolate, String::New(expr));
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
1849 1852
1850 static const MethodParameter* add_breakpoint_params[] = { 1853 static const MethodParameter* add_breakpoint_params[] = {
1851 ISOLATE_PARAMETER, 1854 ISOLATE_PARAMETER,
1852 new IdParameter("scriptId", true), 1855 new IdParameter("scriptId", true),
1853 new UIntParameter("line", true), 1856 new UIntParameter("line", true),
1854 NULL, 1857 NULL,
1855 }; 1858 };
1856 1859
1857 1860
1858 static bool AddBreakpoint(Isolate* isolate, JSONStream* js) { 1861 static bool AddBreakpoint(Isolate* isolate, JSONStream* js) {
1862 ASSERT(isolate->debugger() != NULL);
1859 const char* line_param = js->LookupParam("line"); 1863 const char* line_param = js->LookupParam("line");
1860 intptr_t line = UIntParameter::Parse(line_param); 1864 intptr_t line = UIntParameter::Parse(line_param);
1861 const char* script_id = js->LookupParam("scriptId"); 1865 const char* script_id = js->LookupParam("scriptId");
1862 Object& obj = Object::Handle(LookupHeapObject(isolate, script_id, NULL)); 1866 Object& obj = Object::Handle(LookupHeapObject(isolate, script_id, NULL));
1863 if (obj.raw() == Object::sentinel().raw() || !obj.IsScript()) { 1867 if (obj.raw() == Object::sentinel().raw() || !obj.IsScript()) {
1864 PrintInvalidParamError(js, "scriptId"); 1868 PrintInvalidParamError(js, "scriptId");
1865 return true; 1869 return true;
1866 } 1870 }
1867 const Script& script = Script::Cast(obj); 1871 const Script& script = Script::Cast(obj);
1868 const String& script_url = String::Handle(script.url()); 1872 const String& script_url = String::Handle(script.url());
(...skipping 11 matching lines...) Expand all
1880 1884
1881 1885
1882 static const MethodParameter* add_breakpoint_at_entry_params[] = { 1886 static const MethodParameter* add_breakpoint_at_entry_params[] = {
1883 ISOLATE_PARAMETER, 1887 ISOLATE_PARAMETER,
1884 new IdParameter("functionId", true), 1888 new IdParameter("functionId", true),
1885 NULL, 1889 NULL,
1886 }; 1890 };
1887 1891
1888 1892
1889 static bool AddBreakpointAtEntry(Isolate* isolate, JSONStream* js) { 1893 static bool AddBreakpointAtEntry(Isolate* isolate, JSONStream* js) {
1894 ASSERT(isolate->debugger() != NULL);
1890 const char* function_id = js->LookupParam("functionId"); 1895 const char* function_id = js->LookupParam("functionId");
1891 Object& obj = Object::Handle(LookupHeapObject(isolate, function_id, NULL)); 1896 Object& obj = Object::Handle(LookupHeapObject(isolate, function_id, NULL));
1892 if (obj.raw() == Object::sentinel().raw() || !obj.IsFunction()) { 1897 if (obj.raw() == Object::sentinel().raw() || !obj.IsFunction()) {
1893 PrintInvalidParamError(js, "functionId"); 1898 PrintInvalidParamError(js, "functionId");
1894 return true; 1899 return true;
1895 } 1900 }
1896 const Function& function = Function::Cast(obj); 1901 const Function& function = Function::Cast(obj);
1897 Breakpoint* bpt = 1902 Breakpoint* bpt =
1898 isolate->debugger()->SetBreakpointAtEntry(function, false); 1903 isolate->debugger()->SetBreakpointAtEntry(function, false);
1899 if (bpt == NULL) { 1904 if (bpt == NULL) {
1900 js->PrintError(kCannotAddBreakpoint, 1905 js->PrintError(kCannotAddBreakpoint,
1901 "%s: Cannot add breakpoint at function '%s'", 1906 "%s: Cannot add breakpoint at function '%s'",
1902 js->method(), function.ToCString()); 1907 js->method(), function.ToCString());
1903 return true; 1908 return true;
1904 } 1909 }
1905 bpt->PrintJSON(js); 1910 bpt->PrintJSON(js);
1906 return true; 1911 return true;
1907 } 1912 }
1908 1913
1909 1914
1910 static const MethodParameter* add_breakpoint_at_activation_params[] = { 1915 static const MethodParameter* add_breakpoint_at_activation_params[] = {
1911 ISOLATE_PARAMETER, 1916 ISOLATE_PARAMETER,
1912 new IdParameter("objectId", true), 1917 new IdParameter("objectId", true),
1913 NULL, 1918 NULL,
1914 }; 1919 };
1915 1920
1916 1921
1917 static bool AddBreakpointAtActivation(Isolate* isolate, JSONStream* js) { 1922 static bool AddBreakpointAtActivation(Isolate* isolate, JSONStream* js) {
1923 ASSERT(isolate->debugger() != NULL);
1918 const char* object_id = js->LookupParam("objectId"); 1924 const char* object_id = js->LookupParam("objectId");
1919 Object& obj = Object::Handle(LookupHeapObject(isolate, object_id, NULL)); 1925 Object& obj = Object::Handle(LookupHeapObject(isolate, object_id, NULL));
1920 if (obj.raw() == Object::sentinel().raw() || !obj.IsInstance()) { 1926 if (obj.raw() == Object::sentinel().raw() || !obj.IsInstance()) {
1921 PrintInvalidParamError(js, "objectId"); 1927 PrintInvalidParamError(js, "objectId");
1922 return true; 1928 return true;
1923 } 1929 }
1924 const Instance& closure = Instance::Cast(obj); 1930 const Instance& closure = Instance::Cast(obj);
1925 Breakpoint* bpt = 1931 Breakpoint* bpt =
1926 isolate->debugger()->SetBreakpointAtActivation(closure); 1932 isolate->debugger()->SetBreakpointAtActivation(closure);
1927 if (bpt == NULL) { 1933 if (bpt == NULL) {
1928 js->PrintError(kCannotAddBreakpoint, 1934 js->PrintError(kCannotAddBreakpoint,
1929 "%s: Cannot add breakpoint at activation", 1935 "%s: Cannot add breakpoint at activation",
1930 js->method()); 1936 js->method());
1931 return true; 1937 return true;
1932 } 1938 }
1933 bpt->PrintJSON(js); 1939 bpt->PrintJSON(js);
1934 return true; 1940 return true;
1935 } 1941 }
1936 1942
1937 1943
1938 static const MethodParameter* remove_breakpoint_params[] = { 1944 static const MethodParameter* remove_breakpoint_params[] = {
1939 ISOLATE_PARAMETER, 1945 ISOLATE_PARAMETER,
1940 NULL, 1946 NULL,
1941 }; 1947 };
1942 1948
1943 1949
1944 static bool RemoveBreakpoint(Isolate* isolate, JSONStream* js) { 1950 static bool RemoveBreakpoint(Isolate* isolate, JSONStream* js) {
1951 ASSERT(isolate->debugger() != NULL);
1945 if (!js->HasParam("breakpointId")) { 1952 if (!js->HasParam("breakpointId")) {
1946 PrintMissingParamError(js, "breakpointId"); 1953 PrintMissingParamError(js, "breakpointId");
1947 return true; 1954 return true;
1948 } 1955 }
1949 const char* bpt_id = js->LookupParam("breakpointId"); 1956 const char* bpt_id = js->LookupParam("breakpointId");
1950 Breakpoint* bpt = LookupBreakpoint(isolate, bpt_id); 1957 Breakpoint* bpt = LookupBreakpoint(isolate, bpt_id);
1951 if (bpt == NULL) { 1958 if (bpt == NULL) {
1952 PrintInvalidParamError(js, "breakpointId"); 1959 PrintInvalidParamError(js, "breakpointId");
1953 return true; 1960 return true;
1954 } 1961 }
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
2140 } 2147 }
2141 2148
2142 2149
2143 static const MethodParameter* resume_params[] = { 2150 static const MethodParameter* resume_params[] = {
2144 ISOLATE_PARAMETER, 2151 ISOLATE_PARAMETER,
2145 NULL, 2152 NULL,
2146 }; 2153 };
2147 2154
2148 2155
2149 static bool Resume(Isolate* isolate, JSONStream* js) { 2156 static bool Resume(Isolate* isolate, JSONStream* js) {
2157 ASSERT(isolate->debugger() != NULL);
2150 const char* step_param = js->LookupParam("step"); 2158 const char* step_param = js->LookupParam("step");
2151 if (isolate->message_handler()->paused_on_start()) { 2159 if (isolate->message_handler()->paused_on_start()) {
2152 isolate->message_handler()->set_pause_on_start(false); 2160 isolate->message_handler()->set_pause_on_start(false);
2153 if (Service::NeedsDebugEvents()) { 2161 if (Service::NeedsDebugEvents()) {
2154 ServiceEvent event(isolate, ServiceEvent::kResume); 2162 ServiceEvent event(isolate, ServiceEvent::kResume);
2155 Service::HandleEvent(&event); 2163 Service::HandleEvent(&event);
2156 } 2164 }
2157 PrintSuccess(js); 2165 PrintSuccess(js);
2158 return true; 2166 return true;
2159 } 2167 }
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after
2798 ServiceMethodDescriptor& method = service_methods_[i]; 2806 ServiceMethodDescriptor& method = service_methods_[i];
2799 if (strcmp(method_name, method.name) == 0) { 2807 if (strcmp(method_name, method.name) == 0) {
2800 return &method; 2808 return &method;
2801 } 2809 }
2802 } 2810 }
2803 return NULL; 2811 return NULL;
2804 } 2812 }
2805 2813
2806 2814
2807 } // namespace dart 2815 } // namespace dart
OLDNEW
« runtime/vm/isolate.cc ('K') | « runtime/vm/parser_test.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698