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

Unified Diff: src/vm/session.cc

Issue 2065933004: Support for accessing arrays in the debugger (Closed) Base URL: git@github.com:dartino/sdk.git@master
Patch Set: Created 4 years, 6 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
Index: src/vm/session.cc
diff --git a/src/vm/session.cc b/src/vm/session.cc
index 03e7ad273bbac8a35854d931aec7903c6cdcc710..effefe763738f634f1421a7fc8d7bcfd51716f36 100644
--- a/src/vm/session.cc
+++ b/src/vm/session.cc
@@ -1037,7 +1037,12 @@ void Session::SendDartValue(Object* value) {
buffer.WriteInt(str->get_code_unit(i));
}
connection_->Send(Connection::kString, buffer);
+ } else if (value->IsArray()) {
+ Array* array = Array::cast(value);
+ buffer.WriteInt(array->length());
+ connection_->Send(Connection::kArray, buffer);
} else {
+ ASSERT(value->IsInstance());
buffer.WriteInt64(ClassMessage(HeapObject::cast(value)->get_class()));
connection_->Send(Connection::kInstance, buffer);
}
@@ -1055,6 +1060,26 @@ void Session::SendInstanceStructure(Instance* instance) {
}
}
+void Session::SendArrayStructure(Array* array) {
+ int length = array->length();
+ WriteBuffer buffer;
+ buffer.WriteInt(length);
+ connection_->Send(Connection::kArrayStructure, buffer);
+ for (int i = 0; i < length; i++) {
+ SendDartValue(array->get(i));
+ }
+}
+
+void Session::SendStructure(Object* object) {
+ if (object->IsArray()) {
+ SendArrayStructure(Array::cast(object));
+ } else if (object->IsInstance()) {
+ SendInstanceStructure(Instance::cast(object));
+ } else {
+ SendDartValue(object);
+ }
+}
+
void Session::SendProgramInfo(ClassOffsetsType* class_offsets,
FunctionOffsetsType* function_offsets) {
ASSERT(maps_[class_map_id_] != NULL);
@@ -1344,11 +1369,7 @@ SessionState* PausedState::ProcessMessage(Connection::Opcode opcode) {
case Connection::kProcessUncaughtExceptionRequest: {
Object* exception = process()->exception();
- if (exception->IsInstance()) {
- session()->SendInstanceStructure(Instance::cast(exception));
- } else {
- session()->SendDartValue(exception);
- }
+ session()->SendStructure(exception);
break;
}
@@ -1361,23 +1382,37 @@ SessionState* PausedState::ProcessMessage(Connection::Opcode opcode) {
Frame frame(stack);
for (int i = 0; i <= frame_index; i++) frame.MovePrevious();
word index = frame.FirstLocalIndex() - slot;
- if (index < frame.LastLocalIndex()) FATAL("Illegal slot offset");
+ if (index < frame.LastLocalIndex()) {
+ session()->SendError(Connection::kInvalidInstanceAccess);
+ break;
+ }
Object* object = stack->get(index);
for (int i = 0; i < fieldAccessCount; i++) {
- if (!object->IsInstance()) {
- session()->SendError(Connection::kInvalidInstanceAccess);
- }
- Instance* instance = Instance::cast(object);
- Class* klass = instance->get_class();
- int fieldAccess = connection()->ReadInt();
- if (fieldAccess < 0 || fieldAccess >= klass->NumberOfInstanceFields()) {
+ if (object->IsArray()) {
+ Array* array = Array::cast(object);
+ int index = connection()->ReadInt();
+ if (index < 0 || index >= array->length()) {
+ session()->SendError(Connection::kInvalidInstanceAccess);
+ break;
+ }
+ object = array->get(index);
+ } else if (object->IsInstance()) {
+ Instance* instance = Instance::cast(object);
+ Class* klass = instance->get_class();
+ int fieldAccess = connection()->ReadInt();
+ if (fieldAccess < 0 ||
+ fieldAccess >= klass->NumberOfInstanceFields()) {
+ session()->SendError(Connection::kInvalidInstanceAccess);
+ break;
+ }
+ object = instance->GetInstanceField(fieldAccess);
+ } else {
session()->SendError(Connection::kInvalidInstanceAccess);
+ break;
}
- object = instance->GetInstanceField(fieldAccess);
}
- if (opcode == Connection::kProcessInstanceStructure &&
- object->IsInstance()) {
- session()->SendInstanceStructure(Instance::cast(object));
+ if (opcode == Connection::kProcessInstanceStructure) {
+ session()->SendStructure(object);
} else {
session()->SendDartValue(object);
}

Powered by Google App Engine
This is Rietveld 408576698