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

Unified Diff: runtime/vm/deferred_objects.h

Issue 24834002: Refactor some deoptimization code. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/code_generator.cc ('k') | runtime/vm/deferred_objects.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/deferred_objects.h
===================================================================
--- runtime/vm/deferred_objects.h (revision 27855)
+++ runtime/vm/deferred_objects.h (working copy)
@@ -2,66 +2,22 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-#ifndef VM_ISOLATE_H_
-#define VM_ISOLATE_H_
+#ifndef VM_DEFERRED_OBJECTS_H_
+#define VM_DEFERRED_OBJECTS_H_
-#include "include/dart_api.h"
-#include "platform/assert.h"
-#include "platform/thread.h"
-#include "vm/base_isolate.h"
-#include "vm/class_table.h"
-#include "vm/gc_callbacks.h"
-#include "vm/handles.h"
-#include "vm/megamorphic_cache_table.h"
-#include "vm/store_buffer.h"
-#include "vm/timer.h"
+#include "platform/globals.h"
namespace dart {
// Forward declarations.
-class AbstractType;
-class ApiState;
-class Array;
-class Class;
-class CodeIndexTable;
-class Debugger;
-class Field;
-class Function;
-class HandleScope;
-class HandleVisitor;
-class Heap;
-class ICData;
class Instance;
-class LongJump;
-class MessageHandler;
-class Mutex;
-class Object;
-class ObjectPointerVisitor;
-class ObjectStore;
class RawInstance;
-class RawArray;
-class RawContext;
-class RawDouble;
-class RawMint;
class RawObject;
-class RawInteger;
-class RawError;
-class RawFloat32x4;
-class RawUint32x4;
-class Simulator;
-class StackResource;
-class StackZone;
-class StubCode;
-class TypeArguments;
-class TypeParameter;
-class ObjectHistogram;
-class ObjectIdRing;
-
-// Used by the deoptimization infrastructure to defer allocation of unboxed
-// objects until frame is fully rewritten and GC is safe.
-// Describes a stack slot that should be populated with a reference to the
-// materialized object.
+// Used by the deoptimization infrastructure to defer allocation of
+// unboxed objects until frame is fully rewritten and GC is safe.
+// Describes a stack slot that should be populated with a reference to
+// the materialized object.
class DeferredSlot {
public:
DeferredSlot(RawInstance** slot, DeferredSlot* next)
@@ -226,581 +182,6 @@
DISALLOW_COPY_AND_ASSIGN(DeferredObject);
};
-#define REUSABLE_HANDLE_LIST(V) \
- V(Object) \
- V(Array) \
- V(String) \
- V(Instance) \
- V(Function) \
- V(Field) \
- V(Class) \
- V(AbstractType) \
- V(TypeParameter) \
- V(TypeArguments) \
-
-class Isolate : public BaseIsolate {
- public:
- ~Isolate();
-
- static inline Isolate* Current() {
- return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key));
- }
-
- static void SetCurrent(Isolate* isolate);
-
- static void InitOnce();
- static Isolate* Init(const char* name_prefix);
- void Shutdown();
-
- // Register a newly introduced class.
- void RegisterClass(const Class& cls);
-
- // Visit all object pointers.
- void VisitObjectPointers(ObjectPointerVisitor* visitor,
- bool visit_prologue_weak_persistent_handles,
- bool validate_frames);
-
- // Visits weak object pointers.
- void VisitWeakPersistentHandles(HandleVisitor* visit,
- bool visit_prologue_weak_persistent_handles);
-
- StoreBuffer* store_buffer() { return &store_buffer_; }
- static intptr_t store_buffer_offset() {
- return OFFSET_OF(Isolate, store_buffer_);
- }
-
- ClassTable* class_table() { return &class_table_; }
- static intptr_t class_table_offset() {
- return OFFSET_OF(Isolate, class_table_);
- }
-
- ObjectHistogram* object_histogram() { return object_histogram_; }
-
- MegamorphicCacheTable* megamorphic_cache_table() {
- return &megamorphic_cache_table_;
- }
-
- Dart_MessageNotifyCallback message_notify_callback() const {
- return message_notify_callback_;
- }
- void set_message_notify_callback(Dart_MessageNotifyCallback value) {
- message_notify_callback_ = value;
- }
-
- const char* name() const { return name_; }
-
- int64_t start_time() const { return start_time_; }
-
- Dart_Port main_port() { return main_port_; }
- void set_main_port(Dart_Port port) {
- ASSERT(main_port_ == 0); // Only set main port once.
- main_port_ = port;
- }
-
- Heap* heap() const { return heap_; }
- void set_heap(Heap* value) { heap_ = value; }
- static intptr_t heap_offset() { return OFFSET_OF(Isolate, heap_); }
-
- ObjectStore* object_store() const { return object_store_; }
- void set_object_store(ObjectStore* value) { object_store_ = value; }
- static intptr_t object_store_offset() {
- return OFFSET_OF(Isolate, object_store_);
- }
-
- RawContext* top_context() const { return top_context_; }
- void set_top_context(RawContext* value) { top_context_ = value; }
- static intptr_t top_context_offset() {
- return OFFSET_OF(Isolate, top_context_);
- }
-
- uword top_exit_frame_info() const { return top_exit_frame_info_; }
- void set_top_exit_frame_info(uword value) { top_exit_frame_info_ = value; }
- static intptr_t top_exit_frame_info_offset() {
- return OFFSET_OF(Isolate, top_exit_frame_info_);
- }
-
- ApiState* api_state() const { return api_state_; }
- void set_api_state(ApiState* value) { api_state_ = value; }
-
- StubCode* stub_code() const { return stub_code_; }
- void set_stub_code(StubCode* value) { stub_code_ = value; }
-
- LongJump* long_jump_base() const { return long_jump_base_; }
- void set_long_jump_base(LongJump* value) { long_jump_base_ = value; }
-
- TimerList& timer_list() { return timer_list_; }
-
- static intptr_t current_zone_offset() {
- return OFFSET_OF(Isolate, current_zone_);
- }
-
- void set_init_callback_data(void* value) {
- init_callback_data_ = value;
- }
- void* init_callback_data() const {
- return init_callback_data_;
- }
-
- Dart_LibraryTagHandler library_tag_handler() const {
- return library_tag_handler_;
- }
- void set_library_tag_handler(Dart_LibraryTagHandler value) {
- library_tag_handler_ = value;
- }
-
- void SetStackLimit(uword value);
- void SetStackLimitFromCurrentTOS(uword isolate_stack_top);
-
- uword stack_limit_address() const {
- return reinterpret_cast<uword>(&stack_limit_);
- }
-
- // The current stack limit. This may be overwritten with a special
- // value to trigger interrupts.
- uword stack_limit() const { return stack_limit_; }
-
- // The true stack limit for this isolate.
- uword saved_stack_limit() const { return saved_stack_limit_; }
-
- static uword GetSpecifiedStackSize();
-
- static const intptr_t kStackSizeBuffer = (4 * KB * kWordSize);
-
- enum {
- kApiInterrupt = 0x1, // An interrupt from Dart_InterruptIsolate.
- kMessageInterrupt = 0x2, // An interrupt to process an out of band message.
- kStoreBufferInterrupt = 0x4, // An interrupt to process the store buffer.
- kVmStatusInterrupt = 0x8, // An interrupt to process a status request.
-
- kInterruptsMask =
- kApiInterrupt |
- kMessageInterrupt |
- kStoreBufferInterrupt |
- kVmStatusInterrupt,
- };
-
- void ScheduleInterrupts(uword interrupt_bits);
- uword GetAndClearInterrupts();
-
- bool MakeRunnable();
- void Run();
-
- MessageHandler* message_handler() const { return message_handler_; }
- void set_message_handler(MessageHandler* value) { message_handler_ = value; }
-
- bool is_runnable() const { return is_runnable_; }
- void set_is_runnable(bool value) { is_runnable_ = value; }
-
- uword spawn_data() const { return spawn_data_; }
- void set_spawn_data(uword value) { spawn_data_ = value; }
-
- static const intptr_t kNoDeoptId = -1;
- static const intptr_t kDeoptIdStep = 2;
- static const intptr_t kDeoptIdBeforeOffset = 0;
- static const intptr_t kDeoptIdAfterOffset = 1;
- intptr_t deopt_id() const { return deopt_id_; }
- void set_deopt_id(int value) {
- ASSERT(value >= 0);
- deopt_id_ = value;
- }
- intptr_t GetNextDeoptId() {
- ASSERT(deopt_id_ != kNoDeoptId);
- const intptr_t id = deopt_id_;
- deopt_id_ += kDeoptIdStep;
- return id;
- }
-
- static intptr_t ToDeoptAfter(intptr_t deopt_id) {
- ASSERT(IsDeoptBefore(deopt_id));
- return deopt_id + kDeoptIdAfterOffset;
- }
-
- static bool IsDeoptBefore(intptr_t deopt_id) {
- return (deopt_id % kDeoptIdStep) == kDeoptIdBeforeOffset;
- }
-
- static bool IsDeoptAfter(intptr_t deopt_id) {
- return (deopt_id % kDeoptIdStep) == kDeoptIdAfterOffset;
- }
-
- Mutex* mutex() const { return mutex_; }
-
- Debugger* debugger() const { return debugger_; }
-
- void set_single_step(bool value) { single_step_ = value; }
- bool single_step() const { return single_step_; }
- static intptr_t single_step_offset() {
- return OFFSET_OF(Isolate, single_step_);
- }
-
- Simulator* simulator() const { return simulator_; }
- void set_simulator(Simulator* value) { simulator_ = value; }
-
- GcPrologueCallbacks& gc_prologue_callbacks() {
- return gc_prologue_callbacks_;
- }
-
- GcEpilogueCallbacks& gc_epilogue_callbacks() {
- return gc_epilogue_callbacks_;
- }
-
- static void SetCreateCallback(Dart_IsolateCreateCallback cb) {
- create_callback_ = cb;
- }
- static Dart_IsolateCreateCallback CreateCallback() {
- return create_callback_;
- }
-
- static void SetInterruptCallback(Dart_IsolateInterruptCallback cb) {
- interrupt_callback_ = cb;
- }
- static Dart_IsolateInterruptCallback InterruptCallback() {
- return interrupt_callback_;
- }
-
- static void SetVmStatsCallback(Dart_IsolateInterruptCallback cb) {
- vmstats_callback_ = cb;
- }
- static Dart_IsolateInterruptCallback VmStatsCallback() {
- return vmstats_callback_;
- }
-
- static void SetUnhandledExceptionCallback(
- Dart_IsolateUnhandledExceptionCallback cb) {
- unhandled_exception_callback_ = cb;
- }
- static Dart_IsolateUnhandledExceptionCallback UnhandledExceptionCallback() {
- return unhandled_exception_callback_;
- }
-
- static void SetShutdownCallback(Dart_IsolateShutdownCallback cb) {
- shutdown_callback_ = cb;
- }
- static Dart_IsolateShutdownCallback ShutdownCallback() {
- return shutdown_callback_;
- }
-
- static void SetFileCallbacks(Dart_FileOpenCallback file_open,
- Dart_FileReadCallback file_read,
- Dart_FileWriteCallback file_write,
- Dart_FileCloseCallback file_close) {
- file_open_callback_ = file_open;
- file_read_callback_ = file_read;
- file_write_callback_ = file_write;
- file_close_callback_ = file_close;
- }
-
- static Dart_FileOpenCallback file_open_callback() {
- return file_open_callback_;
- }
- static Dart_FileReadCallback file_read_callback() {
- return file_read_callback_;
- }
- static Dart_FileWriteCallback file_write_callback() {
- return file_write_callback_;
- }
- static Dart_FileCloseCallback file_close_callback() {
- return file_close_callback_;
- }
-
- intptr_t* deopt_cpu_registers_copy() const {
- return deopt_cpu_registers_copy_;
- }
- void set_deopt_cpu_registers_copy(intptr_t* value) {
- ASSERT((value == NULL) || (deopt_cpu_registers_copy_ == NULL));
- deopt_cpu_registers_copy_ = value;
- }
- fpu_register_t* deopt_fpu_registers_copy() const {
- return deopt_fpu_registers_copy_;
- }
- void set_deopt_fpu_registers_copy(fpu_register_t* value) {
- ASSERT((value == NULL) || (deopt_fpu_registers_copy_ == NULL));
- deopt_fpu_registers_copy_ = value;
- }
- intptr_t* deopt_frame_copy() const { return deopt_frame_copy_; }
- void SetDeoptFrameCopy(intptr_t* value, intptr_t size) {
- ASSERT((value == NULL) || (size > 0));
- ASSERT((value == NULL) || (deopt_frame_copy_ == NULL));
- deopt_frame_copy_ = value;
- deopt_frame_copy_size_ = size;
- }
- intptr_t deopt_frame_copy_size() const { return deopt_frame_copy_size_; }
-
- void set_object_id_ring(ObjectIdRing* ring) {
- object_id_ring_ = ring;
- }
- ObjectIdRing* object_id_ring() {
- return object_id_ring_;
- }
-
- void PrepareForDeferredMaterialization(intptr_t count) {
- if (count > 0) {
- deferred_objects_ = new DeferredObject*[count];
- deferred_objects_count_ = count;
- }
- }
-
- void DeleteDeferredObjects() {
- for (intptr_t i = 0; i < deferred_objects_count_; i++) {
- delete deferred_objects_[i];
- }
- delete[] deferred_objects_;
- deferred_objects_ = NULL;
- deferred_objects_count_ = 0;
- }
-
- DeferredObject* GetDeferredObject(intptr_t idx) const {
- return deferred_objects_[idx];
- }
-
- void SetDeferredObjectAt(intptr_t idx, DeferredObject* object) {
- deferred_objects_[idx] = object;
- }
-
- intptr_t DeferredObjectsCount() const {
- return deferred_objects_count_;
- }
-
- void DeferMaterializedObjectRef(intptr_t idx, intptr_t* slot) {
- deferred_object_refs_ = new DeferredObjectRef(
- idx,
- reinterpret_cast<RawInstance**>(slot),
- deferred_object_refs_);
- }
-
- void DeferDoubleMaterialization(double value, RawDouble** slot) {
- deferred_boxes_ = new DeferredDouble(
- value,
- reinterpret_cast<RawInstance**>(slot),
- deferred_boxes_);
- }
-
- void DeferMintMaterialization(int64_t value, RawMint** slot) {
- deferred_boxes_ = new DeferredMint(
- value,
- reinterpret_cast<RawInstance**>(slot),
- deferred_boxes_);
- }
-
- void DeferFloat32x4Materialization(simd128_value_t value,
- RawFloat32x4** slot) {
- deferred_boxes_ = new DeferredFloat32x4(
- value,
- reinterpret_cast<RawInstance**>(slot),
- deferred_boxes_);
- }
-
- void DeferUint32x4Materialization(simd128_value_t value,
- RawUint32x4** slot) {
- deferred_boxes_ = new DeferredUint32x4(
- value,
- reinterpret_cast<RawInstance**>(slot),
- deferred_boxes_);
- }
-
- // Populate all deferred slots that contain boxes for double, mint, simd
- // values.
- void MaterializeDeferredBoxes();
-
- // Populate all slots containing references to objects which allocations
- // were eliminated by AllocationSinking pass.
- void MaterializeDeferredObjects();
-
- static char* GetStatus(const char* request);
-
- intptr_t BlockClassFinalization() {
- ASSERT(defer_finalization_count_ >= 0);
- return defer_finalization_count_++;
- }
-
- intptr_t UnblockClassFinalization() {
- ASSERT(defer_finalization_count_ > 0);
- return defer_finalization_count_--;
- }
-
- bool AllowClassFinalization() {
- ASSERT(defer_finalization_count_ >= 0);
- return defer_finalization_count_ == 0;
- }
-
- private:
- Isolate();
-
- void BuildName(const char* name_prefix);
- void PrintInvokedFunctions();
-
- static bool FetchStacktrace();
- static bool FetchStackFrameDetails();
- char* GetStatusDetails();
- char* GetStatusStacktrace();
- char* GetStatusStackFrame(intptr_t index);
- char* DoStacktraceInterrupt(Dart_IsolateInterruptCallback cb);
- template<class T> T* AllocateReusableHandle();
-
- static ThreadLocalKey isolate_key;
- StoreBuffer store_buffer_;
- ClassTable class_table_;
- MegamorphicCacheTable megamorphic_cache_table_;
- Dart_MessageNotifyCallback message_notify_callback_;
- char* name_;
- int64_t start_time_;
- Dart_Port main_port_;
- Heap* heap_;
- ObjectStore* object_store_;
- RawContext* top_context_;
- uword top_exit_frame_info_;
- void* init_callback_data_;
- Dart_LibraryTagHandler library_tag_handler_;
- ApiState* api_state_;
- StubCode* stub_code_;
- Debugger* debugger_;
- bool single_step_;
- Simulator* simulator_;
- LongJump* long_jump_base_;
- TimerList timer_list_;
- intptr_t deopt_id_;
- Mutex* mutex_; // protects stack_limit_ and saved_stack_limit_.
- uword stack_limit_;
- uword saved_stack_limit_;
- MessageHandler* message_handler_;
- uword spawn_data_;
- bool is_runnable_;
- GcPrologueCallbacks gc_prologue_callbacks_;
- GcEpilogueCallbacks gc_epilogue_callbacks_;
- intptr_t defer_finalization_count_;
-
- // Deoptimization support.
- intptr_t* deopt_cpu_registers_copy_;
- fpu_register_t* deopt_fpu_registers_copy_;
- intptr_t* deopt_frame_copy_;
- intptr_t deopt_frame_copy_size_;
- DeferredSlot* deferred_boxes_;
- DeferredSlot* deferred_object_refs_;
-
- intptr_t deferred_objects_count_;
- DeferredObject** deferred_objects_;
-
- // Status support.
- char* stacktrace_;
- intptr_t stack_frame_index_;
- ObjectHistogram* object_histogram_;
-
- // Ring buffer of objects assigned an id.
- ObjectIdRing* object_id_ring_;
-
- // Reusable handles support.
-#define REUSABLE_HANDLE_FIELDS(object) \
- object* object##_handle_; \
-
- REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_FIELDS)
-#undef REUSABLE_HANDLE_FIELDS
- VMHandles reusable_handles_;
-
- static Dart_IsolateCreateCallback create_callback_;
- static Dart_IsolateInterruptCallback interrupt_callback_;
- static Dart_IsolateUnhandledExceptionCallback unhandled_exception_callback_;
- static Dart_IsolateShutdownCallback shutdown_callback_;
- static Dart_FileOpenCallback file_open_callback_;
- static Dart_FileReadCallback file_read_callback_;
- static Dart_FileWriteCallback file_write_callback_;
- static Dart_FileCloseCallback file_close_callback_;
- static Dart_IsolateInterruptCallback vmstats_callback_;
-
- friend class ReusableHandleScope;
- friend class ReusableObjectHandleScope;
- DISALLOW_COPY_AND_ASSIGN(Isolate);
-};
-
-
-// When we need to execute code in an isolate, we use the
-// StartIsolateScope.
-class StartIsolateScope {
- public:
- explicit StartIsolateScope(Isolate* new_isolate)
- : new_isolate_(new_isolate), saved_isolate_(Isolate::Current()) {
- ASSERT(new_isolate_ != NULL);
- if (saved_isolate_ != new_isolate_) {
- ASSERT(Isolate::Current() == NULL);
- Isolate::SetCurrent(new_isolate_);
- new_isolate_->SetStackLimitFromCurrentTOS(reinterpret_cast<uword>(this));
- }
- }
-
- ~StartIsolateScope() {
- if (saved_isolate_ != new_isolate_) {
- new_isolate_->SetStackLimit(~static_cast<uword>(0));
- Isolate::SetCurrent(saved_isolate_);
- }
- }
-
- private:
- Isolate* new_isolate_;
- Isolate* saved_isolate_;
-
- DISALLOW_COPY_AND_ASSIGN(StartIsolateScope);
-};
-
-// When we need to temporarily become another isolate, we use the
-// SwitchIsolateScope. It is not permitted to run dart code while in
-// a SwitchIsolateScope.
-class SwitchIsolateScope {
- public:
- explicit SwitchIsolateScope(Isolate* new_isolate)
- : new_isolate_(new_isolate),
- saved_isolate_(Isolate::Current()),
- saved_stack_limit_(saved_isolate_
- ? saved_isolate_->saved_stack_limit() : 0) {
- if (saved_isolate_ != new_isolate_) {
- Isolate::SetCurrent(new_isolate_);
- if (new_isolate_ != NULL) {
- // Don't allow dart code to execute.
- new_isolate_->SetStackLimit(~static_cast<uword>(0));
- }
- }
- }
-
- ~SwitchIsolateScope() {
- if (saved_isolate_ != new_isolate_) {
- Isolate::SetCurrent(saved_isolate_);
- if (saved_isolate_ != NULL) {
- saved_isolate_->SetStackLimit(saved_stack_limit_);
- }
- }
- }
-
- private:
- Isolate* new_isolate_;
- Isolate* saved_isolate_;
- uword saved_stack_limit_;
-
- DISALLOW_COPY_AND_ASSIGN(SwitchIsolateScope);
-};
-
-
-class IsolateSpawnState {
- public:
- IsolateSpawnState(const Function& func, const Function& callback_func);
- explicit IsolateSpawnState(const char* script_url);
- ~IsolateSpawnState();
-
- Isolate* isolate() const { return isolate_; }
- void set_isolate(Isolate* value) { isolate_ = value; }
- char* script_url() const { return script_url_; }
- char* library_url() const { return library_url_; }
- char* function_name() const { return function_name_; }
- char* exception_callback_name() const { return exception_callback_name_; }
-
- RawObject* ResolveFunction();
- void Cleanup();
-
- private:
- Isolate* isolate_;
- char* script_url_;
- char* library_url_;
- char* function_name_;
- char* exception_callback_name_;
-};
-
} // namespace dart
-#endif // VM_ISOLATE_H_
+#endif // VM_DEFERRED_OBJECTS_H_
« no previous file with comments | « runtime/vm/code_generator.cc ('k') | runtime/vm/deferred_objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698