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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2014, the Dartino project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dartino project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE.md file. 3 // BSD-style license that can be found in the LICENSE.md file.
4 4
5 #ifdef DARTINO_ENABLE_DEBUGGING 5 #ifdef DARTINO_ENABLE_DEBUGGING
6 6
7 #include "src/vm/session.h" 7 #include "src/vm/session.h"
8 8
9 #include "src/shared/bytecodes.h" 9 #include "src/shared/bytecodes.h"
10 #include "src/shared/connection.h" 10 #include "src/shared/connection.h"
(...skipping 1019 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 buffer.WriteInt64(ClassMessage(Class::cast(value))); 1030 buffer.WriteInt64(ClassMessage(Class::cast(value)));
1031 connection_->Send(Connection::kClass, buffer); 1031 connection_->Send(Connection::kClass, buffer);
1032 } else if (value->IsTwoByteString()) { 1032 } else if (value->IsTwoByteString()) {
1033 // TODO(ager): We should send the character data as 16-bit values 1033 // TODO(ager): We should send the character data as 16-bit values
1034 // instead of 32-bit values. 1034 // instead of 32-bit values.
1035 TwoByteString* str = TwoByteString::cast(value); 1035 TwoByteString* str = TwoByteString::cast(value);
1036 for (int i = 0; i < str->length(); i++) { 1036 for (int i = 0; i < str->length(); i++) {
1037 buffer.WriteInt(str->get_code_unit(i)); 1037 buffer.WriteInt(str->get_code_unit(i));
1038 } 1038 }
1039 connection_->Send(Connection::kString, buffer); 1039 connection_->Send(Connection::kString, buffer);
1040 } else if (value->IsArray()) {
1041 Array* array = Array::cast(value);
1042 buffer.WriteInt(array->length());
1043 connection_->Send(Connection::kArray, buffer);
1040 } else { 1044 } else {
1045 ASSERT(value->IsInstance());
1041 buffer.WriteInt64(ClassMessage(HeapObject::cast(value)->get_class())); 1046 buffer.WriteInt64(ClassMessage(HeapObject::cast(value)->get_class()));
1042 connection_->Send(Connection::kInstance, buffer); 1047 connection_->Send(Connection::kInstance, buffer);
1043 } 1048 }
1044 } 1049 }
1045 1050
1046 void Session::SendInstanceStructure(Instance* instance) { 1051 void Session::SendInstanceStructure(Instance* instance) {
1047 WriteBuffer buffer; 1052 WriteBuffer buffer;
1048 Class* klass = instance->get_class(); 1053 Class* klass = instance->get_class();
1049 buffer.WriteInt64(ClassMessage(klass)); 1054 buffer.WriteInt64(ClassMessage(klass));
1050 int fields = klass->NumberOfInstanceFields(); 1055 int fields = klass->NumberOfInstanceFields();
1051 buffer.WriteInt(fields); 1056 buffer.WriteInt(fields);
1052 connection_->Send(Connection::kInstanceStructure, buffer); 1057 connection_->Send(Connection::kInstanceStructure, buffer);
1053 for (int i = 0; i < fields; i++) { 1058 for (int i = 0; i < fields; i++) {
1054 SendDartValue(instance->GetInstanceField(i)); 1059 SendDartValue(instance->GetInstanceField(i));
1055 } 1060 }
1056 } 1061 }
1057 1062
1063 void Session::SendArrayStructure(Array* array) {
1064 int length = array->length();
1065 WriteBuffer buffer;
1066 buffer.WriteInt(length);
1067 connection_->Send(Connection::kArrayStructure, buffer);
1068 for (int i = 0; i < length; i++) {
1069 SendDartValue(array->get(i));
1070 }
1071 }
1072
1073 void Session::SendStructure(Object* object) {
1074 if (object->IsArray()) {
1075 SendArrayStructure(Array::cast(object));
1076 } else if (object->IsInstance()) {
1077 SendInstanceStructure(Instance::cast(object));
1078 } else {
1079 SendDartValue(object);
1080 }
1081 }
1082
1058 void Session::SendProgramInfo(ClassOffsetsType* class_offsets, 1083 void Session::SendProgramInfo(ClassOffsetsType* class_offsets,
1059 FunctionOffsetsType* function_offsets) { 1084 FunctionOffsetsType* function_offsets) {
1060 ASSERT(maps_[class_map_id_] != NULL); 1085 ASSERT(maps_[class_map_id_] != NULL);
1061 ASSERT(maps_[method_map_id_] != NULL); 1086 ASSERT(maps_[method_map_id_] != NULL);
1062 1087
1063 WriteBuffer buffer; 1088 WriteBuffer buffer;
1064 1089
1065 // Write the hashtag for the program. 1090 // Write the hashtag for the program.
1066 buffer.WriteInt(program()->snapshot_hash()); 1091 buffer.WriteInt(program()->snapshot_hash());
1067 1092
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
1337 case Connection::kProcessFiberBacktraceRequest: { 1362 case Connection::kProcessFiberBacktraceRequest: {
1338 int64 fiber_id = connection()->ReadInt64(); 1363 int64 fiber_id = connection()->ReadInt64();
1339 Stack* stack = Stack::cast(session()->MapLookupById( 1364 Stack* stack = Stack::cast(session()->MapLookupById(
1340 session()->fibers_map_id_, fiber_id)); 1365 session()->fibers_map_id_, fiber_id));
1341 session()->SendStackTrace(stack); 1366 session()->SendStackTrace(stack);
1342 break; 1367 break;
1343 } 1368 }
1344 1369
1345 case Connection::kProcessUncaughtExceptionRequest: { 1370 case Connection::kProcessUncaughtExceptionRequest: {
1346 Object* exception = process()->exception(); 1371 Object* exception = process()->exception();
1347 if (exception->IsInstance()) { 1372 session()->SendStructure(exception);
1348 session()->SendInstanceStructure(Instance::cast(exception));
1349 } else {
1350 session()->SendDartValue(exception);
1351 }
1352 break; 1373 break;
1353 } 1374 }
1354 1375
1355 case Connection::kProcessInstance: 1376 case Connection::kProcessInstance:
1356 case Connection::kProcessInstanceStructure: { 1377 case Connection::kProcessInstanceStructure: {
1357 int frame_index = connection()->ReadInt(); 1378 int frame_index = connection()->ReadInt();
1358 int slot = connection()->ReadInt(); 1379 int slot = connection()->ReadInt();
1359 int fieldAccessCount = connection()->ReadInt(); 1380 int fieldAccessCount = connection()->ReadInt();
1360 Stack* stack = process()->stack(); 1381 Stack* stack = process()->stack();
1361 Frame frame(stack); 1382 Frame frame(stack);
1362 for (int i = 0; i <= frame_index; i++) frame.MovePrevious(); 1383 for (int i = 0; i <= frame_index; i++) frame.MovePrevious();
1363 word index = frame.FirstLocalIndex() - slot; 1384 word index = frame.FirstLocalIndex() - slot;
1364 if (index < frame.LastLocalIndex()) FATAL("Illegal slot offset"); 1385 if (index < frame.LastLocalIndex()) {
1386 session()->SendError(Connection::kInvalidInstanceAccess);
1387 break;
1388 }
1365 Object* object = stack->get(index); 1389 Object* object = stack->get(index);
1366 for (int i = 0; i < fieldAccessCount; i++) { 1390 for (int i = 0; i < fieldAccessCount; i++) {
1367 if (!object->IsInstance()) { 1391 if (object->IsArray()) {
1392 Array* array = Array::cast(object);
1393 int index = connection()->ReadInt();
1394 if (index < 0 || index >= array->length()) {
1395 session()->SendError(Connection::kInvalidInstanceAccess);
1396 break;
1397 }
1398 object = array->get(index);
1399 } else if (object->IsInstance()) {
1400 Instance* instance = Instance::cast(object);
1401 Class* klass = instance->get_class();
1402 int fieldAccess = connection()->ReadInt();
1403 if (fieldAccess < 0 ||
1404 fieldAccess >= klass->NumberOfInstanceFields()) {
1405 session()->SendError(Connection::kInvalidInstanceAccess);
1406 break;
1407 }
1408 object = instance->GetInstanceField(fieldAccess);
1409 } else {
1368 session()->SendError(Connection::kInvalidInstanceAccess); 1410 session()->SendError(Connection::kInvalidInstanceAccess);
1411 break;
1369 } 1412 }
1370 Instance* instance = Instance::cast(object);
1371 Class* klass = instance->get_class();
1372 int fieldAccess = connection()->ReadInt();
1373 if (fieldAccess < 0 || fieldAccess >= klass->NumberOfInstanceFields()) {
1374 session()->SendError(Connection::kInvalidInstanceAccess);
1375 }
1376 object = instance->GetInstanceField(fieldAccess);
1377 } 1413 }
1378 if (opcode == Connection::kProcessInstanceStructure && 1414 if (opcode == Connection::kProcessInstanceStructure) {
1379 object->IsInstance()) { 1415 session()->SendStructure(object);
1380 session()->SendInstanceStructure(Instance::cast(object));
1381 } else { 1416 } else {
1382 session()->SendDartValue(object); 1417 session()->SendDartValue(object);
1383 } 1418 }
1384 break; 1419 break;
1385 } 1420 }
1386 1421
1387 case Connection::kProcessRestartFrame: { 1422 case Connection::kProcessRestartFrame: {
1388 int frame_index = connection()->ReadInt(); 1423 int frame_index = connection()->ReadInt();
1389 RestartFrame(frame_index); 1424 RestartFrame(frame_index);
1390 process()->set_exception(program()->null_object()); 1425 process()->set_exception(program()->null_object());
(...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after
2252 if (program()->was_loaded_from_snapshot()) { 2287 if (program()->was_loaded_from_snapshot()) {
2253 return program()->OffsetOf(HeapObject::cast(klass)); 2288 return program()->OffsetOf(HeapObject::cast(klass));
2254 } else { 2289 } else {
2255 return MapLookupByObject(class_map_id_, klass); 2290 return MapLookupByObject(class_map_id_, klass);
2256 } 2291 }
2257 } 2292 }
2258 2293
2259 } // namespace dartino 2294 } // namespace dartino
2260 2295
2261 #endif // DARTINO_ENABLE_DEBUGGING 2296 #endif // DARTINO_ENABLE_DEBUGGING
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698