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

Unified Diff: runtime/vm/object.cc

Issue 184653003: Support displaying of types in the observatory (back-end only for now): (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 9 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/isolate.cc ('k') | runtime/vm/service.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.cc
===================================================================
--- runtime/vm/object.cc (revision 34138)
+++ runtime/vm/object.cc (working copy)
@@ -3925,6 +3925,14 @@
}
}
}
+ {
+ JSONObject typesRef(&jsobj, "canonicalTypes");
+ typesRef.AddProperty("type", "@TypeList");
+ typesRef.AddPropertyF("id", "classes/%" Pd "/types", id());
+ jsobj.AddPropertyF("name", "canonical types of %s", internal_class_name);
+ jsobj.AddPropertyF("user_name", "canonical types of %s",
+ user_visible_class_name);
+ }
}
@@ -4137,6 +4145,57 @@
void TypeArguments::PrintToJSONStream(JSONStream* stream, bool ref) const {
JSONObject jsobj(stream);
+ if (IsNull()) {
+ jsobj.AddProperty("type", ref ? "@Null" : "Null");
+ jsobj.AddProperty("id", "objects/null");
+ return;
+ }
+ // The index in the canonical_type_arguments table cannot be used as part of
+ // the object id (as in typearguments/id), because the indices are not
+ // preserved when the table grows and the entries get rehashed. Use the ring.
+ Isolate* isolate = Isolate::Current();
+ ObjectStore* object_store = isolate->object_store();
+ const Array& table = Array::Handle(object_store->canonical_type_arguments());
+ ASSERT(table.Length() > 0);
+ 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);
+ jsobj.AddProperty("length", Length());
+ jsobj.AddProperty("num_instantiations", NumInstantiations());
+ if (ref) {
+ return;
+ }
+ {
+ JSONArray jsarr(&jsobj, "types");
+ AbstractType& type_arg = AbstractType::Handle();
+ for (intptr_t i = 0; i < Length(); i++) {
+ type_arg = TypeAt(i);
+ jsarr.AddValue(type_arg);
+ }
+ }
+ if (!IsInstantiated()) {
+ JSONArray jsarr(&jsobj, "instantiations");
+ Array& prior_instantiations = Array::Handle(instantiations());
+ ASSERT(prior_instantiations.Length() > 0); // Always at least a sentinel.
+ TypeArguments& type_args = TypeArguments::Handle();
+ intptr_t i = 0;
+ while (true) {
+ if (prior_instantiations.At(i) == Smi::New(StubCode::kNoInstantiator)) {
+ break;
+ }
+ JSONObject instantiation(&jsarr);
+ type_args ^= prior_instantiations.At(i);
+ instantiation.AddProperty("instantiator", type_args, true);
+ type_args ^= prior_instantiations.At(i + 1);
+ instantiation.AddProperty("instantiated", type_args, true);
+ i += 2;
+ }
+ }
}
@@ -12429,7 +12488,7 @@
return;
} else {
ObjectIdRing* ring = Isolate::Current()->object_id_ring();
- intptr_t id = ring->GetIdForObject(raw());
+ const intptr_t id = ring->GetIdForObject(raw());
if (IsClosure()) {
const Function& closureFunc = Function::Handle(Closure::function(*this));
jsobj.AddProperty("closureFunc", closureFunc);
@@ -12879,7 +12938,7 @@
void AbstractType::PrintToJSONStream(JSONStream* stream, bool ref) const {
- JSONObject jsobj(stream);
+ UNREACHABLE();
}
@@ -13420,7 +13479,23 @@
void Type::PrintToJSONStream(JSONStream* stream, bool ref) const {
+ 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);
+ 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);
+ if (ref) {
+ return;
+ }
+ jsobj.AddProperty("type_class", type_cls);
+ jsobj.AddProperty("type_arguments", TypeArguments::Handle(arguments()));
}
@@ -13589,6 +13664,18 @@
void TypeRef::PrintToJSONStream(JSONStream* stream, bool ref) const {
JSONObject jsobj(stream);
+ 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);
+ if (ref) {
+ return;
+ }
+ jsobj.AddProperty("ref_type", AbstractType::Handle(type()));
}
@@ -13793,6 +13880,22 @@
void TypeParameter::PrintToJSONStream(JSONStream* stream, bool ref) const {
JSONObject jsobj(stream);
+ 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);
+ if (ref) {
+ return;
+ }
+ jsobj.AddProperty("index", index());
+ const AbstractType& upper_bound = AbstractType::Handle(bound());
+ jsobj.AddProperty("upper_bound", upper_bound);
}
@@ -13974,6 +14077,19 @@
void BoundedType::PrintToJSONStream(JSONStream* stream, bool ref) const {
JSONObject jsobj(stream);
+ 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);
+ if (ref) {
+ return;
+ }
+ jsobj.AddProperty("bounded_type", AbstractType::Handle(type()));
+ jsobj.AddProperty("upper_bound", AbstractType::Handle(bound()));
}
@@ -14007,7 +14123,7 @@
void MixinAppType::PrintToJSONStream(JSONStream* stream, bool ref) const {
- JSONObject jsobj(stream);
+ UNREACHABLE();
}
@@ -16628,7 +16744,7 @@
JSONObject jsobj(stream);
Class& cls = Class::Handle(this->clazz());
ObjectIdRing* ring = Isolate::Current()->object_id_ring();
- intptr_t id = ring->GetIdForObject(raw());
+ const intptr_t id = ring->GetIdForObject(raw());
jsobj.AddProperty("type", JSONType(ref));
jsobj.AddPropertyF("id", "objects/%" Pd "", id);
jsobj.AddProperty("class", cls);
@@ -16968,7 +17084,7 @@
JSONObject jsobj(stream);
Class& cls = Class::Handle(this->clazz());
ObjectIdRing* ring = Isolate::Current()->object_id_ring();
- intptr_t id = ring->GetIdForObject(raw());
+ const intptr_t id = ring->GetIdForObject(raw());
jsobj.AddProperty("type", JSONType(ref));
jsobj.AddPropertyF("id", "objects/%" Pd "", id);
jsobj.AddProperty("class", cls);
« no previous file with comments | « runtime/vm/isolate.cc ('k') | runtime/vm/service.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698