| 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 #ifndef VM_ISOLATE_H_ | 5 #ifndef VM_ISOLATE_H_ |
| 6 #define VM_ISOLATE_H_ | 6 #define VM_ISOLATE_H_ |
| 7 | 7 |
| 8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
| 9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
| 10 #include "platform/thread.h" | 10 #include "platform/thread.h" |
| 11 #include "vm/base_isolate.h" | 11 #include "vm/base_isolate.h" |
| 12 #include "vm/class_table.h" | 12 #include "vm/class_table.h" |
| 13 #include "vm/gc_callbacks.h" | 13 #include "vm/gc_callbacks.h" |
| 14 #include "vm/handles.h" | 14 #include "vm/handles.h" |
| 15 #include "vm/megamorphic_cache_table.h" | 15 #include "vm/megamorphic_cache_table.h" |
| 16 #include "vm/store_buffer.h" | 16 #include "vm/store_buffer.h" |
| 17 #include "vm/timer.h" | 17 #include "vm/timer.h" |
| 18 | 18 |
| 19 namespace dart { | 19 namespace dart { |
| 20 | 20 |
| 21 // Forward declarations. | 21 // Forward declarations. |
| 22 class AbstractType; | 22 class AbstractType; |
| 23 class ApiState; | 23 class ApiState; |
| 24 class Array; | 24 class Array; |
| 25 class Class; | 25 class Class; |
| 26 class CodeIndexTable; | 26 class CodeIndexTable; |
| 27 class Debugger; | 27 class Debugger; |
| 28 class DeoptContext; |
| 28 class Field; | 29 class Field; |
| 29 class Function; | 30 class Function; |
| 30 class HandleScope; | 31 class HandleScope; |
| 31 class HandleVisitor; | 32 class HandleVisitor; |
| 32 class Heap; | 33 class Heap; |
| 33 class ICData; | 34 class ICData; |
| 34 class Instance; | 35 class Instance; |
| 35 class LongJump; | 36 class LongJump; |
| 36 class MessageHandler; | 37 class MessageHandler; |
| 37 class Mutex; | 38 class Mutex; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 51 class Simulator; | 52 class Simulator; |
| 52 class StackResource; | 53 class StackResource; |
| 53 class StackZone; | 54 class StackZone; |
| 54 class StubCode; | 55 class StubCode; |
| 55 class TypeArguments; | 56 class TypeArguments; |
| 56 class TypeParameter; | 57 class TypeParameter; |
| 57 class ObjectHistogram; | 58 class ObjectHistogram; |
| 58 class ObjectIdRing; | 59 class ObjectIdRing; |
| 59 | 60 |
| 60 | 61 |
| 61 // Used by the deoptimization infrastructure to defer allocation of unboxed | |
| 62 // objects until frame is fully rewritten and GC is safe. | |
| 63 // Describes a stack slot that should be populated with a reference to the | |
| 64 // materialized object. | |
| 65 class DeferredSlot { | |
| 66 public: | |
| 67 DeferredSlot(RawInstance** slot, DeferredSlot* next) | |
| 68 : slot_(slot), next_(next) { } | |
| 69 virtual ~DeferredSlot() { } | |
| 70 | |
| 71 RawInstance** slot() const { return slot_; } | |
| 72 DeferredSlot* next() const { return next_; } | |
| 73 | |
| 74 virtual void Materialize() = 0; | |
| 75 | |
| 76 private: | |
| 77 RawInstance** const slot_; | |
| 78 DeferredSlot* const next_; | |
| 79 | |
| 80 DISALLOW_COPY_AND_ASSIGN(DeferredSlot); | |
| 81 }; | |
| 82 | |
| 83 | |
| 84 class DeferredDouble : public DeferredSlot { | |
| 85 public: | |
| 86 DeferredDouble(double value, RawInstance** slot, DeferredSlot* next) | |
| 87 : DeferredSlot(slot, next), value_(value) { } | |
| 88 | |
| 89 virtual void Materialize(); | |
| 90 | |
| 91 double value() const { return value_; } | |
| 92 | |
| 93 private: | |
| 94 const double value_; | |
| 95 | |
| 96 DISALLOW_COPY_AND_ASSIGN(DeferredDouble); | |
| 97 }; | |
| 98 | |
| 99 | |
| 100 class DeferredMint : public DeferredSlot { | |
| 101 public: | |
| 102 DeferredMint(int64_t value, RawInstance** slot, DeferredSlot* next) | |
| 103 : DeferredSlot(slot, next), value_(value) { } | |
| 104 | |
| 105 virtual void Materialize(); | |
| 106 | |
| 107 int64_t value() const { return value_; } | |
| 108 | |
| 109 private: | |
| 110 const int64_t value_; | |
| 111 | |
| 112 DISALLOW_COPY_AND_ASSIGN(DeferredMint); | |
| 113 }; | |
| 114 | |
| 115 | |
| 116 class DeferredFloat32x4 : public DeferredSlot { | |
| 117 public: | |
| 118 DeferredFloat32x4(simd128_value_t value, RawInstance** slot, | |
| 119 DeferredSlot* next) | |
| 120 : DeferredSlot(slot, next), value_(value) { } | |
| 121 | |
| 122 virtual void Materialize(); | |
| 123 | |
| 124 simd128_value_t value() const { return value_; } | |
| 125 | |
| 126 private: | |
| 127 const simd128_value_t value_; | |
| 128 | |
| 129 DISALLOW_COPY_AND_ASSIGN(DeferredFloat32x4); | |
| 130 }; | |
| 131 | |
| 132 | |
| 133 class DeferredUint32x4 : public DeferredSlot { | |
| 134 public: | |
| 135 DeferredUint32x4(simd128_value_t value, RawInstance** slot, | |
| 136 DeferredSlot* next) | |
| 137 : DeferredSlot(slot, next), value_(value) { } | |
| 138 | |
| 139 virtual void Materialize(); | |
| 140 | |
| 141 simd128_value_t value() const { return value_; } | |
| 142 | |
| 143 private: | |
| 144 const simd128_value_t value_; | |
| 145 | |
| 146 DISALLOW_COPY_AND_ASSIGN(DeferredUint32x4); | |
| 147 }; | |
| 148 | |
| 149 | |
| 150 // Describes a slot that contains a reference to an object that had its | |
| 151 // allocation removed by AllocationSinking pass. | |
| 152 // Object itself is described and materialized by DeferredObject. | |
| 153 class DeferredObjectRef : public DeferredSlot { | |
| 154 public: | |
| 155 DeferredObjectRef(intptr_t index, RawInstance** slot, DeferredSlot* next) | |
| 156 : DeferredSlot(slot, next), index_(index) { } | |
| 157 | |
| 158 virtual void Materialize(); | |
| 159 | |
| 160 intptr_t index() const { return index_; } | |
| 161 | |
| 162 private: | |
| 163 const intptr_t index_; | |
| 164 | |
| 165 DISALLOW_COPY_AND_ASSIGN(DeferredObjectRef); | |
| 166 }; | |
| 167 | |
| 168 | |
| 169 // Describes an object which allocation was removed by AllocationSinking pass. | |
| 170 // Arguments for materialization are stored as a part of expression stack | |
| 171 // for the bottommost deoptimized frame so that GC could discover them. | |
| 172 // They will be removed from the stack at the very end of deoptimization. | |
| 173 class DeferredObject { | |
| 174 public: | |
| 175 DeferredObject(intptr_t field_count, intptr_t* args) | |
| 176 : field_count_(field_count), | |
| 177 args_(reinterpret_cast<RawObject**>(args)), | |
| 178 object_(NULL) { } | |
| 179 | |
| 180 intptr_t ArgumentCount() const { | |
| 181 return kFieldsStartIndex + kFieldEntrySize * field_count_; | |
| 182 } | |
| 183 | |
| 184 RawInstance* object(); | |
| 185 | |
| 186 private: | |
| 187 enum { | |
| 188 kClassIndex = 0, | |
| 189 kFieldsStartIndex = kClassIndex + 1 | |
| 190 }; | |
| 191 | |
| 192 enum { | |
| 193 kFieldIndex = 0, | |
| 194 kValueIndex, | |
| 195 kFieldEntrySize, | |
| 196 }; | |
| 197 | |
| 198 // Materializes the object. Returns amount of values that were consumed | |
| 199 // and should be removed from the expression stack at the very end of | |
| 200 // deoptimization. | |
| 201 void Materialize(); | |
| 202 | |
| 203 RawObject* GetClass() const { | |
| 204 return args_[kClassIndex]; | |
| 205 } | |
| 206 | |
| 207 RawObject* GetField(intptr_t index) const { | |
| 208 return args_[kFieldsStartIndex + kFieldEntrySize * index + kFieldIndex]; | |
| 209 } | |
| 210 | |
| 211 RawObject* GetValue(intptr_t index) const { | |
| 212 return args_[kFieldsStartIndex + kFieldEntrySize * index + kValueIndex]; | |
| 213 } | |
| 214 | |
| 215 // Amount of fields that have to be initialized. | |
| 216 const intptr_t field_count_; | |
| 217 | |
| 218 // Pointer to the first materialization argument on the stack. | |
| 219 // The first argument is Class of the instance to materialize followed by | |
| 220 // Field, value pairs. | |
| 221 RawObject** args_; | |
| 222 | |
| 223 // Object materialized from this description. | |
| 224 const Instance* object_; | |
| 225 | |
| 226 DISALLOW_COPY_AND_ASSIGN(DeferredObject); | |
| 227 }; | |
| 228 | |
| 229 #define REUSABLE_HANDLE_LIST(V) \ | 62 #define REUSABLE_HANDLE_LIST(V) \ |
| 230 V(Object) \ | 63 V(Object) \ |
| 231 V(Array) \ | 64 V(Array) \ |
| 232 V(String) \ | 65 V(String) \ |
| 233 V(Instance) \ | 66 V(Instance) \ |
| 234 V(Function) \ | 67 V(Function) \ |
| 235 V(Field) \ | 68 V(Field) \ |
| 236 V(Class) \ | 69 V(Class) \ |
| 237 V(AbstractType) \ | 70 V(AbstractType) \ |
| 238 V(TypeParameter) \ | 71 V(TypeParameter) \ |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 static Dart_FileReadCallback file_read_callback() { | 329 static Dart_FileReadCallback file_read_callback() { |
| 497 return file_read_callback_; | 330 return file_read_callback_; |
| 498 } | 331 } |
| 499 static Dart_FileWriteCallback file_write_callback() { | 332 static Dart_FileWriteCallback file_write_callback() { |
| 500 return file_write_callback_; | 333 return file_write_callback_; |
| 501 } | 334 } |
| 502 static Dart_FileCloseCallback file_close_callback() { | 335 static Dart_FileCloseCallback file_close_callback() { |
| 503 return file_close_callback_; | 336 return file_close_callback_; |
| 504 } | 337 } |
| 505 | 338 |
| 506 intptr_t* deopt_cpu_registers_copy() const { | |
| 507 return deopt_cpu_registers_copy_; | |
| 508 } | |
| 509 void set_deopt_cpu_registers_copy(intptr_t* value) { | |
| 510 ASSERT((value == NULL) || (deopt_cpu_registers_copy_ == NULL)); | |
| 511 deopt_cpu_registers_copy_ = value; | |
| 512 } | |
| 513 fpu_register_t* deopt_fpu_registers_copy() const { | |
| 514 return deopt_fpu_registers_copy_; | |
| 515 } | |
| 516 void set_deopt_fpu_registers_copy(fpu_register_t* value) { | |
| 517 ASSERT((value == NULL) || (deopt_fpu_registers_copy_ == NULL)); | |
| 518 deopt_fpu_registers_copy_ = value; | |
| 519 } | |
| 520 intptr_t* deopt_frame_copy() const { return deopt_frame_copy_; } | |
| 521 void SetDeoptFrameCopy(intptr_t* value, intptr_t size) { | |
| 522 ASSERT((value == NULL) || (size > 0)); | |
| 523 ASSERT((value == NULL) || (deopt_frame_copy_ == NULL)); | |
| 524 deopt_frame_copy_ = value; | |
| 525 deopt_frame_copy_size_ = size; | |
| 526 } | |
| 527 intptr_t deopt_frame_copy_size() const { return deopt_frame_copy_size_; } | |
| 528 | |
| 529 void set_object_id_ring(ObjectIdRing* ring) { | 339 void set_object_id_ring(ObjectIdRing* ring) { |
| 530 object_id_ring_ = ring; | 340 object_id_ring_ = ring; |
| 531 } | 341 } |
| 532 ObjectIdRing* object_id_ring() { | 342 ObjectIdRing* object_id_ring() { |
| 533 return object_id_ring_; | 343 return object_id_ring_; |
| 534 } | 344 } |
| 535 | 345 |
| 536 void PrepareForDeferredMaterialization(intptr_t count) { | 346 DeoptContext* deopt_context() const { return deopt_context_; } |
| 537 if (count > 0) { | 347 void set_deopt_context(DeoptContext* value) { |
| 538 deferred_objects_ = new DeferredObject*[count]; | 348 ASSERT(value == NULL || deopt_context_ == NULL); |
| 539 deferred_objects_count_ = count; | 349 deopt_context_ = value; |
| 540 } | |
| 541 } | 350 } |
| 542 | 351 |
| 543 void DeleteDeferredObjects() { | |
| 544 for (intptr_t i = 0; i < deferred_objects_count_; i++) { | |
| 545 delete deferred_objects_[i]; | |
| 546 } | |
| 547 delete[] deferred_objects_; | |
| 548 deferred_objects_ = NULL; | |
| 549 deferred_objects_count_ = 0; | |
| 550 } | |
| 551 | |
| 552 DeferredObject* GetDeferredObject(intptr_t idx) const { | |
| 553 return deferred_objects_[idx]; | |
| 554 } | |
| 555 | |
| 556 void SetDeferredObjectAt(intptr_t idx, DeferredObject* object) { | |
| 557 deferred_objects_[idx] = object; | |
| 558 } | |
| 559 | |
| 560 intptr_t DeferredObjectsCount() const { | |
| 561 return deferred_objects_count_; | |
| 562 } | |
| 563 | |
| 564 void DeferMaterializedObjectRef(intptr_t idx, intptr_t* slot) { | |
| 565 deferred_object_refs_ = new DeferredObjectRef( | |
| 566 idx, | |
| 567 reinterpret_cast<RawInstance**>(slot), | |
| 568 deferred_object_refs_); | |
| 569 } | |
| 570 | |
| 571 void DeferDoubleMaterialization(double value, RawDouble** slot) { | |
| 572 deferred_boxes_ = new DeferredDouble( | |
| 573 value, | |
| 574 reinterpret_cast<RawInstance**>(slot), | |
| 575 deferred_boxes_); | |
| 576 } | |
| 577 | |
| 578 void DeferMintMaterialization(int64_t value, RawMint** slot) { | |
| 579 deferred_boxes_ = new DeferredMint( | |
| 580 value, | |
| 581 reinterpret_cast<RawInstance**>(slot), | |
| 582 deferred_boxes_); | |
| 583 } | |
| 584 | |
| 585 void DeferFloat32x4Materialization(simd128_value_t value, | |
| 586 RawFloat32x4** slot) { | |
| 587 deferred_boxes_ = new DeferredFloat32x4( | |
| 588 value, | |
| 589 reinterpret_cast<RawInstance**>(slot), | |
| 590 deferred_boxes_); | |
| 591 } | |
| 592 | |
| 593 void DeferUint32x4Materialization(simd128_value_t value, | |
| 594 RawUint32x4** slot) { | |
| 595 deferred_boxes_ = new DeferredUint32x4( | |
| 596 value, | |
| 597 reinterpret_cast<RawInstance**>(slot), | |
| 598 deferred_boxes_); | |
| 599 } | |
| 600 | |
| 601 // Populate all deferred slots that contain boxes for double, mint, simd | |
| 602 // values. | |
| 603 void MaterializeDeferredBoxes(); | |
| 604 | |
| 605 // Populate all slots containing references to objects which allocations | |
| 606 // were eliminated by AllocationSinking pass. | |
| 607 void MaterializeDeferredObjects(); | |
| 608 | |
| 609 static char* GetStatus(const char* request); | 352 static char* GetStatus(const char* request); |
| 610 | 353 |
| 611 intptr_t BlockClassFinalization() { | 354 intptr_t BlockClassFinalization() { |
| 612 ASSERT(defer_finalization_count_ >= 0); | 355 ASSERT(defer_finalization_count_ >= 0); |
| 613 return defer_finalization_count_++; | 356 return defer_finalization_count_++; |
| 614 } | 357 } |
| 615 | 358 |
| 616 intptr_t UnblockClassFinalization() { | 359 intptr_t UnblockClassFinalization() { |
| 617 ASSERT(defer_finalization_count_ > 0); | 360 ASSERT(defer_finalization_count_ > 0); |
| 618 return defer_finalization_count_--; | 361 return defer_finalization_count_--; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 intptr_t deopt_id_; | 404 intptr_t deopt_id_; |
| 662 Mutex* mutex_; // protects stack_limit_ and saved_stack_limit_. | 405 Mutex* mutex_; // protects stack_limit_ and saved_stack_limit_. |
| 663 uword stack_limit_; | 406 uword stack_limit_; |
| 664 uword saved_stack_limit_; | 407 uword saved_stack_limit_; |
| 665 MessageHandler* message_handler_; | 408 MessageHandler* message_handler_; |
| 666 uword spawn_data_; | 409 uword spawn_data_; |
| 667 bool is_runnable_; | 410 bool is_runnable_; |
| 668 GcPrologueCallbacks gc_prologue_callbacks_; | 411 GcPrologueCallbacks gc_prologue_callbacks_; |
| 669 GcEpilogueCallbacks gc_epilogue_callbacks_; | 412 GcEpilogueCallbacks gc_epilogue_callbacks_; |
| 670 intptr_t defer_finalization_count_; | 413 intptr_t defer_finalization_count_; |
| 671 | 414 DeoptContext* deopt_context_; |
| 672 // Deoptimization support. | |
| 673 intptr_t* deopt_cpu_registers_copy_; | |
| 674 fpu_register_t* deopt_fpu_registers_copy_; | |
| 675 intptr_t* deopt_frame_copy_; | |
| 676 intptr_t deopt_frame_copy_size_; | |
| 677 DeferredSlot* deferred_boxes_; | |
| 678 DeferredSlot* deferred_object_refs_; | |
| 679 | |
| 680 intptr_t deferred_objects_count_; | |
| 681 DeferredObject** deferred_objects_; | |
| 682 | 415 |
| 683 // Status support. | 416 // Status support. |
| 684 char* stacktrace_; | 417 char* stacktrace_; |
| 685 intptr_t stack_frame_index_; | 418 intptr_t stack_frame_index_; |
| 686 ObjectHistogram* object_histogram_; | 419 ObjectHistogram* object_histogram_; |
| 687 | 420 |
| 688 // Ring buffer of objects assigned an id. | 421 // Ring buffer of objects assigned an id. |
| 689 ObjectIdRing* object_id_ring_; | 422 ObjectIdRing* object_id_ring_; |
| 690 | 423 |
| 691 // Reusable handles support. | 424 // Reusable handles support. |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 797 Isolate* isolate_; | 530 Isolate* isolate_; |
| 798 char* script_url_; | 531 char* script_url_; |
| 799 char* library_url_; | 532 char* library_url_; |
| 800 char* function_name_; | 533 char* function_name_; |
| 801 char* exception_callback_name_; | 534 char* exception_callback_name_; |
| 802 }; | 535 }; |
| 803 | 536 |
| 804 } // namespace dart | 537 } // namespace dart |
| 805 | 538 |
| 806 #endif // VM_ISOLATE_H_ | 539 #endif // VM_ISOLATE_H_ |
| OLD | NEW |