| Index: runtime/vm/object.cc
|
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
|
| index 7fb08c8ed2496289583e41b645155285d440723b..7643cdbfc5ffc2cd79a4b1b9842a94c0f83fca24 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::PrintSharedInstanceJSON(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;
|
| + }
|
| +
|
| + PrintSharedInstanceJSON(&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);
|
| + PrintSharedInstanceJSON(&jsobj, ref);
|
| + 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);
|
| + PrintSharedInstanceJSON(&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);
|
| + PrintSharedInstanceJSON(&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);
|
| + PrintSharedInstanceJSON(&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());
|
| + PrintSharedInstanceJSON(&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());
|
| + PrintSharedInstanceJSON(&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;
|
|
|