Chromium Code Reviews| Index: runtime/vm/object.cc |
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
| index 7fb08c8ed2496289583e41b645155285d440723b..2e13aa362d332da7cb7af9b97be98e75e8f9961e 100644 |
| --- a/runtime/vm/object.cc |
| +++ b/runtime/vm/object.cc |
| @@ -6365,6 +6365,13 @@ void Function::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| jsobj.AddProperty("code", Object::Handle(CurrentCode())); |
| jsobj.AddProperty("deoptimizations", |
| static_cast<intptr_t>(deoptimization_counter())); |
| + |
| + const Script& script = Script::Handle(this->script()); |
| + if (!script.IsNull()) { |
| + jsobj.AddProperty("script", script); |
| + jsobj.AddProperty("token_pos", token_pos(); |
| + jsobj.AddProperty("end_token_pos", end_token_pos(); |
| + } |
| } |
| @@ -6663,14 +6670,8 @@ void Field::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| jsobj.AddProperty("owner", cls); |
| - // TODO(turnidge): Once the vmservice supports returning types, |
| - // return the type here instead of the class. |
| AbstractType& declared_type = AbstractType::Handle(type()); |
| - if (declared_type.HasResolvedTypeClass()) { |
| - cls = declared_type.type_class(); |
| - jsobj.AddProperty("declared_type", cls); |
| - } |
| - |
| + jsobj.AddProperty("declared_type", declared_type); |
| jsobj.AddProperty("static", is_static()); |
| jsobj.AddProperty("final", is_final()); |
| jsobj.AddProperty("const", is_const()); |
| @@ -12472,56 +12473,20 @@ const char* Instance::ToUserCString(intptr_t max_len, intptr_t nesting) const { |
| } |
| -void Instance::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| - JSONObject jsobj(stream); |
| +void Instance::PrintToJSONObjectCommon(JSONObject* jsobj, bool ref) const { |
| + jsobj->AddProperty("type", JSONType(ref)); |
| Class& cls = Class::Handle(this->clazz()); |
| - |
| - // TODO(turnidge): Handle <optimized out> like other null-like values. |
| - if (IsNull()) { |
| - jsobj.AddProperty("type", ref ? "@Null" : "Null"); |
| - jsobj.AddProperty("id", "objects/null"); |
| - jsobj.AddProperty("preview", "null"); |
| - return; |
| - } else if (raw() == Object::sentinel().raw()) { |
| - jsobj.AddProperty("type", ref ? "@Null" : "Null"); |
| - jsobj.AddProperty("id", "objects/not-initialized"); |
| - jsobj.AddProperty("preview", "<not initialized>"); |
| - return; |
| - } else if (raw() == Object::transition_sentinel().raw()) { |
| - jsobj.AddProperty("type", ref ? "@Null" : "Null"); |
| - jsobj.AddProperty("id", "objects/being-initialized"); |
| - jsobj.AddProperty("preview", "<being initialized>"); |
| - return; |
| - } else if (raw() == Symbols::OptimizedOut().raw()) { |
| - // TODO(turnidge): This is a hack. The user could have this |
| - // special string in their program. Fixing this involves updating |
| - // the debugging api a bit. |
| - jsobj.AddProperty("type", ref ? "@Null" : "Null"); |
| - jsobj.AddProperty("id", "objects/optimized-out"); |
| - jsobj.AddProperty("preview", "<optimized out>"); |
| - return; |
| - } else { |
| - ObjectIdRing* ring = Isolate::Current()->object_id_ring(); |
| - const intptr_t id = ring->GetIdForObject(raw()); |
| - if (IsClosure()) { |
| - const Function& closureFunc = Function::Handle(Closure::function(*this)); |
| - jsobj.AddProperty("closureFunc", closureFunc); |
| - jsobj.AddProperty("type", ref ? "@Closure" : "Closure"); |
| - } else { |
| - jsobj.AddProperty("type", JSONType(ref)); |
| - } |
| - jsobj.AddPropertyF("id", "objects/%" Pd "", id); |
| - jsobj.AddProperty("class", cls); |
| - jsobj.AddProperty("preview", ToUserCString(40)); |
| - } |
| + jsobj->AddProperty("class", cls); |
| if (ref) { |
| return; |
| } |
| + jsobj->AddProperty("size", raw()->Size()); |
| + |
| // Walk the superclass chain, adding all instance fields. |
| { |
| Instance& fieldValue = Instance::Handle(); |
| - JSONArray jsarr(&jsobj, "fields"); |
| + JSONArray jsarr(jsobj, "fields"); |
| while (!cls.IsNull()) { |
| const Array& field_array = Array::Handle(cls.fields()); |
| Field& field = Field::Handle(); |
| @@ -12541,7 +12506,7 @@ void Instance::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| } |
| if (NumNativeFields() > 0) { |
| - JSONArray jsarr(&jsobj, "nativeFields"); |
| + JSONArray jsarr(jsobj, "nativeFields"); |
| for (intptr_t i = 0; i < NumNativeFields(); i++) { |
| intptr_t value = GetNativeField(i); |
| JSONObject jsfield(&jsarr); |
| @@ -12549,8 +12514,50 @@ void Instance::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| jsfield.AddProperty("value", value); |
| } |
| } |
| +} |
| + |
| - jsobj.AddProperty("size", raw()->Size()); |
| +void Instance::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| + JSONObject jsobj(stream); |
| + |
| + // Handle certain special instance values. |
| + if (IsNull()) { |
| + jsobj.AddProperty("type", ref ? "@Null" : "Null"); |
| + jsobj.AddProperty("id", "objects/null"); |
| + jsobj.AddProperty("preview", "null"); |
| + return; |
| + } else if (raw() == Object::sentinel().raw()) { |
| + jsobj.AddProperty("type", ref ? "@Null" : "Null"); |
| + jsobj.AddProperty("id", "objects/not-initialized"); |
| + jsobj.AddProperty("preview", "<not initialized>"); |
| + return; |
| + } else if (raw() == Object::transition_sentinel().raw()) { |
| + jsobj.AddProperty("type", ref ? "@Null" : "Null"); |
| + jsobj.AddProperty("id", "objects/being-initialized"); |
| + jsobj.AddProperty("preview", "<being initialized>"); |
| + return; |
| + } else if (raw() == Symbols::OptimizedOut().raw()) { |
| + // TODO(turnidge): This is a hack. The user could have this |
| + // special string in their program. Fixing this involves updating |
| + // the debugging api a bit. |
| + jsobj.AddProperty("type", ref ? "@Null" : "Null"); |
| + jsobj.AddProperty("id", "objects/optimized-out"); |
| + jsobj.AddProperty("preview", "<optimized out>"); |
| + return; |
| + } |
| + |
| + PrintToJSONObjectCommon(&jsobj, ref); |
| + ObjectIdRing* ring = Isolate::Current()->object_id_ring(); |
| + const intptr_t id = ring->GetIdForObject(raw()); |
| + if (IsClosure()) { |
| + const Function& closureFunc = Function::Handle(Closure::function(*this)); |
| + jsobj.AddProperty("closureFunc", closureFunc); |
| + } |
| + jsobj.AddPropertyF("id", "objects/%" Pd "", id); |
| + jsobj.AddProperty("preview", ToUserCString(40)); |
| + if (ref) { |
| + return; |
| + } |
| } |
| @@ -13493,18 +13500,20 @@ const char* Type::ToCString() const { |
| void Type::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| - // TODO(koda): Decide whether to assign stable ids to non-canonical types. |
| - if (!IsCanonical()) { |
| - return Object::PrintToJSONStream(stream, ref); |
| - } |
| - ASSERT(IsCanonical()); |
| JSONObject jsobj(stream); |
| - jsobj.AddProperty("type", JSONType(ref)); |
| - const Class& type_cls = Class::Handle(type_class()); |
| - intptr_t id = type_cls.FindCanonicalTypeIndex(*this); |
| - ASSERT(id >= 0); |
| - intptr_t cid = type_cls.id(); |
| - jsobj.AddPropertyF("id", "classes/%" Pd "/types/%" Pd "", cid, id); |
| + PrintToJSONObjectCommon(&jsobj, ref); |
|
Cutch
2014/03/25 23:12:38
This reads funny to me, maybe a rename:
InstanceC
turnidge
2014/03/26 17:05:20
Renamed to PrintSharedInstanceJSON
|
| + if (IsCanonical()) { |
| + const Class& type_cls = Class::Handle(type_class()); |
| + intptr_t id = type_cls.FindCanonicalTypeIndex(*this); |
| + ASSERT(id >= 0); |
| + intptr_t cid = type_cls.id(); |
| + jsobj.AddPropertyF("id", "classes/%" Pd "/types/%" Pd "", cid, id); |
| + jsobj.AddProperty("type_class", type_cls); |
| + } else { |
| + ObjectIdRing* ring = Isolate::Current()->object_id_ring(); |
| + const intptr_t id = ring->GetIdForObject(raw()); |
| + jsobj.AddPropertyF("id", "objects/%" Pd "", id); |
| + } |
| const char* name = String::Handle(Name()).ToCString(); |
| const char* user_name = String::Handle(UserVisibleName()).ToCString(); |
| jsobj.AddProperty("name", name); |
| @@ -13512,7 +13521,6 @@ void Type::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| if (ref) { |
| return; |
| } |
| - jsobj.AddProperty("type_class", type_cls); |
| jsobj.AddProperty("type_arguments", TypeArguments::Handle(arguments())); |
| } |
| @@ -13682,9 +13690,9 @@ const char* TypeRef::ToCString() const { |
| void TypeRef::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| JSONObject jsobj(stream); |
| + PrintToJSONObjectCommon(&jsobj, ref); |
| ObjectIdRing* ring = Isolate::Current()->object_id_ring(); |
| const intptr_t id = ring->GetIdForObject(raw()); |
| - jsobj.AddProperty("type", JSONType(ref)); |
| jsobj.AddPropertyF("id", "objects/%" Pd "", id); |
| const char* name = String::Handle(Name()).ToCString(); |
| const char* user_name = String::Handle(UserVisibleName()).ToCString(); |
| @@ -13898,16 +13906,16 @@ const char* TypeParameter::ToCString() const { |
| void TypeParameter::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| JSONObject jsobj(stream); |
| + PrintToJSONObjectCommon(&jsobj, ref); |
| ObjectIdRing* ring = Isolate::Current()->object_id_ring(); |
| const intptr_t id = ring->GetIdForObject(raw()); |
| - jsobj.AddProperty("type", JSONType(ref)); |
| jsobj.AddPropertyF("id", "objects/%" Pd "", id); |
| const char* name = String::Handle(Name()).ToCString(); |
| const char* user_name = String::Handle(UserVisibleName()).ToCString(); |
| jsobj.AddProperty("name", name); |
| jsobj.AddProperty("user_name", user_name); |
| - const Class& cls = Class::Handle(parameterized_class()); |
| - jsobj.AddProperty("parameterized_class", cls); |
| + const Class& param_cls = Class::Handle(parameterized_class()); |
| + jsobj.AddProperty("parameterized_class", param_cls); |
| if (ref) { |
| return; |
| } |
| @@ -14095,9 +14103,9 @@ const char* BoundedType::ToCString() const { |
| void BoundedType::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| JSONObject jsobj(stream); |
| + PrintToJSONObjectCommon(&jsobj, ref); |
| ObjectIdRing* ring = Isolate::Current()->object_id_ring(); |
| const intptr_t id = ring->GetIdForObject(raw()); |
| - jsobj.AddProperty("type", JSONType(ref)); |
| jsobj.AddPropertyF("id", "objects/%" Pd "", id); |
| const char* name = String::Handle(Name()).ToCString(); |
| const char* user_name = String::Handle(UserVisibleName()).ToCString(); |
| @@ -16788,12 +16796,10 @@ const char* Array::ToCString() const { |
| void Array::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| JSONObject jsobj(stream); |
| - Class& cls = Class::Handle(this->clazz()); |
| + PrintToJSONObjectCommon(&jsobj, ref); |
| ObjectIdRing* ring = Isolate::Current()->object_id_ring(); |
| const intptr_t id = ring->GetIdForObject(raw()); |
| - jsobj.AddProperty("type", JSONType(ref)); |
| jsobj.AddPropertyF("id", "objects/%" Pd "", id); |
| - jsobj.AddProperty("class", cls); |
| jsobj.AddProperty("length", Length()); |
| if (ref) { |
| return; |
| @@ -17127,12 +17133,10 @@ const char* GrowableObjectArray::ToUserCString(intptr_t max_len, |
| void GrowableObjectArray::PrintToJSONStream(JSONStream* stream, |
| bool ref) const { |
| JSONObject jsobj(stream); |
| - Class& cls = Class::Handle(this->clazz()); |
| + PrintToJSONObjectCommon(&jsobj, ref); |
| ObjectIdRing* ring = Isolate::Current()->object_id_ring(); |
| const intptr_t id = ring->GetIdForObject(raw()); |
| - jsobj.AddProperty("type", JSONType(ref)); |
| jsobj.AddPropertyF("id", "objects/%" Pd "", id); |
| - jsobj.AddProperty("class", cls); |
| jsobj.AddProperty("length", Length()); |
| if (ref) { |
| return; |