Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/isolate.h" | 5 #include "vm/isolate.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 #include "platform/json.h" | 9 #include "platform/json.h" |
| 10 #include "vm/code_observers.h" | 10 #include "vm/code_observers.h" |
| (...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 485 } else { | 485 } else { |
| 486 const Object& result = Object::Handle(zone, | 486 const Object& result = Object::Handle(zone, |
| 487 DartLibraryCalls::HandleMessage(msg_handler, msg)); | 487 DartLibraryCalls::HandleMessage(msg_handler, msg)); |
| 488 if (result.IsError()) { | 488 if (result.IsError()) { |
| 489 success = ProcessUnhandledException(Error::Cast(result)); | 489 success = ProcessUnhandledException(Error::Cast(result)); |
| 490 } else { | 490 } else { |
| 491 ASSERT(result.IsNull()); | 491 ASSERT(result.IsNull()); |
| 492 } | 492 } |
| 493 } | 493 } |
| 494 delete message; | 494 delete message; |
| 495 if (success) { | |
| 496 const Object& result = | |
| 497 Object::Handle(zone, I->InvokePendingExtensionCalls()); | |
| 498 if (result.IsError()) { | |
| 499 success = ProcessUnhandledException(Error::Cast(result)); | |
| 500 } else { | |
| 501 ASSERT(result.IsNull()); | |
| 502 } | |
| 503 } | |
| 495 return success; | 504 return success; |
| 496 } | 505 } |
| 497 | 506 |
| 498 | 507 |
| 499 void IsolateMessageHandler::NotifyPauseOnStart() { | 508 void IsolateMessageHandler::NotifyPauseOnStart() { |
| 500 if (Service::debug_stream.enabled()) { | 509 if (Service::debug_stream.enabled()) { |
| 501 StartIsolateScope start_isolate(isolate()); | 510 StartIsolateScope start_isolate(isolate()); |
| 502 StackZone zone(I); | 511 StackZone zone(I); |
| 503 HandleScope handle_scope(I); | 512 HandleScope handle_scope(I); |
| 504 ServiceEvent pause_event(isolate(), ServiceEvent::kPauseStart); | 513 ServiceEvent pause_event(isolate(), ServiceEvent::kPauseStart); |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 689 last_allocationprofile_accumulator_reset_timestamp_(0), | 698 last_allocationprofile_accumulator_reset_timestamp_(0), |
| 690 last_allocationprofile_gc_timestamp_(0), | 699 last_allocationprofile_gc_timestamp_(0), |
| 691 object_id_ring_(NULL), | 700 object_id_ring_(NULL), |
| 692 trace_buffer_(NULL), | 701 trace_buffer_(NULL), |
| 693 profiler_data_(NULL), | 702 profiler_data_(NULL), |
| 694 tag_table_(GrowableObjectArray::null()), | 703 tag_table_(GrowableObjectArray::null()), |
| 695 current_tag_(UserTag::null()), | 704 current_tag_(UserTag::null()), |
| 696 default_tag_(UserTag::null()), | 705 default_tag_(UserTag::null()), |
| 697 collected_closures_(GrowableObjectArray::null()), | 706 collected_closures_(GrowableObjectArray::null()), |
| 698 deoptimized_code_array_(GrowableObjectArray::null()), | 707 deoptimized_code_array_(GrowableObjectArray::null()), |
| 708 pending_extension_calls_(GrowableObjectArray::null()), | |
| 709 registered_extension_handlers_(GrowableObjectArray::null()), | |
| 699 metrics_list_head_(NULL), | 710 metrics_list_head_(NULL), |
| 700 compilation_allowed_(true), | 711 compilation_allowed_(true), |
| 701 cha_(NULL), | 712 cha_(NULL), |
| 702 next_(NULL), | 713 next_(NULL), |
| 703 pause_loop_monitor_(NULL), | 714 pause_loop_monitor_(NULL), |
| 704 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) | 715 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) |
| 705 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) | 716 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) |
| 706 reusable_handles_() { | 717 reusable_handles_() { |
| 707 flags_.CopyFrom(api_flags); | 718 flags_.CopyFrom(api_flags); |
| 708 set_vm_tag(VMTag::kEmbedderTagId); | 719 set_vm_tag(VMTag::kEmbedderTagId); |
| (...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1617 // Visit the tag table which is stored in the isolate. | 1628 // Visit the tag table which is stored in the isolate. |
| 1618 visitor->VisitPointer(reinterpret_cast<RawObject**>(&tag_table_)); | 1629 visitor->VisitPointer(reinterpret_cast<RawObject**>(&tag_table_)); |
| 1619 | 1630 |
| 1620 // Visit array of closures pending precompilation. | 1631 // Visit array of closures pending precompilation. |
| 1621 visitor->VisitPointer(reinterpret_cast<RawObject**>(&collected_closures_)); | 1632 visitor->VisitPointer(reinterpret_cast<RawObject**>(&collected_closures_)); |
| 1622 | 1633 |
| 1623 // Visit the deoptimized code array which is stored in the isolate. | 1634 // Visit the deoptimized code array which is stored in the isolate. |
| 1624 visitor->VisitPointer( | 1635 visitor->VisitPointer( |
| 1625 reinterpret_cast<RawObject**>(&deoptimized_code_array_)); | 1636 reinterpret_cast<RawObject**>(&deoptimized_code_array_)); |
| 1626 | 1637 |
| 1638 // Visit the pending service extension calls. | |
| 1639 visitor->VisitPointer( | |
| 1640 reinterpret_cast<RawObject**>(&pending_extension_calls_)); | |
| 1641 | |
| 1627 // Visit objects in the debugger. | 1642 // Visit objects in the debugger. |
| 1628 debugger()->VisitObjectPointers(visitor); | 1643 debugger()->VisitObjectPointers(visitor); |
| 1629 | 1644 |
| 1630 // Visit objects that are being used for deoptimization. | 1645 // Visit objects that are being used for deoptimization. |
| 1631 if (deopt_context() != NULL) { | 1646 if (deopt_context() != NULL) { |
| 1632 deopt_context()->VisitObjectPointers(visitor); | 1647 deopt_context()->VisitObjectPointers(visitor); |
| 1633 } | 1648 } |
| 1634 | 1649 |
| 1635 // Visit objects in thread registry (e.g., Dart stack, handles in zones). | 1650 // Visit objects in thread registry (e.g., Dart stack, handles in zones). |
| 1636 thread_registry()->VisitObjectPointers(visitor, validate_frames); | 1651 thread_registry()->VisitObjectPointers(visitor, validate_frames); |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1838 if (deoptimized_code.IsNull()) { | 1853 if (deoptimized_code.IsNull()) { |
| 1839 // Not tracking deoptimized code. | 1854 // Not tracking deoptimized code. |
| 1840 return; | 1855 return; |
| 1841 } | 1856 } |
| 1842 // TODO(johnmccutchan): Scan this array and the isolate's profile before | 1857 // TODO(johnmccutchan): Scan this array and the isolate's profile before |
| 1843 // old space GC and remove the keep_code flag. | 1858 // old space GC and remove the keep_code flag. |
| 1844 deoptimized_code.Add(code); | 1859 deoptimized_code.Add(code); |
| 1845 } | 1860 } |
| 1846 | 1861 |
| 1847 | 1862 |
| 1863 void Isolate::set_pending_extension_calls(const GrowableObjectArray& value) { | |
| 1864 pending_extension_calls_ = value.raw(); | |
| 1865 } | |
| 1866 | |
| 1867 | |
| 1868 void Isolate::set_registered_extension_handlers( | |
| 1869 const GrowableObjectArray& value) { | |
| 1870 registered_extension_handlers_ = value.raw(); | |
| 1871 } | |
| 1872 | |
| 1873 | |
| 1874 RawObject* Isolate::InvokePendingExtensionCalls() { | |
| 1875 GrowableObjectArray& calls = | |
| 1876 GrowableObjectArray::Handle(GetAndClearPendingExtensionCalls()); | |
| 1877 if (calls.IsNull()) { | |
| 1878 return Object::null(); | |
| 1879 } | |
| 1880 // Grab run function. | |
| 1881 const Library& developer_lib = Library::Handle(Library::DeveloperLibrary()); | |
| 1882 ASSERT(!developer_lib.IsNull()); | |
| 1883 const Function& run_extension = Function::Handle( | |
| 1884 developer_lib.LookupLocalFunction(Symbols::_runExtension())); | |
| 1885 ASSERT(!run_extension.IsNull()); | |
| 1886 | |
| 1887 const Array& arguments = | |
| 1888 Array::Handle(Array::New(kPendingEntrySize, Heap::kNew)); | |
| 1889 Object& result = Object::Handle(); | |
| 1890 String& method_name = String::Handle(); | |
| 1891 Instance& closure = Instance::Handle(); | |
| 1892 Array& parameter_keys = Array::Handle(); | |
| 1893 Array& parameter_values = Array::Handle(); | |
| 1894 Instance& reply_port = Instance::Handle(); | |
| 1895 Instance& id = Instance::Handle(); | |
| 1896 for (intptr_t i = 0; i < calls.Length(); i += kPendingEntrySize) { | |
| 1897 // Grab arguments for call. | |
| 1898 closure ^= calls.At(i + kPendingHandlerIndex); | |
| 1899 ASSERT(!closure.IsNull()); | |
| 1900 arguments.SetAt(kPendingHandlerIndex, closure); | |
| 1901 method_name ^= calls.At(i + kPendingMethodNameIndex); | |
| 1902 ASSERT(!method_name.IsNull()); | |
| 1903 arguments.SetAt(kPendingMethodNameIndex, method_name); | |
| 1904 parameter_keys ^= calls.At(i + kPendingKeysIndex); | |
| 1905 ASSERT(!parameter_keys.IsNull()); | |
| 1906 arguments.SetAt(kPendingKeysIndex, parameter_keys); | |
| 1907 parameter_values ^= calls.At(i + kPendingValuesIndex); | |
| 1908 ASSERT(!parameter_values.IsNull()); | |
| 1909 arguments.SetAt(kPendingValuesIndex, parameter_values); | |
| 1910 reply_port ^= calls.At(i + kPendingReplyPortIndex); | |
| 1911 ASSERT(!reply_port.IsNull()); | |
| 1912 arguments.SetAt(kPendingReplyPortIndex, reply_port); | |
| 1913 id ^= calls.At(i + kPendingIdIndex); | |
| 1914 arguments.SetAt(kPendingIdIndex, id); | |
| 1915 | |
| 1916 result = DartEntry::InvokeFunction(run_extension, arguments); | |
| 1917 if (result.IsError()) { | |
| 1918 if (result.IsUnwindError()) { | |
| 1919 // Propagate the unwind error. Remaining service extension calls | |
| 1920 // are dropped. | |
| 1921 return result.raw(); | |
| 1922 } else { | |
| 1923 // Send error back over the protocol. | |
| 1924 Service::PostError(method_name, | |
| 1925 parameter_keys, | |
| 1926 parameter_values, | |
| 1927 reply_port, | |
| 1928 id, | |
| 1929 Error::Cast(result)); | |
| 1930 } | |
| 1931 } | |
| 1932 result = DartLibraryCalls::DrainMicrotaskQueue(); | |
| 1933 if (result.IsError()) { | |
| 1934 return result.raw(); | |
| 1935 } | |
| 1936 } | |
| 1937 return Object::null(); | |
| 1938 } | |
| 1939 | |
| 1940 | |
| 1941 RawGrowableObjectArray* Isolate::GetAndClearPendingExtensionCalls() { | |
| 1942 RawGrowableObjectArray* r = pending_extension_calls_; | |
| 1943 pending_extension_calls_ = GrowableObjectArray::null(); | |
| 1944 return r; | |
| 1945 } | |
| 1946 | |
| 1947 | |
| 1948 void Isolate::AppendExtensionCall(const Instance& closure, | |
| 1949 const String& method_name, | |
| 1950 const Array& parameter_keys, | |
| 1951 const Array& parameter_values, | |
| 1952 const Instance& reply_port, | |
| 1953 const Instance& id) { | |
| 1954 GrowableObjectArray& calls = | |
| 1955 GrowableObjectArray::Handle(pending_extension_calls()); | |
| 1956 if (calls.IsNull()) { | |
| 1957 calls ^= GrowableObjectArray::New(Heap::kOld); | |
|
Ivan Posva
2015/08/27 06:15:29
Why in old space?
Cutch
2015/08/27 13:27:49
Done.
| |
| 1958 ASSERT(!calls.IsNull()); | |
| 1959 set_pending_extension_calls(calls); | |
| 1960 } | |
| 1961 ASSERT(kPendingHandlerIndex == 0); | |
| 1962 calls.Add(closure, Heap::kOld); | |
|
Ivan Posva
2015/08/27 06:15:29
ditto here and below. Why old?
Cutch
2015/08/27 13:27:49
Done.
| |
| 1963 ASSERT(kPendingMethodNameIndex == 1); | |
| 1964 calls.Add(method_name, Heap::kOld); | |
| 1965 ASSERT(kPendingKeysIndex == 2); | |
| 1966 calls.Add(parameter_keys, Heap::kOld); | |
| 1967 ASSERT(kPendingValuesIndex == 3); | |
| 1968 calls.Add(parameter_values, Heap::kOld); | |
| 1969 ASSERT(kPendingReplyPortIndex == 4); | |
| 1970 calls.Add(reply_port, Heap::kOld); | |
| 1971 ASSERT(kPendingIdIndex == 5); | |
| 1972 calls.Add(id, Heap::kOld); | |
| 1973 } | |
| 1974 | |
| 1975 | |
| 1976 void Isolate::RegisterExtensionHandler(const String& name, | |
|
Ivan Posva
2015/08/27 06:15:29
These are really VM service extension handlers, co
Cutch
2015/08/27 13:27:49
Done.
| |
| 1977 const Instance& closure) { | |
| 1978 GrowableObjectArray& handlers = | |
| 1979 GrowableObjectArray::Handle(registered_extension_handlers()); | |
| 1980 if (handlers.IsNull()) { | |
| 1981 handlers ^= GrowableObjectArray::New(Heap::kOld); | |
| 1982 set_registered_extension_handlers(handlers); | |
| 1983 } | |
| 1984 #if defined(DEBUG) | |
| 1985 { | |
| 1986 // Sanity check. | |
| 1987 const Instance& existing_handler = | |
| 1988 Instance::Handle(LookupExtensionHandler(name)); | |
| 1989 ASSERT(existing_handler.IsNull()); | |
| 1990 } | |
| 1991 #endif | |
| 1992 ASSERT(kRegisteredNameIndex == 0); | |
| 1993 handlers.Add(name, Heap::kOld); | |
| 1994 ASSERT(kRegisteredHandlerIndex == 1); | |
| 1995 handlers.Add(closure, Heap::kOld); | |
| 1996 } | |
| 1997 | |
| 1998 | |
| 1999 RawInstance* Isolate::LookupExtensionHandler(const String& name) { | |
|
Ivan Posva
2015/08/27 06:15:29
Why isn't the extension list not maintained in the
Cutch
2015/08/27 13:27:49
Because doing that in Dart code could lead to inco
Ivan Posva
2015/08/27 18:12:26
Many thanks for the explanation. Please add it as
Cutch
2015/08/27 18:23:29
Done.
| |
| 2000 const GrowableObjectArray& handlers = | |
| 2001 GrowableObjectArray::Handle(registered_extension_handlers()); | |
| 2002 if (handlers.IsNull()) { | |
| 2003 return Instance::null(); | |
| 2004 } | |
| 2005 String& handler_name = String::Handle(); | |
| 2006 for (intptr_t i = 0; i < handlers.Length(); i += kRegisteredEntrySize) { | |
| 2007 handler_name ^= handlers.At(i + kRegisteredNameIndex); | |
| 2008 ASSERT(!handler_name.IsNull()); | |
| 2009 if (handler_name.Equals(name)) { | |
| 2010 return Instance::RawCast(handlers.At(i + kRegisteredHandlerIndex)); | |
| 2011 } | |
| 2012 } | |
| 2013 return Instance::null(); | |
| 2014 } | |
| 2015 | |
| 2016 | |
| 1848 void Isolate::WakePauseEventHandler(Dart_Isolate isolate) { | 2017 void Isolate::WakePauseEventHandler(Dart_Isolate isolate) { |
| 1849 Isolate* iso = reinterpret_cast<Isolate*>(isolate); | 2018 Isolate* iso = reinterpret_cast<Isolate*>(isolate); |
| 1850 MonitorLocker ml(iso->pause_loop_monitor_); | 2019 MonitorLocker ml(iso->pause_loop_monitor_); |
| 1851 ml.Notify(); | 2020 ml.Notify(); |
| 1852 } | 2021 } |
| 1853 | 2022 |
| 1854 | 2023 |
| 1855 void Isolate::PauseEventHandler() { | 2024 void Isolate::PauseEventHandler() { |
| 1856 // We are stealing a pause event (like a breakpoint) from the | 2025 // We are stealing a pause event (like a breakpoint) from the |
| 1857 // embedder. We don't know what kind of thread we are on -- it | 2026 // embedder. We don't know what kind of thread we are on -- it |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2153 serialized_message_, serialized_message_len_); | 2322 serialized_message_, serialized_message_len_); |
| 2154 } | 2323 } |
| 2155 | 2324 |
| 2156 | 2325 |
| 2157 void IsolateSpawnState::Cleanup() { | 2326 void IsolateSpawnState::Cleanup() { |
| 2158 SwitchIsolateScope switch_scope(I); | 2327 SwitchIsolateScope switch_scope(I); |
| 2159 Dart::ShutdownIsolate(); | 2328 Dart::ShutdownIsolate(); |
| 2160 } | 2329 } |
| 2161 | 2330 |
| 2162 } // namespace dart | 2331 } // namespace dart |
| OLD | NEW |