Index: runtime/vm/isolate.h |
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h |
index 3adb40bfb4ccabfebf50722c445453e545688b6f..e7274d6f4fa3cd8b365426e59c17cecd6e4936f8 100644 |
--- a/runtime/vm/isolate.h |
+++ b/runtime/vm/isolate.h |
@@ -31,11 +31,34 @@ class ObjectPointerVisitor; |
class ObjectStore; |
class RawArray; |
class RawContext; |
+class RawDouble; |
class RawError; |
class StackResource; |
class StubCode; |
class Zone; |
+ |
+// Used by the deoptimization infrastructure to defer allocation of Double |
+// objects until frame is fully rewritten and GC is safe. |
+// See callers of Isolate::DeferDoubleMaterialization. |
+class DeferredDouble { |
+ public: |
+ DeferredDouble(double value, RawDouble** slot, DeferredDouble* next) |
+ : value_(value), slot_(slot), next_(next) { } |
+ |
+ double value() const { return value_; } |
+ RawDouble** slot() const { return slot_; } |
+ DeferredDouble* next() const { return next_; } |
+ |
+ private: |
+ const double value_; |
+ RawDouble** const slot_; |
+ DeferredDouble* const next_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DeferredDouble); |
+}; |
+ |
+ |
class Isolate : public BaseIsolate { |
public: |
~Isolate(); |
@@ -220,10 +243,19 @@ class Isolate : public BaseIsolate { |
return shutdown_callback_; |
} |
- intptr_t* deopt_registers_copy() const { return deopt_registers_copy_; } |
- void set_deopt_registers_copy(intptr_t* value) { |
- ASSERT((value == NULL) || (deopt_registers_copy_ == NULL)); |
- deopt_registers_copy_ = value; |
+ 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; |
+ } |
+ double* deopt_xmm_registers_copy() const { |
+ return deopt_xmm_registers_copy_; |
+ } |
+ void set_deopt_xmm_registers_copy(double* value) { |
+ ASSERT((value == NULL) || (deopt_xmm_registers_copy_ == NULL)); |
+ deopt_xmm_registers_copy_ = value; |
} |
intptr_t* deopt_frame_copy() const { return deopt_frame_copy_; } |
void SetDeoptFrameCopy(intptr_t* value, intptr_t size) { |
@@ -234,6 +266,17 @@ class Isolate : public BaseIsolate { |
} |
intptr_t deopt_frame_copy_size() const { return deopt_frame_copy_size_; } |
+ void DeferDoubleMaterialization(double value, RawDouble** slot) { |
+ deferred_doubles_ = new DeferredDouble( |
+ value, slot, deferred_doubles_); |
+ } |
+ |
+ DeferredDouble* DetachDeferredDoubles() { |
+ DeferredDouble* list = deferred_doubles_; |
+ deferred_doubles_ = NULL; |
+ return list; |
+ } |
+ |
private: |
Isolate(); |
@@ -273,9 +316,11 @@ class Isolate : public BaseIsolate { |
GcPrologueCallbacks gc_prologue_callbacks_; |
GcEpilogueCallbacks gc_epilogue_callbacks_; |
// Deoptimization support. |
- intptr_t* deopt_registers_copy_; |
+ intptr_t* deopt_cpu_registers_copy_; |
+ double* deopt_xmm_registers_copy_; |
intptr_t* deopt_frame_copy_; |
intptr_t deopt_frame_copy_size_; |
+ DeferredDouble* deferred_doubles_; |
static Dart_IsolateCreateCallback create_callback_; |
static Dart_IsolateInterruptCallback interrupt_callback_; |