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

Side by Side Diff: runtime/vm/snapshot_test.cc

Issue 9104041: Added API Dart_PostCMessage for posting a Dart_CMessage structure (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Added new API Dart_PostCMessage Created 8 years, 10 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 | Annotate | Revision Log
« runtime/bin/socket_impl.dart ('K') | « runtime/vm/snapshot.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart 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 file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "include/dart_debugger_api.h" 5 #include "include/dart_debugger_api.h"
6 #include "platform/assert.h" 6 #include "platform/assert.h"
7 #include "vm/bigint_operations.h" 7 #include "vm/bigint_operations.h"
8 #include "vm/class_finalizer.h" 8 #include "vm/class_finalizer.h"
9 #include "vm/dart_api_impl.h" 9 #include "vm/dart_api_impl.h"
10 #include "vm/dart_api_state.h" 10 #include "vm/dart_api_state.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 53
54 54
55 static Dart_CMessage* DecodeMessage(uint8_t* message, 55 static Dart_CMessage* DecodeMessage(uint8_t* message,
56 intptr_t length, 56 intptr_t length,
57 ReAlloc allocator) { 57 ReAlloc allocator) {
58 CMessageReader message_reader(message, length, allocator); 58 CMessageReader message_reader(message, length, allocator);
59 return message_reader.ReadMessage(); 59 return message_reader.ReadMessage();
60 } 60 }
61 61
62 62
63 // Compare two Dart_CObject object graphs rooted in first and
64 // second. The second graph will be destroyed by this operation no matter
65 // whether the graphs are equal or not.
66 static void CompareDartCObjects(Dart_CObject* first, Dart_CObject* second) {
67 // Return immediately if entering a cycle.
68 if (second->type == Dart_CObject::kNumberOfTypes) return;
69
70 EXPECT_NE(first, second);
71 EXPECT_EQ(first->type, second->type);
72 switch (first->type) {
73 case Dart_CObject::kNull:
74 // Nothing more to compare.
75 break;
76 case Dart_CObject::kBool:
77 EXPECT_EQ(first->value.as_bool, second->value.as_bool);
78 break;
79 case Dart_CObject::kInt32:
80 EXPECT_EQ(first->value.as_int32, second->value.as_int32);
81 break;
82 case Dart_CObject::kDouble:
83 EXPECT_EQ(first->value.as_double, second->value.as_double);
84 break;
85 case Dart_CObject::kString:
86 EXPECT_STREQ(first->value.as_string, second->value.as_string);
87 break;
88 case Dart_CObject::kArray:
89 // Use invalid type as a visited marker to avoid infinite
90 // recursion on graphs with cycles.
91 second->type = Dart_CObject::kNumberOfTypes;
92 EXPECT_EQ(first->value.as_array.length, second->value.as_array.length);
93 for (int i = 0; i < first->value.as_array.length; i++) {
94 CompareDartCObjects(first->value.as_array.values[i],
95 second->value.as_array.values[i]);
96 }
97 break;
98 default:
99 EXPECT(false);
100 }
101 }
102
103
104 static void CheckEncodeDecodeMessage(Dart_CMessage* cmessage) {
105 // Encode and decode the message.
106 uint8_t* buffer = NULL;
107 MessageWriter writer(&buffer, &malloc_allocator);
108 writer.WriteCMessage(cmessage->root);
109
110 Zone zone(Isolate::Current());
111 Dart_CMessage* new_cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
112 writer.BytesWritten(),
113 &zone_allocator);
114
115 // Check that the two messages are the same.
116 CompareDartCObjects(cmessage->root, new_cmessage->root);
117 }
118
63 TEST_CASE(SerializeNull) { 119 TEST_CASE(SerializeNull) {
64 Zone zone(Isolate::Current()); 120 Zone zone(Isolate::Current());
65 121
66 // Write snapshot with object content. 122 // Write snapshot with object content.
67 uint8_t* buffer; 123 uint8_t* buffer;
68 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 124 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
69 const Object& null_object = Object::Handle(); 125 const Object& null_object = Object::Handle();
70 writer.WriteObject(null_object.raw()); 126 writer.WriteObject(null_object.raw());
71 writer.FinalizeBuffer(); 127 writer.FinalizeBuffer();
72 128
73 // Create a snapshot object using the buffer. 129 // Create a snapshot object using the buffer.
74 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); 130 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
75 131
76 // Read object back from the snapshot. 132 // Read object back from the snapshot.
77 SnapshotReader reader(snapshot, Isolate::Current()); 133 SnapshotReader reader(snapshot, Isolate::Current());
78 const Object& serialized_object = Object::Handle(reader.ReadObject()); 134 const Object& serialized_object = Object::Handle(reader.ReadObject());
79 EXPECT(Equals(null_object, serialized_object)); 135 EXPECT(Equals(null_object, serialized_object));
80 136
81 // Read object back from the snapshot into a C structure. 137 // Read object back from the snapshot into a C structure.
82 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, 138 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
83 writer.BytesWritten(), 139 writer.BytesWritten(),
84 &zone_allocator); 140 &zone_allocator);
85 Dart_CObject* cobject = cmessage->root; 141 Dart_CObject* cobject = cmessage->root;
86 EXPECT_NOTNULL(cobject); 142 EXPECT_NOTNULL(cobject);
87 EXPECT_EQ(Dart_CObject::kNull, cobject->type); 143 EXPECT_EQ(Dart_CObject::kNull, cobject->type);
144 CheckEncodeDecodeMessage(cmessage);
88 } 145 }
89 146
90 147
91 TEST_CASE(SerializeSmi1) { 148 TEST_CASE(SerializeSmi1) {
92 Zone zone(Isolate::Current()); 149 Zone zone(Isolate::Current());
93 150
94 // Write snapshot with object content. 151 // Write snapshot with object content.
95 uint8_t* buffer; 152 uint8_t* buffer;
96 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 153 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
97 const Smi& smi = Smi::Handle(Smi::New(124)); 154 const Smi& smi = Smi::Handle(Smi::New(124));
98 writer.WriteObject(smi.raw()); 155 writer.WriteObject(smi.raw());
99 writer.FinalizeBuffer(); 156 writer.FinalizeBuffer();
100 157
101 // Create a snapshot object using the buffer. 158 // Create a snapshot object using the buffer.
102 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); 159 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
103 160
104 // Read object back from the snapshot. 161 // Read object back from the snapshot.
105 SnapshotReader reader(snapshot, Isolate::Current()); 162 SnapshotReader reader(snapshot, Isolate::Current());
106 const Object& serialized_object = Object::Handle(reader.ReadObject()); 163 const Object& serialized_object = Object::Handle(reader.ReadObject());
107 EXPECT(Equals(smi, serialized_object)); 164 EXPECT(Equals(smi, serialized_object));
108 165
109 // Read object back from the snapshot into a C structure. 166 // Read object back from the snapshot into a C structure.
110 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, 167 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
111 writer.BytesWritten(), 168 writer.BytesWritten(),
112 &zone_allocator); 169 &zone_allocator);
113 Dart_CObject* cobject = cmessage->root; 170 Dart_CObject* cobject = cmessage->root;
114 EXPECT_NOTNULL(cobject); 171 EXPECT_NOTNULL(cobject);
115 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); 172 EXPECT_EQ(Dart_CObject::kInt32, cobject->type);
116 EXPECT_EQ(smi.Value(), cobject->value.as_int32); 173 EXPECT_EQ(smi.Value(), cobject->value.as_int32);
174 CheckEncodeDecodeMessage(cmessage);
117 } 175 }
118 176
119 177
120 TEST_CASE(SerializeSmi2) { 178 TEST_CASE(SerializeSmi2) {
121 Zone zone(Isolate::Current()); 179 Zone zone(Isolate::Current());
122 180
123 // Write snapshot with object content. 181 // Write snapshot with object content.
124 uint8_t* buffer; 182 uint8_t* buffer;
125 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 183 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
126 const Smi& smi = Smi::Handle(Smi::New(-1)); 184 const Smi& smi = Smi::Handle(Smi::New(-1));
127 writer.WriteObject(smi.raw()); 185 writer.WriteObject(smi.raw());
128 writer.FinalizeBuffer(); 186 writer.FinalizeBuffer();
129 187
130 // Create a snapshot object using the buffer. 188 // Create a snapshot object using the buffer.
131 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); 189 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
132 190
133 // Read object back from the snapshot. 191 // Read object back from the snapshot.
134 SnapshotReader reader(snapshot, Isolate::Current()); 192 SnapshotReader reader(snapshot, Isolate::Current());
135 const Object& serialized_object = Object::Handle(reader.ReadObject()); 193 const Object& serialized_object = Object::Handle(reader.ReadObject());
136 EXPECT(Equals(smi, serialized_object)); 194 EXPECT(Equals(smi, serialized_object));
137 195
138 // Read object back from the snapshot into a C structure. 196 // Read object back from the snapshot into a C structure.
139 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, 197 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
140 writer.BytesWritten(), 198 writer.BytesWritten(),
141 &zone_allocator); 199 &zone_allocator);
142 Dart_CObject* cobject = cmessage->root; 200 Dart_CObject* cobject = cmessage->root;
143 EXPECT_NOTNULL(cobject); 201 EXPECT_NOTNULL(cobject);
144 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); 202 EXPECT_EQ(Dart_CObject::kInt32, cobject->type);
145 EXPECT_EQ(smi.Value(), cobject->value.as_int32); 203 EXPECT_EQ(smi.Value(), cobject->value.as_int32);
204 CheckEncodeDecodeMessage(cmessage);
146 } 205 }
147 206
148 207
149 TEST_CASE(SerializeDouble) { 208 TEST_CASE(SerializeDouble) {
150 Zone zone(Isolate::Current()); 209 Zone zone(Isolate::Current());
151 210
152 // Write snapshot with object content. 211 // Write snapshot with object content.
153 uint8_t* buffer; 212 uint8_t* buffer;
154 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 213 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
155 const Double& dbl = Double::Handle(Double::New(101.29)); 214 const Double& dbl = Double::Handle(Double::New(101.29));
156 writer.WriteObject(dbl.raw()); 215 writer.WriteObject(dbl.raw());
157 writer.FinalizeBuffer(); 216 writer.FinalizeBuffer();
158 217
159 // Create a snapshot object using the buffer. 218 // Create a snapshot object using the buffer.
160 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); 219 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
161 220
162 // Read object back from the snapshot. 221 // Read object back from the snapshot.
163 SnapshotReader reader(snapshot, Isolate::Current()); 222 SnapshotReader reader(snapshot, Isolate::Current());
164 const Object& serialized_object = Object::Handle(reader.ReadObject()); 223 const Object& serialized_object = Object::Handle(reader.ReadObject());
165 EXPECT(Equals(dbl, serialized_object)); 224 EXPECT(Equals(dbl, serialized_object));
166 225
167 // Read object back from the snapshot into a C structure. 226 // Read object back from the snapshot into a C structure.
168 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, 227 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
169 writer.BytesWritten(), 228 writer.BytesWritten(),
170 &zone_allocator); 229 &zone_allocator);
171 Dart_CObject* cobject = cmessage->root; 230 Dart_CObject* cobject = cmessage->root;
172 EXPECT_NOTNULL(cobject); 231 EXPECT_NOTNULL(cobject);
173 EXPECT_EQ(Dart_CObject::kDouble, cobject->type); 232 EXPECT_EQ(Dart_CObject::kDouble, cobject->type);
174 EXPECT_EQ(dbl.value(), cobject->value.as_double); 233 EXPECT_EQ(dbl.value(), cobject->value.as_double);
234 CheckEncodeDecodeMessage(cmessage);
175 } 235 }
176 236
177 237
178 TEST_CASE(SerializeBool) { 238 TEST_CASE(SerializeBool) {
179 Zone zone(Isolate::Current()); 239 Zone zone(Isolate::Current());
180 240
181 // Write snapshot with object content. 241 // Write snapshot with object content.
182 uint8_t* buffer; 242 uint8_t* buffer;
183 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 243 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
184 const Bool& bool1 = Bool::Handle(Bool::True()); 244 const Bool& bool1 = Bool::Handle(Bool::True());
(...skipping 26 matching lines...) Expand all
211 Snapshot::SetupFromBuffer(buffer); 271 Snapshot::SetupFromBuffer(buffer);
212 272
213 // Read object back from the snapshot into a C structure. 273 // Read object back from the snapshot into a C structure.
214 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, 274 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
215 writer.BytesWritten(), 275 writer.BytesWritten(),
216 &zone_allocator); 276 &zone_allocator);
217 Dart_CObject* cobject = cmessage->root; 277 Dart_CObject* cobject = cmessage->root;
218 EXPECT_NOTNULL(cobject); 278 EXPECT_NOTNULL(cobject);
219 EXPECT_EQ(Dart_CObject::kBool, cobject->type); 279 EXPECT_EQ(Dart_CObject::kBool, cobject->type);
220 EXPECT_EQ(true, cobject->value.as_bool); 280 EXPECT_EQ(true, cobject->value.as_bool);
281 CheckEncodeDecodeMessage(cmessage);
221 } 282 }
222 283
223 284
224 TEST_CASE(SerializeFalse) { 285 TEST_CASE(SerializeFalse) {
225 Zone zone(Isolate::Current()); 286 Zone zone(Isolate::Current());
226 287
227 // Write snapshot with false object. 288 // Write snapshot with false object.
228 uint8_t* buffer; 289 uint8_t* buffer;
229 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 290 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
230 const Bool& bl = Bool::Handle(Bool::False()); 291 const Bool& bl = Bool::Handle(Bool::False());
231 writer.WriteObject(bl.raw()); 292 writer.WriteObject(bl.raw());
232 writer.FinalizeBuffer(); 293 writer.FinalizeBuffer();
233 294
234 // Create a snapshot object using the buffer. 295 // Create a snapshot object using the buffer.
235 Snapshot::SetupFromBuffer(buffer); 296 Snapshot::SetupFromBuffer(buffer);
236 297
237 // Read object back from the snapshot into a C structure. 298 // Read object back from the snapshot into a C structure.
238 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, 299 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
239 writer.BytesWritten(), 300 writer.BytesWritten(),
240 &zone_allocator); 301 &zone_allocator);
241 Dart_CObject* cobject = cmessage->root; 302 Dart_CObject* cobject = cmessage->root;
242 EXPECT_NOTNULL(cobject); 303 EXPECT_NOTNULL(cobject);
243 EXPECT_EQ(Dart_CObject::kBool, cobject->type); 304 EXPECT_EQ(Dart_CObject::kBool, cobject->type);
244 EXPECT_EQ(false, cobject->value.as_bool); 305 EXPECT_EQ(false, cobject->value.as_bool);
306 CheckEncodeDecodeMessage(cmessage);
245 } 307 }
246 308
247 309
248 TEST_CASE(SerializeBigint) { 310 TEST_CASE(SerializeBigint) {
249 Zone zone(Isolate::Current()); 311 Zone zone(Isolate::Current());
250 312
251 // Write snapshot with object content. 313 // Write snapshot with object content.
252 uint8_t* buffer; 314 uint8_t* buffer;
253 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 315 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
254 const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL)); 316 const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL));
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 serialized_str ^= reader.ReadObject(); 411 serialized_str ^= reader.ReadObject();
350 EXPECT(str.Equals(serialized_str)); 412 EXPECT(str.Equals(serialized_str));
351 413
352 // Read object back from the snapshot into a C structure. 414 // Read object back from the snapshot into a C structure.
353 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, 415 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
354 writer.BytesWritten(), 416 writer.BytesWritten(),
355 &zone_allocator); 417 &zone_allocator);
356 Dart_CObject* cobject = cmessage->root; 418 Dart_CObject* cobject = cmessage->root;
357 EXPECT_EQ(Dart_CObject::kString, cobject->type); 419 EXPECT_EQ(Dart_CObject::kString, cobject->type);
358 EXPECT_STREQ(cstr, cobject->value.as_string); 420 EXPECT_STREQ(cstr, cobject->value.as_string);
421 CheckEncodeDecodeMessage(cmessage);
359 } 422 }
360 423
361 424
362 TEST_CASE(SerializeArray) { 425 TEST_CASE(SerializeArray) {
363 Zone zone(Isolate::Current()); 426 Zone zone(Isolate::Current());
364 427
365 // Write snapshot with object content. 428 // Write snapshot with object content.
366 uint8_t* buffer; 429 uint8_t* buffer;
367 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 430 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
368 const int kArrayLength = 10; 431 const int kArrayLength = 10;
(...skipping 20 matching lines...) Expand all
389 writer.BytesWritten(), 452 writer.BytesWritten(),
390 &zone_allocator); 453 &zone_allocator);
391 Dart_CObject* cobject = cmessage->root; 454 Dart_CObject* cobject = cmessage->root;
392 EXPECT_EQ(Dart_CObject::kArray, cobject->type); 455 EXPECT_EQ(Dart_CObject::kArray, cobject->type);
393 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); 456 EXPECT_EQ(kArrayLength, cobject->value.as_array.length);
394 for (int i = 0; i < kArrayLength; i++) { 457 for (int i = 0; i < kArrayLength; i++) {
395 Dart_CObject* element = cobject->value.as_array.values[i]; 458 Dart_CObject* element = cobject->value.as_array.values[i];
396 EXPECT_EQ(Dart_CObject::kInt32, element->type); 459 EXPECT_EQ(Dart_CObject::kInt32, element->type);
397 EXPECT_EQ(i, element->value.as_int32); 460 EXPECT_EQ(i, element->value.as_int32);
398 } 461 }
462 CheckEncodeDecodeMessage(cmessage);
399 } 463 }
400 464
401 465
402 TEST_CASE(SerializeEmptyArray) { 466 TEST_CASE(SerializeEmptyArray) {
403 Zone zone(Isolate::Current()); 467 Zone zone(Isolate::Current());
404 468
405 // Write snapshot with object content. 469 // Write snapshot with object content.
406 uint8_t* buffer; 470 uint8_t* buffer;
407 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 471 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
408 const int kArrayLength = 0; 472 const int kArrayLength = 0;
(...skipping 11 matching lines...) Expand all
420 EXPECT(array.Equals(serialized_array)); 484 EXPECT(array.Equals(serialized_array));
421 485
422 // Read object back from the snapshot into a C structure. 486 // Read object back from the snapshot into a C structure.
423 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, 487 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
424 writer.BytesWritten(), 488 writer.BytesWritten(),
425 &zone_allocator); 489 &zone_allocator);
426 Dart_CObject* cobject = cmessage->root; 490 Dart_CObject* cobject = cmessage->root;
427 EXPECT_EQ(Dart_CObject::kArray, cobject->type); 491 EXPECT_EQ(Dart_CObject::kArray, cobject->type);
428 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); 492 EXPECT_EQ(kArrayLength, cobject->value.as_array.length);
429 EXPECT(cobject->value.as_array.values == NULL); 493 EXPECT(cobject->value.as_array.values == NULL);
494 CheckEncodeDecodeMessage(cmessage);
430 } 495 }
431 496
432 497
433 TEST_CASE(SerializeScript) { 498 TEST_CASE(SerializeScript) {
434 const char* kScriptChars = 499 const char* kScriptChars =
435 "class A {\n" 500 "class A {\n"
436 " static bar() { return 42; }\n" 501 " static bar() { return 42; }\n"
437 " static fly() { return 5; }\n" 502 " static fly() { return 5; }\n"
438 "}\n"; 503 "}\n";
439 504
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
752 writer.BytesWritten(), 817 writer.BytesWritten(),
753 &zone_allocator); 818 &zone_allocator);
754 Dart_CObject* cobject = cmessage->root; 819 Dart_CObject* cobject = cmessage->root;
755 EXPECT_EQ(Dart_CObject::kArray, cobject->type); 820 EXPECT_EQ(Dart_CObject::kArray, cobject->type);
756 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); 821 EXPECT_EQ(kArrayLength, cobject->value.as_array.length);
757 for (int i = 0; i < kArrayLength; i++) { 822 for (int i = 0; i < kArrayLength; i++) {
758 Dart_CObject* element = cobject->value.as_array.values[i]; 823 Dart_CObject* element = cobject->value.as_array.values[i];
759 EXPECT_EQ(Dart_CObject::kInt32, element->type); 824 EXPECT_EQ(Dart_CObject::kInt32, element->type);
760 EXPECT_EQ(i + 1, element->value.as_int32); 825 EXPECT_EQ(i + 1, element->value.as_int32);
761 } 826 }
827 CheckEncodeDecodeMessage(cmessage);
762 } 828 }
763 829
764 830
765 // Helper function to call a top level Dart function, serialize the 831 // Helper function to call a top level Dart function, serialize the
766 // result and deserialize the result into a Dart_CObject structure. 832 // result and deserialize the result into a Dart_CObject structure.
767 static Dart_CMessage* GetDeserializedDartMessage(Dart_Handle lib, 833 static Dart_CMessage* GetDeserializedDartMessage(Dart_Handle lib,
768 const char* dart_function) { 834 const char* dart_function) {
769 Dart_Handle result; 835 Dart_Handle result;
770 result = Dart_InvokeStatic(lib, 836 result = Dart_InvokeStatic(lib,
771 Dart_NewString(""), 837 Dart_NewString(""),
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
838 writer.FinalizeBuffer(); 904 writer.FinalizeBuffer();
839 905
840 // Read object back from the snapshot into a C structure. 906 // Read object back from the snapshot into a C structure.
841 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, 907 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
842 writer.BytesWritten(), 908 writer.BytesWritten(),
843 &zone_allocator); 909 &zone_allocator);
844 Dart_CObject* cobject = cmessage->root; 910 Dart_CObject* cobject = cmessage->root;
845 EXPECT_NOTNULL(cobject); 911 EXPECT_NOTNULL(cobject);
846 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); 912 EXPECT_EQ(Dart_CObject::kInt32, cobject->type);
847 EXPECT_EQ(42, cobject->value.as_int32); 913 EXPECT_EQ(42, cobject->value.as_int32);
914 CheckEncodeDecodeMessage(cmessage);
848 } 915 }
849 { 916 {
850 Zone zone(Isolate::Current()); 917 Zone zone(Isolate::Current());
851 uint8_t* buffer; 918 uint8_t* buffer;
852 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 919 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
853 String& str = String::Handle(); 920 String& str = String::Handle();
854 str ^= Api::UnwrapHandle(string_result); 921 str ^= Api::UnwrapHandle(string_result);
855 writer.WriteObject(str.raw()); 922 writer.WriteObject(str.raw());
856 writer.FinalizeBuffer(); 923 writer.FinalizeBuffer();
857 924
858 // Read object back from the snapshot into a C structure. 925 // Read object back from the snapshot into a C structure.
859 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, 926 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
860 writer.BytesWritten(), 927 writer.BytesWritten(),
861 &zone_allocator); 928 &zone_allocator);
862 Dart_CObject* cobject = cmessage->root; 929 Dart_CObject* cobject = cmessage->root;
863 EXPECT_NOTNULL(cobject); 930 EXPECT_NOTNULL(cobject);
864 EXPECT_EQ(Dart_CObject::kString, cobject->type); 931 EXPECT_EQ(Dart_CObject::kString, cobject->type);
865 EXPECT_STREQ("Hello, world!", cobject->value.as_string); 932 EXPECT_STREQ("Hello, world!", cobject->value.as_string);
933 CheckEncodeDecodeMessage(cmessage);
866 } 934 }
867 } 935 }
868 Dart_ExitScope(); 936 Dart_ExitScope();
869 Dart_ShutdownIsolate(); 937 Dart_ShutdownIsolate();
870 } 938 }
871 939
872 940
873 UNIT_TEST_CASE(DartGeneratedListMessages) { 941 UNIT_TEST_CASE(DartGeneratedListMessages) {
874 const int kArrayLength = 10; 942 const int kArrayLength = 10;
875 static const char* kScriptChars = 943 static const char* kScriptChars =
(...skipping 23 matching lines...) Expand all
899 TestCase::CreateTestIsolate(); 967 TestCase::CreateTestIsolate();
900 Isolate* isolate = Isolate::Current(); 968 Isolate* isolate = Isolate::Current();
901 EXPECT(isolate != NULL); 969 EXPECT(isolate != NULL);
902 Dart_EnterScope(); 970 Dart_EnterScope();
903 971
904 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 972 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
905 EXPECT_VALID(lib); 973 EXPECT_VALID(lib);
906 974
907 { 975 {
908 DARTSCOPE_NOCHECKS(isolate); 976 DARTSCOPE_NOCHECKS(isolate);
909
910 { 977 {
911 // Generate a list of nulls from Dart code. 978 // Generate a list of nulls from Dart code.
912 Zone zone(Isolate::Current()); 979 Zone zone(Isolate::Current());
913 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getList"); 980 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getList");
914 Dart_CObject* value = cmessage->root; 981 Dart_CObject* value = cmessage->root;
915 EXPECT_NOTNULL(value); 982 EXPECT_NOTNULL(value);
916 EXPECT_EQ(Dart_CObject::kArray, value->type); 983 EXPECT_EQ(Dart_CObject::kArray, value->type);
917 EXPECT_EQ(kArrayLength, value->value.as_array.length); 984 EXPECT_EQ(kArrayLength, value->value.as_array.length);
918 for (int i = 0; i < kArrayLength; i++) { 985 for (int i = 0; i < kArrayLength; i++) {
919 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); 986 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type);
920 } 987 }
988 CheckEncodeDecodeMessage(cmessage);
921 } 989 }
922 { 990 {
923 // Generate a list of ints from Dart code. 991 // Generate a list of ints from Dart code.
924 Zone zone(Isolate::Current()); 992 Zone zone(Isolate::Current());
925 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getIntList"); 993 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getIntList");
926 Dart_CObject* value = cmessage->root; 994 Dart_CObject* value = cmessage->root;
927 EXPECT_NOTNULL(value); 995 EXPECT_NOTNULL(value);
928 EXPECT_EQ(Dart_CObject::kArray, value->type); 996 EXPECT_EQ(Dart_CObject::kArray, value->type);
929 EXPECT_EQ(kArrayLength, value->value.as_array.length); 997 EXPECT_EQ(kArrayLength, value->value.as_array.length);
930 for (int i = 0; i < kArrayLength; i++) { 998 for (int i = 0; i < kArrayLength; i++) {
931 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type); 999 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type);
932 EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32); 1000 EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32);
933 } 1001 }
1002 CheckEncodeDecodeMessage(cmessage);
934 } 1003 }
935 { 1004 {
936 // Generate a list of strings from Dart code. 1005 // Generate a list of strings from Dart code.
937 Zone zone(Isolate::Current()); 1006 Zone zone(Isolate::Current());
938 Dart_CMessage* cmessage = 1007 Dart_CMessage* cmessage =
939 GetDeserializedDartMessage(lib, "getStringList"); 1008 GetDeserializedDartMessage(lib, "getStringList");
940 Dart_CObject* value = cmessage->root; 1009 Dart_CObject* value = cmessage->root;
941 EXPECT_NOTNULL(value); 1010 EXPECT_NOTNULL(value);
942 EXPECT_EQ(Dart_CObject::kArray, value->type); 1011 EXPECT_EQ(Dart_CObject::kArray, value->type);
943 EXPECT_EQ(kArrayLength, value->value.as_array.length); 1012 EXPECT_EQ(kArrayLength, value->value.as_array.length);
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
1086 Dart_CObject* element = object->value.as_array.values[i]; 1155 Dart_CObject* element = object->value.as_array.values[i];
1087 EXPECT_EQ(Dart_CObject::kArray, element->type); 1156 EXPECT_EQ(Dart_CObject::kArray, element->type);
1088 EXPECT_EQ(object, element); 1157 EXPECT_EQ(object, element);
1089 } 1158 }
1090 } 1159 }
1091 } 1160 }
1092 Dart_ExitScope(); 1161 Dart_ExitScope();
1093 Dart_ShutdownIsolate(); 1162 Dart_ShutdownIsolate();
1094 } 1163 }
1095 1164
1165
1166 UNIT_TEST_CASE(PostCMessage) {
1167 // Create a native port for posting from C to Dart
1168 TestIsolateScope __test_isolate__;
1169 const char* kScriptChars =
1170 "void main() {\n"
1171 " var messageCount = 0;\n"
1172 " var exception = '';\n"
1173 " var port = new ReceivePort();\n"
1174 " port.receive((message, replyTo) {\n"
1175 " exception += message.toString();\n"
1176 " messageCount++;\n"
1177 " if (messageCount == 7) throw new Exception(exception);\n"
1178 " });\n"
1179 " return port.toSendPort();\n"
1180 "}\n";
1181 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
1182 Dart_EnterScope();
1183
1184 // xxx
1185 Dart_Handle send_port = Dart_InvokeStatic(lib,
1186 Dart_NewString(""),
1187 Dart_NewString("main"),
1188 0,
1189 NULL);
1190 EXPECT_VALID(send_port);
1191 Dart_Handle result =
1192 Dart_GetInstanceField(send_port, Dart_NewString("_id"));
1193 ASSERT(!Dart_IsError(result));
1194 ASSERT(Dart_IsInteger(result));
1195 int64_t send_port_id;
1196 Dart_Handle result2 = Dart_IntegerToInt64(result, &send_port_id);
1197 ASSERT(!Dart_IsError(result2));
1198
1199 // Setup single object message.
1200 Dart_CObject object;
1201 Dart_CMessage message;
1202 message.root = &object;
1203
1204 object.type = Dart_CObject::kNull;
1205 EXPECT(Dart_PostCMessage(send_port_id, &message));
1206
1207 object.type = Dart_CObject::kBool;
1208 object.value.as_bool = true;
1209 EXPECT(Dart_PostCMessage(send_port_id, &message));
1210
1211 object.type = Dart_CObject::kBool;
1212 object.value.as_bool = false;
1213 EXPECT(Dart_PostCMessage(send_port_id, &message));
1214
1215 object.type = Dart_CObject::kInt32;
1216 object.value.as_int32 = 123;
1217 EXPECT(Dart_PostCMessage(send_port_id, &message));
1218
1219 object.type = Dart_CObject::kString;
1220 object.value.as_string = const_cast<char*>("456");
1221 EXPECT(Dart_PostCMessage(send_port_id, &message));
1222
1223 object.type = Dart_CObject::kDouble;
1224 object.value.as_double = 3.14;
1225 EXPECT(Dart_PostCMessage(send_port_id, &message));
1226
1227 object.type = Dart_CObject::kArray;
1228 object.value.as_array.length = 0;
1229 EXPECT(Dart_PostCMessage(send_port_id, &message));
1230
1231 result = Dart_RunLoop();
1232 EXPECT(Dart_IsError(result));
1233 EXPECT(Dart_ErrorHasException(result));
1234 EXPECT_SUBSTRING("Exception: nulltruefalse1234563.14[]\n",
1235 Dart_GetError(result));
1236
1237 Dart_ExitScope();
1238 }
1239
1096 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). 1240 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64).
1097 1241
1098 } // namespace dart 1242 } // namespace dart
OLDNEW
« runtime/bin/socket_impl.dart ('K') | « runtime/vm/snapshot.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698