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); |
} |