OLD | NEW |
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 "platform/assert.h" | 5 #include "platform/assert.h" |
6 #include "vm/bigint_operations.h" | 6 #include "vm/bigint_operations.h" |
7 #include "vm/class_finalizer.h" | 7 #include "vm/class_finalizer.h" |
8 #include "vm/dart_api_impl.h" | 8 #include "vm/dart_api_impl.h" |
9 #include "vm/dart_api_state.h" | 9 #include "vm/dart_api_state.h" |
10 #include "vm/snapshot.h" | 10 #include "vm/snapshot.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 | 44 |
45 static void FreeDeserializedDartMessage(Dart_CMessage* cmessage) { | 45 static void FreeDeserializedDartMessage(Dart_CMessage* cmessage) { |
46 for (int i = 0; i < cmessage->allocated_length; i++) { | 46 for (int i = 0; i < cmessage->allocated_length; i++) { |
47 free(cmessage->allocated[i]); | 47 free(cmessage->allocated[i]); |
48 } | 48 } |
49 free(cmessage->original_message - Snapshot::kHeaderSize); | 49 free(cmessage->original_message - Snapshot::kHeaderSize); |
50 free(cmessage); | 50 free(cmessage); |
51 } | 51 } |
52 | 52 |
53 | 53 |
| 54 static void CompareDartCObjects(Dart_CObject* first, Dart_CObject* second) { |
| 55 EXPECT_NE(first, second); |
| 56 EXPECT_EQ(first->type, second->type); |
| 57 switch (first->type) { |
| 58 case Dart_CObject::kNull: |
| 59 // Nothing more to compare. |
| 60 break; |
| 61 case Dart_CObject::kBool: |
| 62 EXPECT_EQ(first->value.as_bool, second->value.as_bool); |
| 63 break; |
| 64 case Dart_CObject::kInt32: |
| 65 EXPECT_EQ(first->value.as_int32, second->value.as_int32); |
| 66 break; |
| 67 case Dart_CObject::kDouble: |
| 68 EXPECT_EQ(first->value.as_double, second->value.as_double); |
| 69 break; |
| 70 case Dart_CObject::kString: |
| 71 EXPECT_STREQ(first->value.as_string, second->value.as_string); |
| 72 break; |
| 73 case Dart_CObject::kArray: |
| 74 EXPECT_EQ(first->value.as_array.length, second->value.as_array.length); |
| 75 for (int i = 0; i < first->value.as_array.length; i++) { |
| 76 CompareDartCObjects(first->value.as_array.values[i], |
| 77 second->value.as_array.values[i]); |
| 78 } |
| 79 break; |
| 80 default: |
| 81 EXPECT(false); |
| 82 } |
| 83 } |
| 84 |
| 85 |
| 86 static void CheckEncodeMessage(Dart_CMessage* cmessage) { |
| 87 // Encode and decode the message. |
| 88 uint8_t* again = Dart_EncodeMessage(cmessage, allocator); |
| 89 // TODO(sgjesse): Get the length of the encoded message instead of |
| 90 // 1000. The length is not currently used for decoding, so a large |
| 91 // value works for testing. |
| 92 Dart_CMessage* new_cmessage = |
| 93 Dart_DecodeMessage(again + Snapshot::kHeaderSize, 1000, &allocator); |
| 94 |
| 95 // Check that the two messages are the same. |
| 96 CompareDartCObjects(cmessage->object, new_cmessage->object); |
| 97 FreeDeserializedDartMessage(new_cmessage); |
| 98 } |
| 99 |
54 TEST_CASE(SerializeNull) { | 100 TEST_CASE(SerializeNull) { |
55 // Write snapshot with object content. | 101 // Write snapshot with object content. |
56 uint8_t* buffer; | 102 uint8_t* buffer; |
57 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 103 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
58 const Object& null_object = Object::Handle(); | 104 const Object& null_object = Object::Handle(); |
59 writer.WriteObject(null_object.raw()); | 105 writer.WriteObject(null_object.raw()); |
60 writer.FinalizeBuffer(); | 106 writer.FinalizeBuffer(); |
61 | 107 |
62 // Create a snapshot object using the buffer. | 108 // Create a snapshot object using the buffer. |
63 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 109 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
64 | 110 |
65 // Read object back from the snapshot. | 111 // Read object back from the snapshot. |
66 SnapshotReader reader(snapshot, Isolate::Current()); | 112 SnapshotReader reader(snapshot, Isolate::Current()); |
67 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 113 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
68 EXPECT(Equals(null_object, serialized_object)); | 114 EXPECT(Equals(null_object, serialized_object)); |
69 | 115 |
70 // Read object back from the snapshot into a C structure. | 116 // Read object back from the snapshot into a C structure. |
71 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | 117 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
72 writer.BytesWritten(), | 118 writer.BytesWritten(), |
73 &allocator); | 119 &allocator); |
74 Dart_CObject* cobject = cmessage->object; | 120 Dart_CObject* cobject = cmessage->object; |
75 EXPECT_NOTNULL(cobject); | 121 EXPECT_NOTNULL(cobject); |
76 EXPECT_EQ(Dart_CObject::kNull, cobject->type); | 122 EXPECT_EQ(Dart_CObject::kNull, cobject->type); |
| 123 CheckEncodeMessage(cmessage); |
77 FreeDeserializedDartMessage(cmessage); | 124 FreeDeserializedDartMessage(cmessage); |
78 } | 125 } |
79 | 126 |
80 | 127 |
81 TEST_CASE(SerializeSmi1) { | 128 TEST_CASE(SerializeSmi1) { |
82 // Write snapshot with object content. | 129 // Write snapshot with object content. |
83 uint8_t* buffer; | 130 uint8_t* buffer; |
84 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 131 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
85 const Smi& smi = Smi::Handle(Smi::New(124)); | 132 const Smi& smi = Smi::Handle(Smi::New(124)); |
86 writer.WriteObject(smi.raw()); | 133 writer.WriteObject(smi.raw()); |
87 writer.FinalizeBuffer(); | 134 writer.FinalizeBuffer(); |
88 | 135 |
89 // Create a snapshot object using the buffer. | 136 // Create a snapshot object using the buffer. |
90 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 137 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
91 | 138 |
92 // Read object back from the snapshot. | 139 // Read object back from the snapshot. |
93 SnapshotReader reader(snapshot, Isolate::Current()); | 140 SnapshotReader reader(snapshot, Isolate::Current()); |
94 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 141 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
95 EXPECT(Equals(smi, serialized_object)); | 142 EXPECT(Equals(smi, serialized_object)); |
96 | 143 |
97 // Read object back from the snapshot into a C structure. | 144 // Read object back from the snapshot into a C structure. |
98 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | 145 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
99 writer.BytesWritten(), | 146 writer.BytesWritten(), |
100 &allocator); | 147 &allocator); |
101 Dart_CObject* cobject = cmessage->object; | 148 Dart_CObject* cobject = cmessage->object; |
102 EXPECT_NOTNULL(cobject); | 149 EXPECT_NOTNULL(cobject); |
103 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); | 150 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
104 EXPECT_EQ(smi.Value(), cobject->value.as_int32); | 151 EXPECT_EQ(smi.Value(), cobject->value.as_int32); |
| 152 CheckEncodeMessage(cmessage); |
105 FreeDeserializedDartMessage(cmessage); | 153 FreeDeserializedDartMessage(cmessage); |
106 } | 154 } |
107 | 155 |
108 | 156 |
109 TEST_CASE(SerializeSmi2) { | 157 TEST_CASE(SerializeSmi2) { |
110 // Write snapshot with object content. | 158 // Write snapshot with object content. |
111 uint8_t* buffer; | 159 uint8_t* buffer; |
112 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 160 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
113 const Smi& smi = Smi::Handle(Smi::New(-1)); | 161 const Smi& smi = Smi::Handle(Smi::New(-1)); |
114 writer.WriteObject(smi.raw()); | 162 writer.WriteObject(smi.raw()); |
115 writer.FinalizeBuffer(); | 163 writer.FinalizeBuffer(); |
116 | 164 |
117 // Create a snapshot object using the buffer. | 165 // Create a snapshot object using the buffer. |
118 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 166 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
119 | 167 |
120 // Read object back from the snapshot. | 168 // Read object back from the snapshot. |
121 SnapshotReader reader(snapshot, Isolate::Current()); | 169 SnapshotReader reader(snapshot, Isolate::Current()); |
122 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 170 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
123 EXPECT(Equals(smi, serialized_object)); | 171 EXPECT(Equals(smi, serialized_object)); |
124 | 172 |
125 // Read object back from the snapshot into a C structure. | 173 // Read object back from the snapshot into a C structure. |
126 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | 174 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
127 writer.BytesWritten(), | 175 writer.BytesWritten(), |
128 &allocator); | 176 &allocator); |
129 Dart_CObject* cobject = cmessage->object; | 177 Dart_CObject* cobject = cmessage->object; |
130 EXPECT_NOTNULL(cobject); | 178 EXPECT_NOTNULL(cobject); |
131 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); | 179 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
132 EXPECT_EQ(smi.Value(), cobject->value.as_int32); | 180 EXPECT_EQ(smi.Value(), cobject->value.as_int32); |
| 181 CheckEncodeMessage(cmessage); |
133 FreeDeserializedDartMessage(cmessage); | 182 FreeDeserializedDartMessage(cmessage); |
134 } | 183 } |
135 | 184 |
136 | 185 |
137 TEST_CASE(SerializeDouble) { | 186 TEST_CASE(SerializeDouble) { |
138 // Write snapshot with object content. | 187 // Write snapshot with object content. |
139 uint8_t* buffer; | 188 uint8_t* buffer; |
140 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 189 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
141 const Double& dbl = Double::Handle(Double::New(101.29)); | 190 const Double& dbl = Double::Handle(Double::New(101.29)); |
142 writer.WriteObject(dbl.raw()); | 191 writer.WriteObject(dbl.raw()); |
143 writer.FinalizeBuffer(); | 192 writer.FinalizeBuffer(); |
144 | 193 |
145 // Create a snapshot object using the buffer. | 194 // Create a snapshot object using the buffer. |
146 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 195 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
147 | 196 |
148 // Read object back from the snapshot. | 197 // Read object back from the snapshot. |
149 SnapshotReader reader(snapshot, Isolate::Current()); | 198 SnapshotReader reader(snapshot, Isolate::Current()); |
150 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 199 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
151 EXPECT(Equals(dbl, serialized_object)); | 200 EXPECT(Equals(dbl, serialized_object)); |
152 | 201 |
153 // Read object back from the snapshot into a C structure. | 202 // Read object back from the snapshot into a C structure. |
154 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | 203 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
155 writer.BytesWritten(), | 204 writer.BytesWritten(), |
156 &allocator); | 205 &allocator); |
157 Dart_CObject* cobject = cmessage->object; | 206 Dart_CObject* cobject = cmessage->object; |
158 EXPECT_NOTNULL(cobject); | 207 EXPECT_NOTNULL(cobject); |
159 EXPECT_EQ(Dart_CObject::kDouble, cobject->type); | 208 EXPECT_EQ(Dart_CObject::kDouble, cobject->type); |
160 EXPECT_EQ(dbl.value(), cobject->value.as_double); | 209 EXPECT_EQ(dbl.value(), cobject->value.as_double); |
| 210 CheckEncodeMessage(cmessage); |
161 FreeDeserializedDartMessage(cmessage); | 211 FreeDeserializedDartMessage(cmessage); |
162 } | 212 } |
163 | 213 |
164 | 214 |
165 TEST_CASE(SerializeBool) { | 215 TEST_CASE(SerializeBool) { |
166 // Write snapshot with object content. | 216 // Write snapshot with object content. |
167 uint8_t* buffer; | 217 uint8_t* buffer; |
168 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 218 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
169 const Bool& bool1 = Bool::Handle(Bool::True()); | 219 const Bool& bool1 = Bool::Handle(Bool::True()); |
170 const Bool& bool2 = Bool::Handle(Bool::False()); | 220 const Bool& bool2 = Bool::Handle(Bool::False()); |
(...skipping 24 matching lines...) Expand all Loading... |
195 USE(snapshot); | 245 USE(snapshot); |
196 | 246 |
197 // Read object back from the snapshot into a C structure. | 247 // Read object back from the snapshot into a C structure. |
198 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | 248 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
199 writer.BytesWritten(), | 249 writer.BytesWritten(), |
200 &allocator); | 250 &allocator); |
201 Dart_CObject* cobject = cmessage->object; | 251 Dart_CObject* cobject = cmessage->object; |
202 EXPECT_NOTNULL(cobject); | 252 EXPECT_NOTNULL(cobject); |
203 EXPECT_EQ(Dart_CObject::kBool, cobject->type); | 253 EXPECT_EQ(Dart_CObject::kBool, cobject->type); |
204 EXPECT_EQ(true, cobject->value.as_bool); | 254 EXPECT_EQ(true, cobject->value.as_bool); |
| 255 CheckEncodeMessage(cmessage); |
205 FreeDeserializedDartMessage(cmessage); | 256 FreeDeserializedDartMessage(cmessage); |
206 } | 257 } |
207 | 258 |
208 | 259 |
209 TEST_CASE(SerializeFalse) { | 260 TEST_CASE(SerializeFalse) { |
210 // Write snapshot with false object. | 261 // Write snapshot with false object. |
211 uint8_t* buffer; | 262 uint8_t* buffer; |
212 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 263 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
213 const Bool& bl = Bool::Handle(Bool::False()); | 264 const Bool& bl = Bool::Handle(Bool::False()); |
214 writer.WriteObject(bl.raw()); | 265 writer.WriteObject(bl.raw()); |
215 writer.FinalizeBuffer(); | 266 writer.FinalizeBuffer(); |
216 | 267 |
217 // Create a snapshot object using the buffer. | 268 // Create a snapshot object using the buffer. |
218 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 269 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
219 USE(snapshot); | 270 USE(snapshot); |
220 | 271 |
221 // Read object back from the snapshot into a C structure. | 272 // Read object back from the snapshot into a C structure. |
222 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | 273 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
223 writer.BytesWritten(), | 274 writer.BytesWritten(), |
224 &allocator); | 275 &allocator); |
225 Dart_CObject* cobject = cmessage->object; | 276 Dart_CObject* cobject = cmessage->object; |
226 EXPECT_NOTNULL(cobject); | 277 EXPECT_NOTNULL(cobject); |
227 EXPECT_EQ(Dart_CObject::kBool, cobject->type); | 278 EXPECT_EQ(Dart_CObject::kBool, cobject->type); |
228 EXPECT_EQ(false, cobject->value.as_bool); | 279 EXPECT_EQ(false, cobject->value.as_bool); |
| 280 CheckEncodeMessage(cmessage); |
229 FreeDeserializedDartMessage(cmessage); | 281 FreeDeserializedDartMessage(cmessage); |
230 } | 282 } |
231 | 283 |
232 | 284 |
233 TEST_CASE(SerializeBigint) { | 285 TEST_CASE(SerializeBigint) { |
234 // Write snapshot with object content. | 286 // Write snapshot with object content. |
235 uint8_t* buffer; | 287 uint8_t* buffer; |
236 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 288 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
237 const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL)); | 289 const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL)); |
238 writer.WriteObject(bigint.raw()); | 290 writer.WriteObject(bigint.raw()); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 serialized_str ^= reader.ReadObject(); | 381 serialized_str ^= reader.ReadObject(); |
330 EXPECT(str.Equals(serialized_str)); | 382 EXPECT(str.Equals(serialized_str)); |
331 | 383 |
332 // Read object back from the snapshot into a C structure. | 384 // Read object back from the snapshot into a C structure. |
333 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | 385 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
334 writer.BytesWritten(), | 386 writer.BytesWritten(), |
335 &allocator); | 387 &allocator); |
336 Dart_CObject* cobject = cmessage->object; | 388 Dart_CObject* cobject = cmessage->object; |
337 EXPECT_EQ(Dart_CObject::kString, cobject->type); | 389 EXPECT_EQ(Dart_CObject::kString, cobject->type); |
338 EXPECT_STREQ(cstr, cobject->value.as_string); | 390 EXPECT_STREQ(cstr, cobject->value.as_string); |
| 391 CheckEncodeMessage(cmessage); |
339 FreeDeserializedDartMessage(cmessage); | 392 FreeDeserializedDartMessage(cmessage); |
340 } | 393 } |
341 | 394 |
342 | 395 |
343 TEST_CASE(SerializeArray) { | 396 TEST_CASE(SerializeArray) { |
344 // Write snapshot with object content. | 397 // Write snapshot with object content. |
345 uint8_t* buffer; | 398 uint8_t* buffer; |
346 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 399 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
347 const int kArrayLength = 10; | 400 const int kArrayLength = 10; |
348 Array& array = Array::Handle(Array::New(kArrayLength)); | 401 Array& array = Array::Handle(Array::New(kArrayLength)); |
(...skipping 19 matching lines...) Expand all Loading... |
368 writer.BytesWritten(), | 421 writer.BytesWritten(), |
369 &allocator); | 422 &allocator); |
370 Dart_CObject* cobject = cmessage->object; | 423 Dart_CObject* cobject = cmessage->object; |
371 EXPECT_EQ(Dart_CObject::kArray, cobject->type); | 424 EXPECT_EQ(Dart_CObject::kArray, cobject->type); |
372 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); | 425 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); |
373 for (int i = 0; i < kArrayLength; i++) { | 426 for (int i = 0; i < kArrayLength; i++) { |
374 Dart_CObject* element = cobject->value.as_array.values[i]; | 427 Dart_CObject* element = cobject->value.as_array.values[i]; |
375 EXPECT_EQ(Dart_CObject::kInt32, element->type); | 428 EXPECT_EQ(Dart_CObject::kInt32, element->type); |
376 EXPECT_EQ(i, element->value.as_int32); | 429 EXPECT_EQ(i, element->value.as_int32); |
377 } | 430 } |
| 431 CheckEncodeMessage(cmessage); |
378 FreeDeserializedDartMessage(cmessage); | 432 FreeDeserializedDartMessage(cmessage); |
379 } | 433 } |
380 | 434 |
381 | 435 |
382 TEST_CASE(SerializeEmptyArray) { | 436 TEST_CASE(SerializeEmptyArray) { |
383 // Write snapshot with object content. | 437 // Write snapshot with object content. |
384 uint8_t* buffer; | 438 uint8_t* buffer; |
385 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 439 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
386 const int kArrayLength = 0; | 440 const int kArrayLength = 0; |
387 Array& array = Array::Handle(Array::New(kArrayLength)); | 441 Array& array = Array::Handle(Array::New(kArrayLength)); |
(...skipping 10 matching lines...) Expand all Loading... |
398 EXPECT(array.Equals(serialized_array)); | 452 EXPECT(array.Equals(serialized_array)); |
399 | 453 |
400 // Read object back from the snapshot into a C structure. | 454 // Read object back from the snapshot into a C structure. |
401 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | 455 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
402 writer.BytesWritten(), | 456 writer.BytesWritten(), |
403 &allocator); | 457 &allocator); |
404 Dart_CObject* cobject = cmessage->object; | 458 Dart_CObject* cobject = cmessage->object; |
405 EXPECT_EQ(Dart_CObject::kArray, cobject->type); | 459 EXPECT_EQ(Dart_CObject::kArray, cobject->type); |
406 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); | 460 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); |
407 EXPECT(cobject->value.as_array.values == NULL); | 461 EXPECT(cobject->value.as_array.values == NULL); |
| 462 CheckEncodeMessage(cmessage); |
408 FreeDeserializedDartMessage(cmessage); | 463 FreeDeserializedDartMessage(cmessage); |
409 } | 464 } |
410 | 465 |
411 | 466 |
412 TEST_CASE(SerializeScript) { | 467 TEST_CASE(SerializeScript) { |
413 const char* kScriptChars = | 468 const char* kScriptChars = |
414 "class A {\n" | 469 "class A {\n" |
415 " static bar() { return 42; }\n" | 470 " static bar() { return 42; }\n" |
416 " static fly() { return 5; }\n" | 471 " static fly() { return 5; }\n" |
417 "}\n"; | 472 "}\n"; |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 writer.BytesWritten(), | 755 writer.BytesWritten(), |
701 &allocator); | 756 &allocator); |
702 Dart_CObject* cobject = cmessage->object; | 757 Dart_CObject* cobject = cmessage->object; |
703 EXPECT_EQ(Dart_CObject::kArray, cobject->type); | 758 EXPECT_EQ(Dart_CObject::kArray, cobject->type); |
704 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); | 759 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); |
705 for (int i = 0; i < kArrayLength; i++) { | 760 for (int i = 0; i < kArrayLength; i++) { |
706 Dart_CObject* element = cobject->value.as_array.values[i]; | 761 Dart_CObject* element = cobject->value.as_array.values[i]; |
707 EXPECT_EQ(Dart_CObject::kInt32, element->type); | 762 EXPECT_EQ(Dart_CObject::kInt32, element->type); |
708 EXPECT_EQ(i + 1, element->value.as_int32); | 763 EXPECT_EQ(i + 1, element->value.as_int32); |
709 } | 764 } |
| 765 CheckEncodeMessage(cmessage); |
710 FreeDeserializedDartMessage(cmessage); | 766 FreeDeserializedDartMessage(cmessage); |
711 } | 767 } |
712 | 768 |
713 | 769 |
714 // Helper function to call a top level Dart function, serialize the | 770 // Helper function to call a top level Dart function, serialize the |
715 // result and deserialize the result into a Dart_CObject structure. | 771 // result and deserialize the result into a Dart_CObject structure. |
716 static Dart_CMessage* GetDeserializedDartMessage(Dart_Handle lib, | 772 static Dart_CMessage* GetDeserializedDartMessage(Dart_Handle lib, |
717 const char* dart_function) { | 773 const char* dart_function) { |
718 Dart_Handle result; | 774 Dart_Handle result; |
719 result = Dart_InvokeStatic(lib, | 775 result = Dart_InvokeStatic(lib, |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
787 | 843 |
788 // Read object back from the snapshot into a C structure. | 844 // Read object back from the snapshot into a C structure. |
789 Dart_CMessage* cmessage = | 845 Dart_CMessage* cmessage = |
790 Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | 846 Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
791 writer.BytesWritten(), | 847 writer.BytesWritten(), |
792 &allocator); | 848 &allocator); |
793 Dart_CObject* cobject = cmessage->object; | 849 Dart_CObject* cobject = cmessage->object; |
794 EXPECT_NOTNULL(cobject); | 850 EXPECT_NOTNULL(cobject); |
795 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); | 851 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
796 EXPECT_EQ(42, cobject->value.as_int32); | 852 EXPECT_EQ(42, cobject->value.as_int32); |
| 853 CheckEncodeMessage(cmessage); |
797 FreeDeserializedDartMessage(cmessage); | 854 FreeDeserializedDartMessage(cmessage); |
798 } | 855 } |
799 { | 856 { |
800 uint8_t* buffer; | 857 uint8_t* buffer; |
801 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 858 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
802 String& str = String::Handle(); | 859 String& str = String::Handle(); |
803 str ^= Api::UnwrapHandle(string_result); | 860 str ^= Api::UnwrapHandle(string_result); |
804 writer.WriteObject(str.raw()); | 861 writer.WriteObject(str.raw()); |
805 writer.FinalizeBuffer(); | 862 writer.FinalizeBuffer(); |
806 | 863 |
807 // Read object back from the snapshot into a C structure. | 864 // Read object back from the snapshot into a C structure. |
808 Dart_CMessage* cmessage = | 865 Dart_CMessage* cmessage = |
809 Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | 866 Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
810 writer.BytesWritten(), | 867 writer.BytesWritten(), |
811 &allocator); | 868 &allocator); |
812 Dart_CObject* cobject = cmessage->object; | 869 Dart_CObject* cobject = cmessage->object; |
813 EXPECT_NOTNULL(cobject); | 870 EXPECT_NOTNULL(cobject); |
814 EXPECT_EQ(Dart_CObject::kString, cobject->type); | 871 EXPECT_EQ(Dart_CObject::kString, cobject->type); |
815 EXPECT_STREQ("Hello, world!", cobject->value.as_string); | 872 EXPECT_STREQ("Hello, world!", cobject->value.as_string); |
| 873 CheckEncodeMessage(cmessage); |
816 FreeDeserializedDartMessage(cmessage); | 874 FreeDeserializedDartMessage(cmessage); |
817 } | 875 } |
818 } | 876 } |
819 Dart_ExitScope(); | 877 Dart_ExitScope(); |
820 Dart_ShutdownIsolate(); | 878 Dart_ShutdownIsolate(); |
821 } | 879 } |
822 | 880 |
823 | 881 |
824 UNIT_TEST_CASE(DartGeneratedListMessages) { | 882 UNIT_TEST_CASE(DartGeneratedListMessages) { |
825 const int kArrayLength = 10; | 883 const int kArrayLength = 10; |
(...skipping 24 matching lines...) Expand all Loading... |
850 TestCase::CreateTestIsolate(); | 908 TestCase::CreateTestIsolate(); |
851 Isolate* isolate = Isolate::Current(); | 909 Isolate* isolate = Isolate::Current(); |
852 EXPECT(isolate != NULL); | 910 EXPECT(isolate != NULL); |
853 Dart_EnterScope(); | 911 Dart_EnterScope(); |
854 | 912 |
855 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 913 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
856 EXPECT_VALID(lib); | 914 EXPECT_VALID(lib); |
857 | 915 |
858 { | 916 { |
859 DARTSCOPE_NOCHECKS(isolate); | 917 DARTSCOPE_NOCHECKS(isolate); |
860 | |
861 { | 918 { |
862 // Generate a list of nulls from Dart code. | 919 // Generate a list of nulls from Dart code. |
863 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getList"); | 920 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getList"); |
864 Dart_CObject* value = cmessage->object; | 921 Dart_CObject* value = cmessage->object; |
865 EXPECT_NOTNULL(value); | 922 EXPECT_NOTNULL(value); |
866 EXPECT_EQ(Dart_CObject::kArray, value->type); | 923 EXPECT_EQ(Dart_CObject::kArray, value->type); |
867 EXPECT_EQ(kArrayLength, value->value.as_array.length); | 924 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
868 for (int i = 0; i < kArrayLength; i++) { | 925 for (int i = 0; i < kArrayLength; i++) { |
869 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); | 926 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); |
870 } | 927 } |
| 928 CheckEncodeMessage(cmessage); |
871 FreeDeserializedDartMessage(cmessage); | 929 FreeDeserializedDartMessage(cmessage); |
872 } | 930 } |
873 { | 931 { |
874 // Generate a list of ints from Dart code. | 932 // Generate a list of ints from Dart code. |
875 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getIntList"); | 933 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getIntList"); |
876 Dart_CObject* value = cmessage->object; | 934 Dart_CObject* value = cmessage->object; |
877 EXPECT_NOTNULL(value); | 935 EXPECT_NOTNULL(value); |
878 EXPECT_EQ(Dart_CObject::kArray, value->type); | 936 EXPECT_EQ(Dart_CObject::kArray, value->type); |
879 EXPECT_EQ(kArrayLength, value->value.as_array.length); | 937 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
880 for (int i = 0; i < kArrayLength; i++) { | 938 for (int i = 0; i < kArrayLength; i++) { |
881 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type); | 939 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type); |
882 EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32); | 940 EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32); |
883 } | 941 } |
| 942 CheckEncodeMessage(cmessage); |
884 FreeDeserializedDartMessage(cmessage); | 943 FreeDeserializedDartMessage(cmessage); |
885 } | 944 } |
886 { | 945 { |
887 // Generate a list of strings from Dart code. | 946 // Generate a list of strings from Dart code. |
888 Dart_CMessage* cmessage = | 947 Dart_CMessage* cmessage = |
889 GetDeserializedDartMessage(lib, "getStringList"); | 948 GetDeserializedDartMessage(lib, "getStringList"); |
890 Dart_CObject* value = cmessage->object; | 949 Dart_CObject* value = cmessage->object; |
891 EXPECT_NOTNULL(value); | 950 EXPECT_NOTNULL(value); |
892 EXPECT_EQ(Dart_CObject::kArray, value->type); | 951 EXPECT_EQ(Dart_CObject::kArray, value->type); |
893 EXPECT_EQ(kArrayLength, value->value.as_array.length); | 952 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
894 for (int i = 0; i < kArrayLength; i++) { | 953 for (int i = 0; i < kArrayLength; i++) { |
895 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[i]->type); | 954 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[i]->type); |
896 char buffer[3]; | 955 char buffer[3]; |
897 snprintf(buffer, sizeof(buffer), "%d", i); | 956 snprintf(buffer, sizeof(buffer), "%d", i); |
898 EXPECT_STREQ(buffer, value->value.as_array.values[i]->value.as_string); | 957 EXPECT_STREQ(buffer, value->value.as_array.values[i]->value.as_string); |
899 } | 958 } |
| 959 CheckEncodeMessage(cmessage); |
900 FreeDeserializedDartMessage(cmessage); | 960 FreeDeserializedDartMessage(cmessage); |
901 } | 961 } |
902 { | 962 { |
903 // Generate a list of objects of different types from Dart code. | 963 // Generate a list of objects of different types from Dart code. |
904 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList"); | 964 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList"); |
905 Dart_CObject* value = cmessage->object; | 965 Dart_CObject* value = cmessage->object; |
906 EXPECT_NOTNULL(value); | 966 EXPECT_NOTNULL(value); |
907 EXPECT_EQ(Dart_CObject::kArray, value->type); | 967 EXPECT_EQ(Dart_CObject::kArray, value->type); |
908 EXPECT_EQ(kArrayLength, value->value.as_array.length); | 968 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
909 | 969 |
910 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[0]->type); | 970 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[0]->type); |
911 EXPECT_EQ(0, value->value.as_array.values[0]->value.as_int32); | 971 EXPECT_EQ(0, value->value.as_array.values[0]->value.as_int32); |
912 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[1]->type); | 972 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[1]->type); |
913 EXPECT_STREQ("1", value->value.as_array.values[1]->value.as_string); | 973 EXPECT_STREQ("1", value->value.as_array.values[1]->value.as_string); |
914 EXPECT_EQ(Dart_CObject::kDouble, value->value.as_array.values[2]->type); | 974 EXPECT_EQ(Dart_CObject::kDouble, value->value.as_array.values[2]->type); |
915 EXPECT_EQ(2.2, value->value.as_array.values[2]->value.as_double); | 975 EXPECT_EQ(2.2, value->value.as_array.values[2]->value.as_double); |
916 EXPECT_EQ(Dart_CObject::kBool, value->value.as_array.values[3]->type); | 976 EXPECT_EQ(Dart_CObject::kBool, value->value.as_array.values[3]->type); |
917 EXPECT_EQ(true, value->value.as_array.values[3]->value.as_bool); | 977 EXPECT_EQ(true, value->value.as_array.values[3]->value.as_bool); |
918 | 978 |
919 for (int i = 0; i < kArrayLength; i++) { | 979 for (int i = 0; i < kArrayLength; i++) { |
920 if (i > 3) { | 980 if (i > 3) { |
921 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); | 981 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); |
922 } | 982 } |
923 } | 983 } |
| 984 CheckEncodeMessage(cmessage); |
924 FreeDeserializedDartMessage(cmessage); | 985 FreeDeserializedDartMessage(cmessage); |
925 } | 986 } |
926 } | 987 } |
927 Dart_ExitScope(); | 988 Dart_ExitScope(); |
928 Dart_ShutdownIsolate(); | 989 Dart_ShutdownIsolate(); |
929 } | 990 } |
930 | 991 |
931 | 992 |
932 UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { | 993 UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
933 const int kArrayLength = 10; | 994 const int kArrayLength = 10; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
978 Dart_CObject* object = cmessage->object; | 1039 Dart_CObject* object = cmessage->object; |
979 EXPECT_NOTNULL(object); | 1040 EXPECT_NOTNULL(object); |
980 EXPECT_EQ(Dart_CObject::kArray, object->type); | 1041 EXPECT_EQ(Dart_CObject::kArray, object->type); |
981 EXPECT_EQ(kArrayLength, object->value.as_array.length); | 1042 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
982 for (int i = 0; i < kArrayLength; i++) { | 1043 for (int i = 0; i < kArrayLength; i++) { |
983 Dart_CObject* element = object->value.as_array.values[i]; | 1044 Dart_CObject* element = object->value.as_array.values[i]; |
984 EXPECT_EQ(object->value.as_array.values[0], element); | 1045 EXPECT_EQ(object->value.as_array.values[0], element); |
985 EXPECT_EQ(Dart_CObject::kString, element->type); | 1046 EXPECT_EQ(Dart_CObject::kString, element->type); |
986 EXPECT_STREQ("Hello, world!", element->value.as_string); | 1047 EXPECT_STREQ("Hello, world!", element->value.as_string); |
987 } | 1048 } |
| 1049 CheckEncodeMessage(cmessage); |
988 FreeDeserializedDartMessage(cmessage); | 1050 FreeDeserializedDartMessage(cmessage); |
989 } | 1051 } |
990 { | 1052 { |
991 // Generate a list of doubles from Dart code. | 1053 // Generate a list of doubles from Dart code. |
992 Dart_CMessage* cmessage = | 1054 Dart_CMessage* cmessage = |
993 GetDeserializedDartMessage(lib, "getDoubleList"); | 1055 GetDeserializedDartMessage(lib, "getDoubleList"); |
994 Dart_CObject* object = cmessage->object; | 1056 Dart_CObject* object = cmessage->object; |
995 EXPECT_NOTNULL(object); | 1057 EXPECT_NOTNULL(object); |
996 EXPECT_EQ(Dart_CObject::kArray, object->type); | 1058 EXPECT_EQ(Dart_CObject::kArray, object->type); |
997 EXPECT_EQ(kArrayLength, object->value.as_array.length); | 1059 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
998 for (int i = 0; i < kArrayLength; i++) { | 1060 for (int i = 0; i < kArrayLength; i++) { |
999 Dart_CObject* element = object->value.as_array.values[i]; | 1061 Dart_CObject* element = object->value.as_array.values[i]; |
1000 EXPECT_EQ(object->value.as_array.values[0], element); | 1062 EXPECT_EQ(object->value.as_array.values[0], element); |
1001 EXPECT_EQ(Dart_CObject::kDouble, element->type); | 1063 EXPECT_EQ(Dart_CObject::kDouble, element->type); |
1002 EXPECT_EQ(3.14, element->value.as_double); | 1064 EXPECT_EQ(3.14, element->value.as_double); |
1003 } | 1065 } |
| 1066 CheckEncodeMessage(cmessage); |
1004 FreeDeserializedDartMessage(cmessage); | 1067 FreeDeserializedDartMessage(cmessage); |
1005 } | 1068 } |
1006 { | 1069 { |
1007 // Generate a list of objects of different types from Dart code. | 1070 // Generate a list of objects of different types from Dart code. |
1008 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList"); | 1071 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList"); |
1009 Dart_CObject* object = cmessage->object; | 1072 Dart_CObject* object = cmessage->object; |
1010 EXPECT_NOTNULL(object); | 1073 EXPECT_NOTNULL(object); |
1011 EXPECT_EQ(Dart_CObject::kArray, object->type); | 1074 EXPECT_EQ(Dart_CObject::kArray, object->type); |
1012 EXPECT_EQ(kArrayLength, object->value.as_array.length); | 1075 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
1013 for (int i = 0; i < kArrayLength; i++) { | 1076 for (int i = 0; i < kArrayLength; i++) { |
1014 Dart_CObject* element = object->value.as_array.values[i]; | 1077 Dart_CObject* element = object->value.as_array.values[i]; |
1015 if ((i % 2) == 0) { | 1078 if ((i % 2) == 0) { |
1016 EXPECT_EQ(object->value.as_array.values[0], element); | 1079 EXPECT_EQ(object->value.as_array.values[0], element); |
1017 EXPECT_EQ(Dart_CObject::kString, element->type); | 1080 EXPECT_EQ(Dart_CObject::kString, element->type); |
1018 EXPECT_STREQ("A", element->value.as_string); | 1081 EXPECT_STREQ("A", element->value.as_string); |
1019 } else { | 1082 } else { |
1020 EXPECT_EQ(object->value.as_array.values[1], element); | 1083 EXPECT_EQ(object->value.as_array.values[1], element); |
1021 EXPECT_EQ(Dart_CObject::kDouble, element->type); | 1084 EXPECT_EQ(Dart_CObject::kDouble, element->type); |
1022 EXPECT_STREQ(2.72, element->value.as_double); | 1085 EXPECT_STREQ(2.72, element->value.as_double); |
1023 } | 1086 } |
1024 } | 1087 } |
| 1088 CheckEncodeMessage(cmessage); |
1025 FreeDeserializedDartMessage(cmessage); | 1089 FreeDeserializedDartMessage(cmessage); |
1026 } | 1090 } |
1027 { | 1091 { |
1028 // Generate a list of objects of different types from Dart code. | 1092 // Generate a list of objects of different types from Dart code. |
1029 Dart_CMessage* cmessage = | 1093 Dart_CMessage* cmessage = |
1030 GetDeserializedDartMessage(lib, "getSelfRefList"); | 1094 GetDeserializedDartMessage(lib, "getSelfRefList"); |
1031 Dart_CObject* object = cmessage->object; | 1095 Dart_CObject* object = cmessage->object; |
1032 EXPECT_NOTNULL(object); | 1096 EXPECT_NOTNULL(object); |
1033 EXPECT_EQ(Dart_CObject::kArray, object->type); | 1097 EXPECT_EQ(Dart_CObject::kArray, object->type); |
1034 EXPECT_EQ(kArrayLength, object->value.as_array.length); | 1098 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
1035 for (int i = 0; i < kArrayLength; i++) { | 1099 for (int i = 0; i < kArrayLength; i++) { |
1036 Dart_CObject* element = object->value.as_array.values[i]; | 1100 Dart_CObject* element = object->value.as_array.values[i]; |
1037 EXPECT_EQ(Dart_CObject::kArray, element->type); | 1101 EXPECT_EQ(Dart_CObject::kArray, element->type); |
1038 EXPECT_EQ(object, element); | 1102 EXPECT_EQ(object, element); |
1039 } | 1103 } |
| 1104 CheckEncodeMessage(cmessage); |
1040 FreeDeserializedDartMessage(cmessage); | 1105 FreeDeserializedDartMessage(cmessage); |
1041 } | 1106 } |
1042 } | 1107 } |
1043 Dart_ExitScope(); | 1108 Dart_ExitScope(); |
1044 Dart_ShutdownIsolate(); | 1109 Dart_ShutdownIsolate(); |
1045 } | 1110 } |
1046 | 1111 |
1047 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 1112 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
1048 | 1113 |
1049 } // namespace dart | 1114 } // namespace dart |
OLD | NEW |