OLD | NEW |
1 // Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 library dartino_compiler.vm_commands; | 5 library dartino_compiler.vm_commands; |
6 | 6 |
7 import 'dart:convert' show | 7 import 'dart:convert' show |
8 UTF8; | 8 UTF8; |
9 | 9 |
10 import 'dart:typed_data' show | 10 import 'dart:typed_data' show |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 int floatSize = CommandBuffer.readInt32FromBuffer(buffer, offset); | 43 int floatSize = CommandBuffer.readInt32FromBuffer(buffer, offset); |
44 offset += 4; | 44 offset += 4; |
45 int vmState = CommandBuffer.readInt32FromBuffer(buffer, offset); | 45 int vmState = CommandBuffer.readInt32FromBuffer(buffer, offset); |
46 return new HandShakeResult( | 46 return new HandShakeResult( |
47 success, version, wordSize, floatSize, VmState.values[vmState]); | 47 success, version, wordSize, floatSize, VmState.values[vmState]); |
48 case VmCommandCode.InstanceStructure: | 48 case VmCommandCode.InstanceStructure: |
49 int classId = | 49 int classId = |
50 translateClass(CommandBuffer.readInt64FromBuffer(buffer, 0)); | 50 translateClass(CommandBuffer.readInt64FromBuffer(buffer, 0)); |
51 int fields = CommandBuffer.readInt32FromBuffer(buffer, 8); | 51 int fields = CommandBuffer.readInt32FromBuffer(buffer, 8); |
52 return new InstanceStructure(classId, fields); | 52 return new InstanceStructure(classId, fields); |
| 53 case VmCommandCode.ArrayStructure: |
| 54 int length = CommandBuffer.readInt32FromBuffer(buffer, 0); |
| 55 return new ArrayStructure(length); |
53 case VmCommandCode.Instance: | 56 case VmCommandCode.Instance: |
54 int classId = translateClass( | 57 int classId = translateClass( |
55 CommandBuffer.readInt64FromBuffer(buffer, 0)); | 58 CommandBuffer.readInt64FromBuffer(buffer, 0)); |
56 return new Instance(classId); | 59 return new Instance(classId); |
57 case VmCommandCode.Class: | 60 case VmCommandCode.Class: |
58 int classId = translateClass( | 61 int classId = translateClass( |
59 CommandBuffer.readInt64FromBuffer(buffer, 0)); | 62 CommandBuffer.readInt64FromBuffer(buffer, 0)); |
60 return new ClassValue(classId); | 63 return new ClassValue(classId); |
61 case VmCommandCode.Integer: | 64 case VmCommandCode.Integer: |
62 int value = CommandBuffer.readInt64FromBuffer(buffer, 0); | 65 int value = CommandBuffer.readInt64FromBuffer(buffer, 0); |
63 return new Integer(value); | 66 return new Integer(value); |
64 case VmCommandCode.Double: | 67 case VmCommandCode.Double: |
65 return new Double(CommandBuffer.readDoubleFromBuffer(buffer, 0)); | 68 return new Double(CommandBuffer.readDoubleFromBuffer(buffer, 0)); |
66 case VmCommandCode.Boolean: | 69 case VmCommandCode.Boolean: |
67 return new Boolean(CommandBuffer.readBoolFromBuffer(buffer, 0)); | 70 return new Boolean(CommandBuffer.readBoolFromBuffer(buffer, 0)); |
68 case VmCommandCode.Null: | 71 case VmCommandCode.Null: |
69 return const NullValue(); | 72 return const NullValue(); |
70 case VmCommandCode.String: | 73 case VmCommandCode.String: |
71 return new StringValue( | 74 return new StringValue( |
72 CommandBuffer.readStringFromBuffer(buffer, 0, buffer.length)); | 75 CommandBuffer.readStringFromBuffer(buffer, 0, buffer.length)); |
| 76 case VmCommandCode.Array: |
| 77 int length = CommandBuffer.readInt32FromBuffer(buffer, 0); |
| 78 return new Array(length); |
73 case VmCommandCode.StdoutData: | 79 case VmCommandCode.StdoutData: |
74 return new StdoutData(buffer); | 80 return new StdoutData(buffer); |
75 case VmCommandCode.StderrData: | 81 case VmCommandCode.StderrData: |
76 return new StderrData(buffer); | 82 return new StderrData(buffer); |
77 case VmCommandCode.ObjectId: | 83 case VmCommandCode.ObjectId: |
78 int id = CommandBuffer.readInt64FromBuffer(buffer, 0); | 84 int id = CommandBuffer.readInt64FromBuffer(buffer, 0); |
79 return new ObjectId(id); | 85 return new ObjectId(id); |
80 case VmCommandCode.ProcessBacktrace: | 86 case VmCommandCode.ProcessBacktrace: |
81 int frames = CommandBuffer.readInt32FromBuffer(buffer, 0); | 87 int frames = CommandBuffer.readInt32FromBuffer(buffer, 0); |
82 ProcessBacktrace backtrace = new ProcessBacktrace(frames); | 88 ProcessBacktrace backtrace = new ProcessBacktrace(frames); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 Int32List classTable = readArray(classEntries); | 163 Int32List classTable = readArray(classEntries); |
158 | 164 |
159 int functionEntries = readInt(); | 165 int functionEntries = readInt(); |
160 Int32List functionTable = readArray(functionEntries); | 166 Int32List functionTable = readArray(functionEntries); |
161 | 167 |
162 return new ProgramInfoCommand(classTable, functionTable, hash); | 168 return new ProgramInfoCommand(classTable, functionTable, hash); |
163 case VmCommandCode.DebuggingReply: | 169 case VmCommandCode.DebuggingReply: |
164 bool isFromSnapshot = CommandBuffer.readBoolFromBuffer(buffer, 0); | 170 bool isFromSnapshot = CommandBuffer.readBoolFromBuffer(buffer, 0); |
165 int snapshotHash = CommandBuffer.readInt32FromBuffer(buffer, 1); | 171 int snapshotHash = CommandBuffer.readInt32FromBuffer(buffer, 1); |
166 return new DebuggingReply(isFromSnapshot, snapshotHash); | 172 return new DebuggingReply(isFromSnapshot, snapshotHash); |
| 173 case VmCommandCode.CommandError: |
| 174 int errorCode = CommandBuffer.readInt32FromBuffer(buffer, 0); |
| 175 return new CommandError(ErrorCode.values[errorCode]); |
167 default: | 176 default: |
168 throw 'Unhandled command in VmCommand.fromBuffer: $code'; | 177 throw 'Unhandled command in VmCommand.fromBuffer: $code'; |
169 } | 178 } |
170 } | 179 } |
171 | 180 |
172 void addTo(Sink<List<int>> sink, int translateObject( | 181 void addTo(Sink<List<int>> sink, int translateObject( |
173 MapId mapId, int index)) { | 182 MapId mapId, int index)) { |
174 internalAddTo(sink, new CommandBuffer<VmCommandCode>(), translateObject); | 183 internalAddTo(sink, new CommandBuffer<VmCommandCode>(), translateObject); |
175 } | 184 } |
176 | 185 |
(...skipping 1016 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1193 ..addUint32(fieldAccesses.length); | 1202 ..addUint32(fieldAccesses.length); |
1194 for (int fieldAccess in fieldAccesses) { | 1203 for (int fieldAccess in fieldAccesses) { |
1195 buffer.addUint32(fieldAccess); | 1204 buffer.addUint32(fieldAccess); |
1196 } | 1205 } |
1197 buffer.sendOn(sink, code); | 1206 buffer.sendOn(sink, code); |
1198 } | 1207 } |
1199 | 1208 |
1200 /// Peer will respond with a [DartValue]. | 1209 /// Peer will respond with a [DartValue]. |
1201 int get numberOfResponsesExpected => 1; | 1210 int get numberOfResponsesExpected => 1; |
1202 | 1211 |
1203 String valuesToString() => "frame: $frame, slot: $slot"; | 1212 String valuesToString() => |
| 1213 "frame: $frame, slot: $slot, fieldAccesses: $fieldAccesses"; |
1204 } | 1214 } |
1205 | 1215 |
1206 class ProcessInstanceStructure extends VmCommand { | 1216 class ProcessInstanceStructure extends VmCommand { |
1207 final int frame; | 1217 final int frame; |
1208 final int slot; | 1218 final int slot; |
1209 final List<int> fieldAccesses; | 1219 final List<int> fieldAccesses; |
1210 | 1220 |
1211 const ProcessInstanceStructure(this.frame, this.slot, this.fieldAccesses) | 1221 const ProcessInstanceStructure(this.frame, this.slot, this.fieldAccesses) |
1212 : super(VmCommandCode.ProcessInstanceStructure); | 1222 : super(VmCommandCode.ProcessInstanceStructure); |
1213 | 1223 |
(...skipping 10 matching lines...) Expand all Loading... |
1224 } | 1234 } |
1225 buffer.sendOn(sink, code); | 1235 buffer.sendOn(sink, code); |
1226 } | 1236 } |
1227 | 1237 |
1228 /// Peer will respond with a [DartValue] or [InstanceStructure] and a number | 1238 /// Peer will respond with a [DartValue] or [InstanceStructure] and a number |
1229 /// of [DartValue]s. | 1239 /// of [DartValue]s. |
1230 /// | 1240 /// |
1231 /// The number of responses is not fixed. | 1241 /// The number of responses is not fixed. |
1232 int get numberOfResponsesExpected => null; | 1242 int get numberOfResponsesExpected => null; |
1233 | 1243 |
1234 String valuesToString() => "frame: $frame, slot: $slot"; | 1244 String valuesToString() => |
| 1245 "frame: $frame, slot: $slot fieldAccesses: $fieldAccesses"; |
1235 } | 1246 } |
1236 | 1247 |
1237 class ProcessRestartFrame extends VmCommand { | 1248 class ProcessRestartFrame extends VmCommand { |
1238 final int frame; | 1249 final int frame; |
1239 | 1250 |
1240 const ProcessRestartFrame(this.frame) | 1251 const ProcessRestartFrame(this.frame) |
1241 : super(VmCommandCode.ProcessRestartFrame); | 1252 : super(VmCommandCode.ProcessRestartFrame); |
1242 | 1253 |
1243 void internalAddTo( | 1254 void internalAddTo( |
1244 Sink<List<int>> sink, | 1255 Sink<List<int>> sink, |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1564 CommandBuffer<VmCommandCode> buffer, | 1575 CommandBuffer<VmCommandCode> buffer, |
1565 int translateObject(MapId mapId, int index)) { | 1576 int translateObject(MapId mapId, int index)) { |
1566 throw new UnimplementedError(); | 1577 throw new UnimplementedError(); |
1567 } | 1578 } |
1568 | 1579 |
1569 int get numberOfResponsesExpected => 0; | 1580 int get numberOfResponsesExpected => 0; |
1570 | 1581 |
1571 String valuesToString() => "classId: $classId, fields: $fields"; | 1582 String valuesToString() => "classId: $classId, fields: $fields"; |
1572 } | 1583 } |
1573 | 1584 |
| 1585 class ArrayStructure extends VmCommand { |
| 1586 final int length; |
| 1587 const ArrayStructure(this.length) |
| 1588 : super(VmCommandCode.ArrayStructure); |
| 1589 |
| 1590 void internalAddTo( |
| 1591 Sink<List<int>> sink, |
| 1592 CommandBuffer<VmCommandCode> buffer, |
| 1593 int translateObject(MapId mapId, int index)) { |
| 1594 throw new UnimplementedError(); |
| 1595 } |
| 1596 |
| 1597 int get numberOfResponsesExpected => 0; |
| 1598 |
| 1599 String valuesToString() => "length: $length"; |
| 1600 } |
| 1601 |
1574 abstract class DartValue extends VmCommand { | 1602 abstract class DartValue extends VmCommand { |
1575 const DartValue(VmCommandCode code) | 1603 const DartValue(VmCommandCode code) |
1576 : super(code); | 1604 : super(code); |
1577 | 1605 |
1578 void internalAddTo( | 1606 void internalAddTo( |
1579 Sink<List<int>> sink, | 1607 Sink<List<int>> sink, |
1580 CommandBuffer<VmCommandCode> buffer, | 1608 CommandBuffer<VmCommandCode> buffer, |
1581 int translateObject(MapId mapId, int index)) { | 1609 int translateObject(MapId mapId, int index)) { |
1582 throw new UnimplementedError(); | 1610 throw new UnimplementedError(); |
1583 } | 1611 } |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1658 | 1686 |
1659 class StringValue extends DartValue { | 1687 class StringValue extends DartValue { |
1660 final String value; | 1688 final String value; |
1661 | 1689 |
1662 const StringValue(this.value) | 1690 const StringValue(this.value) |
1663 : super(VmCommandCode.String); | 1691 : super(VmCommandCode.String); |
1664 | 1692 |
1665 String dartToString() => "'$value'"; | 1693 String dartToString() => "'$value'"; |
1666 } | 1694 } |
1667 | 1695 |
| 1696 class Array extends DartValue { |
| 1697 final int length; |
| 1698 |
| 1699 const Array(this.length) |
| 1700 : super(VmCommandCode.Array); |
| 1701 |
| 1702 String dartToString() => "array of length $length"; |
| 1703 } |
| 1704 |
1668 class CommandError extends VmCommand { | 1705 class CommandError extends VmCommand { |
1669 final ErrorCode errorCode; | 1706 final ErrorCode errorCode; |
1670 | 1707 |
1671 const CommandError(this.errorCode) | 1708 const CommandError(this.errorCode) |
1672 : super(VmCommandCode.CommandError); | 1709 : super(VmCommandCode.CommandError); |
1673 | 1710 |
1674 int get numberOfResponsesExpected => 0; | 1711 int get numberOfResponsesExpected => 0; |
1675 | 1712 |
1676 String valuesToString() => "command error: $errorCode"; | 1713 String valuesToString() => "command error: $errorCode"; |
1677 } | 1714 } |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1793 MapLookup, | 1830 MapLookup, |
1794 ObjectId, | 1831 ObjectId, |
1795 | 1832 |
1796 Integer, | 1833 Integer, |
1797 Boolean, | 1834 Boolean, |
1798 Null, | 1835 Null, |
1799 Double, | 1836 Double, |
1800 String, | 1837 String, |
1801 Instance, | 1838 Instance, |
1802 Class, | 1839 Class, |
1803 InstanceStructure | 1840 Array, |
| 1841 InstanceStructure, |
| 1842 ArrayStructure, |
1804 } | 1843 } |
1805 | 1844 |
1806 enum MapId { | 1845 enum MapId { |
1807 methods, | 1846 methods, |
1808 classes, | 1847 classes, |
1809 constants, | 1848 constants, |
1810 fibers, | 1849 fibers, |
1811 } | 1850 } |
OLD | NEW |