| Index: runtime/vm/isolate.cc
|
| diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
|
| index 473f0010f0298b6b4b1027018fbded63d7b84391..d445f17fa55bd6c4166cc92721859f8a06f4e45d 100644
|
| --- a/runtime/vm/isolate.cc
|
| +++ b/runtime/vm/isolate.cc
|
| @@ -311,6 +311,56 @@ void DeferredUint32x4::Materialize() {
|
| }
|
|
|
|
|
| +void DeferredObjectRef::Materialize() {
|
| + DeferredObject* obj = Isolate::Current()->GetDeferredObject(index());
|
| + *slot() = obj->object();
|
| + if (FLAG_trace_deoptimization_verbose) {
|
| + OS::PrintErr("writing instance ref at %"Px": %s\n",
|
| + reinterpret_cast<uword>(slot()),
|
| + Instance::Handle(obj->object()).ToCString());
|
| + }
|
| +}
|
| +
|
| +
|
| +RawInstance* DeferredObject::object() {
|
| + if (object_ == NULL) {
|
| + Materialize();
|
| + }
|
| + return object_->raw();
|
| +}
|
| +
|
| +
|
| +void DeferredObject::Materialize() {
|
| + Class& cls = Class::Handle();
|
| + cls ^= GetClass();
|
| +
|
| + if (FLAG_trace_deoptimization_verbose) {
|
| + OS::PrintErr("materializing instance of %s (%"Px", %"Pd" fields)\n",
|
| + cls.ToCString(),
|
| + reinterpret_cast<uword>(args_),
|
| + field_count_);
|
| + }
|
| +
|
| + const Instance& obj = Instance::ZoneHandle(Instance::New(cls));
|
| +
|
| + Field& field = Field::Handle();
|
| + Object& value = Object::Handle();
|
| + for (intptr_t i = 0; i < field_count_; i++) {
|
| + field ^= GetField(i);
|
| + value = GetValue(i);
|
| + obj.SetField(field, value);
|
| +
|
| + if (FLAG_trace_deoptimization_verbose) {
|
| + OS::PrintErr(" %s <- %s\n",
|
| + String::Handle(field.name()).ToCString(),
|
| + value.ToCString());
|
| + }
|
| + }
|
| +
|
| + object_ = &obj;
|
| +}
|
| +
|
| +
|
| Isolate::Isolate()
|
| : store_buffer_(),
|
| message_notify_callback_(NULL),
|
| @@ -344,6 +394,9 @@ Isolate::Isolate()
|
| deopt_fpu_registers_copy_(NULL),
|
| deopt_frame_copy_(NULL),
|
| deopt_frame_copy_size_(0),
|
| + deferred_boxes_(NULL),
|
| + deferred_object_refs_(NULL),
|
| + deferred_objects_count_(0),
|
| deferred_objects_(NULL),
|
| stacktrace_(NULL),
|
| stack_frame_index_(-1) {
|
| @@ -994,6 +1047,31 @@ char* Isolate::GetStatus(const char* request) {
|
| }
|
|
|
|
|
| +static void FillDeferredSlots(DeferredSlot** slot_list) {
|
| + DeferredSlot* slot = *slot_list;
|
| + *slot_list = NULL;
|
| +
|
| + while (slot != NULL) {
|
| + DeferredSlot* current = slot;
|
| + slot = slot->next();
|
| +
|
| + current->Materialize();
|
| +
|
| + delete current;
|
| + }
|
| +}
|
| +
|
| +
|
| +void Isolate::MaterializeDeferredBoxes() {
|
| + FillDeferredSlots(&deferred_boxes_);
|
| +}
|
| +
|
| +
|
| +void Isolate::MaterializeDeferredObjects() {
|
| + FillDeferredSlots(&deferred_object_refs_);
|
| +}
|
| +
|
| +
|
| static char* GetRootScriptUri(Isolate* isolate) {
|
| const Library& library =
|
| Library::Handle(isolate->object_store()->root_library());
|
|
|