Index: runtime/vm/isolate.cc |
=================================================================== |
--- runtime/vm/isolate.cc (revision 44632) |
+++ runtime/vm/isolate.cc (working copy) |
@@ -601,6 +601,65 @@ |
set_user_tag(UserTags::kDefaultUserTag); |
} |
+Isolate::Isolate(Isolate* original) |
+ : vm_tag_(0), |
+ store_buffer_(true), |
+ class_table_(original->class_table()), |
+ message_notify_callback_(NULL), |
+ name_(NULL), |
+ start_time_(OS::GetCurrentTimeMicros()), |
+ main_port_(0), |
+ pause_capability_(0), |
+ terminate_capability_(0), |
+ errors_fatal_(true), |
+ heap_(NULL), |
+ object_store_(NULL), |
+ top_exit_frame_info_(0), |
+ init_callback_data_(NULL), |
+ environment_callback_(NULL), |
+ library_tag_handler_(NULL), |
+ api_state_(NULL), |
+ stub_code_(NULL), |
+ debugger_(NULL), |
+ single_step_(false), |
+ resume_request_(false), |
+ random_(), |
+ simulator_(NULL), |
+ long_jump_base_(NULL), |
+ timer_list_(), |
+ deopt_id_(0), |
+ mutex_(new Mutex()), |
+ stack_limit_(0), |
+ saved_stack_limit_(0), |
+ stack_overflow_flags_(0), |
+ stack_overflow_count_(0), |
+ message_handler_(NULL), |
+ spawn_state_(NULL), |
+ is_runnable_(false), |
+ gc_prologue_callback_(NULL), |
+ gc_epilogue_callback_(NULL), |
+ defer_finalization_count_(0), |
+ deopt_context_(NULL), |
+ is_service_isolate_(false), |
+ log_(new class Log()), |
+ stacktrace_(NULL), |
+ stack_frame_index_(-1), |
+ last_allocationprofile_accumulator_reset_timestamp_(0), |
+ last_allocationprofile_gc_timestamp_(0), |
+ cha_(NULL), |
+ object_id_ring_(NULL), |
+ trace_buffer_(NULL), |
+ profiler_data_(NULL), |
+ thread_state_(NULL), |
+ tag_table_(GrowableObjectArray::null()), |
+ current_tag_(UserTag::null()), |
+ default_tag_(UserTag::null()), |
+ metrics_list_head_(NULL), |
+ next_(NULL), |
+ REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) |
+ REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) |
+ reusable_handles_() { |
+} |
#undef REUSABLE_HANDLE_SCOPE_INIT |
#undef REUSABLE_HANDLE_INITIALIZERS |
@@ -1307,17 +1366,6 @@ |
void Isolate::Shutdown() { |
ASSERT(this == Isolate::Current()); |
ASSERT(top_resource() == NULL); |
- |
- // Remove this isolate from the list *before* we start tearing it down, to |
- // avoid exposing it in a state of decay. |
- RemoveIsolateFromList(this); |
- |
- // Create an area where we do have a zone and a handle scope so that we can |
- // call VM functions while tearing this isolate down. |
- { |
- StackZone stack_zone(this); |
- HandleScope handle_scope(this); |
- |
#if defined(DEBUG) |
if (heap_ != NULL) { |
// Wait for concurrent GC tasks to finish before final verification. |
@@ -1331,6 +1379,16 @@ |
} |
#endif // DEBUG |
+ // Remove this isolate from the list *before* we start tearing it down, to |
+ // avoid exposing it in a state of decay. |
+ RemoveIsolateFromList(this); |
+ |
+ // Create an area where we do have a zone and a handle scope so that we can |
+ // call VM functions while tearing this isolate down. |
+ { |
+ StackZone stack_zone(this); |
+ HandleScope handle_scope(this); |
+ |
// Notify exit listeners that this isolate is shutting down. |
if (object_store() != NULL) { |
NotifyExitListeners(); |
@@ -1374,6 +1432,11 @@ |
} |
+Isolate* Isolate::ShallowCopy() { |
+ return new Isolate(this); |
+} |
+ |
+ |
Dart_IsolateCreateCallback Isolate::create_callback_ = NULL; |
Dart_IsolateInterruptCallback Isolate::interrupt_callback_ = NULL; |
Dart_IsolateUnhandledExceptionCallback |