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

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

Issue 10829444: Avoid trusting the length encoded in the Snapshot if there is an (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 3 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
« no previous file with comments | « 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_message.h" 10 #include "vm/dart_api_message.h"
(...skipping 18 matching lines...) Expand all
29 if (expected.IsDouble()) { 29 if (expected.IsDouble()) {
30 if (actual.IsDouble()) { 30 if (actual.IsDouble()) {
31 Double& dbl1 = Double::Handle(); 31 Double& dbl1 = Double::Handle();
32 Double& dbl2 = Double::Handle(); 32 Double& dbl2 = Double::Handle();
33 dbl1 ^= expected.raw(); 33 dbl1 ^= expected.raw();
34 dbl2 ^= actual.raw(); 34 dbl2 ^= actual.raw();
35 return dbl1.value() == dbl2.value(); 35 return dbl1.value() == dbl2.value();
36 } 36 }
37 return false; 37 return false;
38 } 38 }
39 if (expected.IsBool()) {
40 if (actual.IsBool()) {
41 Bool& bl1 = Bool::Handle();
42 Bool& bl2 = Bool::Handle();
43 bl1 ^= expected.raw();
44 bl2 ^= actual.raw();
45 return bl1.value() == bl2.value();
46 }
47 return false;
48 }
39 return false; 49 return false;
40 } 50 }
41 51
42 52
43 static uint8_t* malloc_allocator( 53 static uint8_t* malloc_allocator(
44 uint8_t* ptr, intptr_t old_size, intptr_t new_size) { 54 uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
45 return reinterpret_cast<uint8_t*>(realloc(ptr, new_size)); 55 return reinterpret_cast<uint8_t*>(realloc(ptr, new_size));
46 } 56 }
47 57
48 58
49 static uint8_t* zone_allocator( 59 static uint8_t* zone_allocator(
50 uint8_t* ptr, intptr_t old_size, intptr_t new_size) { 60 uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
51 Zone* zone = Isolate::Current()->current_zone(); 61 Zone* zone = Isolate::Current()->current_zone();
52 return zone->Realloc<uint8_t>(ptr, old_size, new_size); 62 return zone->Realloc<uint8_t>(ptr, old_size, new_size);
53 } 63 }
54 64
55 65
56 static Dart_CObject* DecodeMessage(uint8_t* message,
57 intptr_t length,
58 ReAlloc allocator) {
59 ApiMessageReader message_reader(message, length, allocator);
60 return message_reader.ReadMessage();
61 }
62
63
64 // Compare two Dart_CObject object graphs rooted in first and 66 // Compare two Dart_CObject object graphs rooted in first and
65 // second. The second graph will be destroyed by this operation no matter 67 // second. The second graph will be destroyed by this operation no matter
66 // whether the graphs are equal or not. 68 // whether the graphs are equal or not.
67 static void CompareDartCObjects(Dart_CObject* first, Dart_CObject* second) { 69 static void CompareDartCObjects(Dart_CObject* first, Dart_CObject* second) {
68 // Return immediately if entering a cycle. 70 // Return immediately if entering a cycle.
69 if (second->type == Dart_CObject::kNumberOfTypes) return; 71 if (second->type == Dart_CObject::kNumberOfTypes) return;
70 72
71 EXPECT_NE(first, second); 73 EXPECT_NE(first, second);
72 EXPECT_EQ(first->type, second->type); 74 EXPECT_EQ(first->type, second->type);
73 switch (first->type) { 75 switch (first->type) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 } 117 }
116 } 118 }
117 119
118 120
119 static void CheckEncodeDecodeMessage(Dart_CObject* root) { 121 static void CheckEncodeDecodeMessage(Dart_CObject* root) {
120 // Encode and decode the message. 122 // Encode and decode the message.
121 uint8_t* buffer = NULL; 123 uint8_t* buffer = NULL;
122 ApiMessageWriter writer(&buffer, &malloc_allocator); 124 ApiMessageWriter writer(&buffer, &malloc_allocator);
123 writer.WriteCMessage(root); 125 writer.WriteCMessage(root);
124 126
125 Dart_CObject* new_root = DecodeMessage(buffer + Snapshot::kHeaderSize, 127 ApiMessageReader api_reader(buffer, writer.BytesWritten(), &zone_allocator);
126 writer.BytesWritten(), 128 Dart_CObject* new_root = api_reader.ReadMessage();
127 &zone_allocator);
128 129
129 // Check that the two messages are the same. 130 // Check that the two messages are the same.
130 CompareDartCObjects(root, new_root); 131 CompareDartCObjects(root, new_root);
131 } 132 }
132 133
133 TEST_CASE(SerializeNull) { 134 TEST_CASE(SerializeNull) {
134 Zone zone(Isolate::Current()); 135 Zone zone(Isolate::Current());
135 136
136 // Write snapshot with object content. 137 // Write snapshot with object content.
137 uint8_t* buffer; 138 uint8_t* buffer;
138 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 139 MessageWriter writer(&buffer, &zone_allocator);
139 const Object& null_object = Object::Handle(); 140 const Object& null_object = Object::Handle();
140 writer.WriteObject(null_object.raw()); 141 writer.WriteMessage(null_object);
141 writer.FinalizeBuffer(); 142 intptr_t buffer_len = writer.BytesWritten();
142
143 // Create a snapshot object using the buffer.
144 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
145 143
146 // Read object back from the snapshot. 144 // Read object back from the snapshot.
147 SnapshotReader reader(snapshot, Isolate::Current()); 145 SnapshotReader reader(buffer, buffer_len,
146 Snapshot::kMessage, Isolate::Current());
148 const Object& serialized_object = Object::Handle(reader.ReadObject()); 147 const Object& serialized_object = Object::Handle(reader.ReadObject());
149 EXPECT(Equals(null_object, serialized_object)); 148 EXPECT(Equals(null_object, serialized_object));
150 149
151 // Read object back from the snapshot into a C structure. 150 // Read object back from the snapshot into a C structure.
152 ApiNativeScope scope; 151 ApiNativeScope scope;
153 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 152 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
154 writer.BytesWritten(), 153 Dart_CObject* root = api_reader.ReadMessage();
155 &zone_allocator);
156 EXPECT_NOTNULL(root); 154 EXPECT_NOTNULL(root);
157 EXPECT_EQ(Dart_CObject::kNull, root->type); 155 EXPECT_EQ(Dart_CObject::kNull, root->type);
158 CheckEncodeDecodeMessage(root); 156 CheckEncodeDecodeMessage(root);
159 } 157 }
160 158
161 159
162 TEST_CASE(SerializeSmi1) { 160 TEST_CASE(SerializeSmi1) {
163 Zone zone(Isolate::Current()); 161 Zone zone(Isolate::Current());
164 162
165 // Write snapshot with object content. 163 // Write snapshot with object content.
166 uint8_t* buffer; 164 uint8_t* buffer;
167 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 165 MessageWriter writer(&buffer, &zone_allocator);
168 const Smi& smi = Smi::Handle(Smi::New(124)); 166 const Smi& smi = Smi::Handle(Smi::New(124));
169 writer.WriteObject(smi.raw()); 167 writer.WriteMessage(smi);
170 writer.FinalizeBuffer(); 168 intptr_t buffer_len = writer.BytesWritten();
171
172 // Create a snapshot object using the buffer.
173 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
174 169
175 // Read object back from the snapshot. 170 // Read object back from the snapshot.
176 SnapshotReader reader(snapshot, Isolate::Current()); 171 SnapshotReader reader(buffer, buffer_len,
172 Snapshot::kMessage, Isolate::Current());
177 const Object& serialized_object = Object::Handle(reader.ReadObject()); 173 const Object& serialized_object = Object::Handle(reader.ReadObject());
178 EXPECT(Equals(smi, serialized_object)); 174 EXPECT(Equals(smi, serialized_object));
179 175
180 // Read object back from the snapshot into a C structure. 176 // Read object back from the snapshot into a C structure.
181 ApiNativeScope scope; 177 ApiNativeScope scope;
182 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 178 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
183 writer.BytesWritten(), 179 Dart_CObject* root = api_reader.ReadMessage();
184 &zone_allocator);
185 EXPECT_NOTNULL(root); 180 EXPECT_NOTNULL(root);
186 EXPECT_EQ(Dart_CObject::kInt32, root->type); 181 EXPECT_EQ(Dart_CObject::kInt32, root->type);
187 EXPECT_EQ(smi.Value(), root->value.as_int32); 182 EXPECT_EQ(smi.Value(), root->value.as_int32);
188 CheckEncodeDecodeMessage(root); 183 CheckEncodeDecodeMessage(root);
189 } 184 }
190 185
191 186
192 TEST_CASE(SerializeSmi2) { 187 TEST_CASE(SerializeSmi2) {
193 Zone zone(Isolate::Current()); 188 Zone zone(Isolate::Current());
194 189
195 // Write snapshot with object content. 190 // Write snapshot with object content.
196 uint8_t* buffer; 191 uint8_t* buffer;
197 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 192 MessageWriter writer(&buffer, &zone_allocator);
198 const Smi& smi = Smi::Handle(Smi::New(-1)); 193 const Smi& smi = Smi::Handle(Smi::New(-1));
199 writer.WriteObject(smi.raw()); 194 writer.WriteMessage(smi);
200 writer.FinalizeBuffer(); 195 intptr_t buffer_len = writer.BytesWritten();
201
202 // Create a snapshot object using the buffer.
203 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
204 196
205 // Read object back from the snapshot. 197 // Read object back from the snapshot.
206 SnapshotReader reader(snapshot, Isolate::Current()); 198 SnapshotReader reader(buffer, buffer_len,
199 Snapshot::kMessage, Isolate::Current());
207 const Object& serialized_object = Object::Handle(reader.ReadObject()); 200 const Object& serialized_object = Object::Handle(reader.ReadObject());
208 EXPECT(Equals(smi, serialized_object)); 201 EXPECT(Equals(smi, serialized_object));
209 202
210 // Read object back from the snapshot into a C structure. 203 // Read object back from the snapshot into a C structure.
211 ApiNativeScope scope; 204 ApiNativeScope scope;
212 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 205 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
213 writer.BytesWritten(), 206 Dart_CObject* root = api_reader.ReadMessage();
214 &zone_allocator);
215 EXPECT_NOTNULL(root); 207 EXPECT_NOTNULL(root);
216 EXPECT_EQ(Dart_CObject::kInt32, root->type); 208 EXPECT_EQ(Dart_CObject::kInt32, root->type);
217 EXPECT_EQ(smi.Value(), root->value.as_int32); 209 EXPECT_EQ(smi.Value(), root->value.as_int32);
218 CheckEncodeDecodeMessage(root); 210 CheckEncodeDecodeMessage(root);
219 } 211 }
220 212
221 213
222 Dart_CObject* SerializeAndDeserializeMint(const Mint& mint) { 214 Dart_CObject* SerializeAndDeserializeMint(const Mint& mint) {
223 // Write snapshot with object content. 215 // Write snapshot with object content.
224 uint8_t* buffer; 216 uint8_t* buffer;
225 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 217 MessageWriter writer(&buffer, &zone_allocator);
226 writer.WriteObject(mint.raw()); 218 writer.WriteMessage(mint);
227 writer.FinalizeBuffer(); 219 intptr_t buffer_len = writer.BytesWritten();
228
229 // Create a snapshot object using the buffer.
230 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
231 220
232 // Read object back from the snapshot. 221 // Read object back from the snapshot.
233 SnapshotReader reader(snapshot, Isolate::Current()); 222 SnapshotReader reader(buffer, buffer_len,
223 Snapshot::kMessage, Isolate::Current());
234 const Object& serialized_object = Object::Handle(reader.ReadObject()); 224 const Object& serialized_object = Object::Handle(reader.ReadObject());
235 EXPECT(serialized_object.IsMint()); 225 EXPECT(serialized_object.IsMint());
236 226
237 // Read object back from the snapshot into a C structure. 227 // Read object back from the snapshot into a C structure.
238 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 228 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
239 writer.BytesWritten(), 229 Dart_CObject* root = api_reader.ReadMessage();
240 &zone_allocator);
241 EXPECT_NOTNULL(root); 230 EXPECT_NOTNULL(root);
242 CheckEncodeDecodeMessage(root); 231 CheckEncodeDecodeMessage(root);
243 return root; 232 return root;
244 } 233 }
245 234
246 235
247 void CheckMint(int64_t value) { 236 void CheckMint(int64_t value) {
248 Zone zone(Isolate::Current()); 237 Zone zone(Isolate::Current());
249 238
250 const Mint& mint = Mint::Handle(Mint::New(value)); 239 const Mint& mint = Mint::Handle(Mint::New(value));
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 // Min negative mint + 1. 276 // Min negative mint + 1.
288 CheckMint(kMinInt64 + 1); 277 CheckMint(kMinInt64 + 1);
289 } 278 }
290 279
291 280
292 TEST_CASE(SerializeDouble) { 281 TEST_CASE(SerializeDouble) {
293 Zone zone(Isolate::Current()); 282 Zone zone(Isolate::Current());
294 283
295 // Write snapshot with object content. 284 // Write snapshot with object content.
296 uint8_t* buffer; 285 uint8_t* buffer;
297 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 286 MessageWriter writer(&buffer, &zone_allocator);
298 const Double& dbl = Double::Handle(Double::New(101.29)); 287 const Double& dbl = Double::Handle(Double::New(101.29));
299 writer.WriteObject(dbl.raw()); 288 writer.WriteMessage(dbl);
300 writer.FinalizeBuffer(); 289 intptr_t buffer_len = writer.BytesWritten();
301
302 // Create a snapshot object using the buffer.
303 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
304 290
305 // Read object back from the snapshot. 291 // Read object back from the snapshot.
306 SnapshotReader reader(snapshot, Isolate::Current()); 292 SnapshotReader reader(buffer, buffer_len,
293 Snapshot::kMessage, Isolate::Current());
307 const Object& serialized_object = Object::Handle(reader.ReadObject()); 294 const Object& serialized_object = Object::Handle(reader.ReadObject());
308 EXPECT(Equals(dbl, serialized_object)); 295 EXPECT(Equals(dbl, serialized_object));
309 296
310 // Read object back from the snapshot into a C structure. 297 // Read object back from the snapshot into a C structure.
311 ApiNativeScope scope; 298 ApiNativeScope scope;
312 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 299 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
313 writer.BytesWritten(), 300 Dart_CObject* root = api_reader.ReadMessage();
314 &zone_allocator);
315 EXPECT_NOTNULL(root); 301 EXPECT_NOTNULL(root);
316 EXPECT_EQ(Dart_CObject::kDouble, root->type); 302 EXPECT_EQ(Dart_CObject::kDouble, root->type);
317 EXPECT_EQ(dbl.value(), root->value.as_double); 303 EXPECT_EQ(dbl.value(), root->value.as_double);
318 CheckEncodeDecodeMessage(root); 304 CheckEncodeDecodeMessage(root);
319 } 305 }
320 306
321 307
322 TEST_CASE(SerializeBool) {
323 Zone zone(Isolate::Current());
324
325 // Write snapshot with object content.
326 uint8_t* buffer;
327 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
328 const Bool& bool1 = Bool::Handle(Bool::True());
329 const Bool& bool2 = Bool::Handle(Bool::False());
330 writer.WriteObject(bool1.raw());
331 writer.WriteObject(bool2.raw());
332 writer.FinalizeBuffer();
333
334 // Create a snapshot object using the buffer.
335 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
336
337 // Read object back from the snapshot.
338 SnapshotReader reader(snapshot, Isolate::Current());
339 EXPECT(Bool::True() == reader.ReadObject());
340 EXPECT(Bool::False() == reader.ReadObject());
341 }
342
343
344 TEST_CASE(SerializeTrue) { 308 TEST_CASE(SerializeTrue) {
345 Zone zone(Isolate::Current()); 309 Zone zone(Isolate::Current());
346 310
347 // Write snapshot with true object. 311 // Write snapshot with true object.
348 uint8_t* buffer; 312 uint8_t* buffer;
349 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 313 MessageWriter writer(&buffer, &zone_allocator);
350 const Bool& bl = Bool::Handle(Bool::True()); 314 const Bool& bl = Bool::Handle(Bool::True());
351 writer.WriteObject(bl.raw()); 315 writer.WriteMessage(bl);
352 writer.FinalizeBuffer(); 316 intptr_t buffer_len = writer.BytesWritten();
353 317
354 // Create a snapshot object using the buffer. 318 // Read object back from the snapshot.
355 Snapshot::SetupFromBuffer(buffer); 319 SnapshotReader reader(buffer, buffer_len,
320 Snapshot::kMessage, Isolate::Current());
321 const Object& serialized_object = Object::Handle(reader.ReadObject());
322 fprintf(stderr, "%s / %s\n", bl.ToCString(), serialized_object.ToCString());
323
324 EXPECT(Equals(bl, serialized_object));
356 325
357 // Read object back from the snapshot into a C structure. 326 // Read object back from the snapshot into a C structure.
358 ApiNativeScope scope; 327 ApiNativeScope scope;
359 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 328 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
360 writer.BytesWritten(), 329 Dart_CObject* root = api_reader.ReadMessage();
361 &zone_allocator);
362 EXPECT_NOTNULL(root); 330 EXPECT_NOTNULL(root);
363 EXPECT_EQ(Dart_CObject::kBool, root->type); 331 EXPECT_EQ(Dart_CObject::kBool, root->type);
364 EXPECT_EQ(true, root->value.as_bool); 332 EXPECT_EQ(true, root->value.as_bool);
365 CheckEncodeDecodeMessage(root); 333 CheckEncodeDecodeMessage(root);
366 } 334 }
367 335
368 336
369 TEST_CASE(SerializeFalse) { 337 TEST_CASE(SerializeFalse) {
370 Zone zone(Isolate::Current()); 338 Zone zone(Isolate::Current());
371 339
372 // Write snapshot with false object. 340 // Write snapshot with false object.
373 uint8_t* buffer; 341 uint8_t* buffer;
374 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 342 MessageWriter writer(&buffer, &zone_allocator);
375 const Bool& bl = Bool::Handle(Bool::False()); 343 const Bool& bl = Bool::Handle(Bool::False());
376 writer.WriteObject(bl.raw()); 344 writer.WriteMessage(bl);
377 writer.FinalizeBuffer(); 345 intptr_t buffer_len = writer.BytesWritten();
378 346
379 // Create a snapshot object using the buffer. 347 // Read object back from the snapshot.
380 Snapshot::SetupFromBuffer(buffer); 348 SnapshotReader reader(buffer, buffer_len,
349 Snapshot::kMessage, Isolate::Current());
350 const Object& serialized_object = Object::Handle(reader.ReadObject());
351 EXPECT(Equals(bl, serialized_object));
381 352
382 // Read object back from the snapshot into a C structure. 353 // Read object back from the snapshot into a C structure.
383 ApiNativeScope scope; 354 ApiNativeScope scope;
384 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 355 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
385 writer.BytesWritten(), 356 Dart_CObject* root = api_reader.ReadMessage();
386 &zone_allocator);
387 EXPECT_NOTNULL(root); 357 EXPECT_NOTNULL(root);
388 EXPECT_EQ(Dart_CObject::kBool, root->type); 358 EXPECT_EQ(Dart_CObject::kBool, root->type);
389 EXPECT_EQ(false, root->value.as_bool); 359 EXPECT_EQ(false, root->value.as_bool);
390 CheckEncodeDecodeMessage(root); 360 CheckEncodeDecodeMessage(root);
391 } 361 }
392 362
393 363
394 static uword allocator(intptr_t size) { 364 static uword allocator(intptr_t size) {
395 return reinterpret_cast<uword>(malloc(size)); 365 return reinterpret_cast<uword>(malloc(size));
396 } 366 }
397 367
398 368
399 TEST_CASE(SerializeBigint) { 369 TEST_CASE(SerializeBigint) {
400 Zone zone(Isolate::Current()); 370 Zone zone(Isolate::Current());
401 371
402 // Write snapshot with object content. 372 // Write snapshot with object content.
403 uint8_t* buffer; 373 uint8_t* buffer;
404 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 374 MessageWriter writer(&buffer, &zone_allocator);
405 const Bigint& bigint = Bigint::Handle(Bigint::New(DART_INT64_C(0xfffffffff))); 375 const Bigint& bigint = Bigint::Handle(Bigint::New(DART_INT64_C(0xfffffffff)));
406 writer.WriteObject(bigint.raw()); 376 writer.WriteMessage(bigint);
407 writer.FinalizeBuffer(); 377 intptr_t buffer_len = writer.BytesWritten();
408
409 // Create a snapshot object using the buffer.
410 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
411 378
412 // Read object back from the snapshot. 379 // Read object back from the snapshot.
413 SnapshotReader reader(snapshot, Isolate::Current()); 380 SnapshotReader reader(buffer, buffer_len,
381 Snapshot::kMessage, Isolate::Current());
414 Bigint& obj = Bigint::Handle(); 382 Bigint& obj = Bigint::Handle();
415 obj ^= reader.ReadObject(); 383 obj ^= reader.ReadObject();
416 384
417 EXPECT_EQ(BigintOperations::ToMint(bigint), BigintOperations::ToMint(obj)); 385 EXPECT_EQ(BigintOperations::ToMint(bigint), BigintOperations::ToMint(obj));
418 386
419 // Read object back from the snapshot into a C structure. 387 // Read object back from the snapshot into a C structure.
420 ApiNativeScope scope; 388 ApiNativeScope scope;
421 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 389 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
422 writer.BytesWritten(), 390 Dart_CObject* root = api_reader.ReadMessage();
423 &zone_allocator);
424 // Bigint not supported. 391 // Bigint not supported.
425 EXPECT_NOTNULL(root); 392 EXPECT_NOTNULL(root);
426 EXPECT_EQ(Dart_CObject::kBigint, root->type); 393 EXPECT_EQ(Dart_CObject::kBigint, root->type);
427 EXPECT_STREQ("FFFFFFFFF", root->value.as_bigint); 394 EXPECT_STREQ("FFFFFFFFF", root->value.as_bigint);
428 CheckEncodeDecodeMessage(root); 395 CheckEncodeDecodeMessage(root);
429 } 396 }
430 397
431 398
432 Dart_CObject* SerializeAndDeserializeBigint(const Bigint& bigint) { 399 Dart_CObject* SerializeAndDeserializeBigint(const Bigint& bigint) {
433 // Write snapshot with object content. 400 // Write snapshot with object content.
434 uint8_t* buffer; 401 uint8_t* buffer;
435 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 402 MessageWriter writer(&buffer, &zone_allocator);
436 writer.WriteObject(bigint.raw()); 403 writer.WriteMessage(bigint);
437 writer.FinalizeBuffer(); 404 intptr_t buffer_len = writer.BytesWritten();
438
439 // Create a snapshot object using the buffer.
440 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
441 405
442 // Read object back from the snapshot. 406 // Read object back from the snapshot.
443 SnapshotReader reader(snapshot, Isolate::Current()); 407 SnapshotReader reader(buffer, buffer_len,
408 Snapshot::kMessage, Isolate::Current());
444 Bigint& serialized_bigint = Bigint::Handle(); 409 Bigint& serialized_bigint = Bigint::Handle();
445 serialized_bigint ^= reader.ReadObject(); 410 serialized_bigint ^= reader.ReadObject();
446 const char *str1 = BigintOperations::ToHexCString(bigint, allocator); 411 const char *str1 = BigintOperations::ToHexCString(bigint, allocator);
447 const char *str2 = 412 const char *str2 =
448 BigintOperations::ToHexCString(serialized_bigint, allocator); 413 BigintOperations::ToHexCString(serialized_bigint, allocator);
449 EXPECT_STREQ(str1, str2); 414 EXPECT_STREQ(str1, str2);
450 free(const_cast<char*>(str1)); 415 free(const_cast<char*>(str1));
451 free(const_cast<char*>(str2)); 416 free(const_cast<char*>(str2));
452 417
453 // Read object back from the snapshot into a C structure. 418 // Read object back from the snapshot into a C structure.
454 ApiNativeScope scope; 419 ApiNativeScope scope;
455 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 420 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
456 writer.BytesWritten(), 421 Dart_CObject* root = api_reader.ReadMessage();
457 &zone_allocator);
458 // Bigint not supported. 422 // Bigint not supported.
459 EXPECT_NOTNULL(root); 423 EXPECT_NOTNULL(root);
460 CheckEncodeDecodeMessage(root); 424 CheckEncodeDecodeMessage(root);
461 return root; 425 return root;
462 } 426 }
463 427
464 428
465 void CheckBigint(const char* bigint_value) { 429 void CheckBigint(const char* bigint_value) {
466 Zone zone(Isolate::Current()); 430 Zone zone(Isolate::Current());
467 431
(...skipping 14 matching lines...) Expand all
482 TEST_CASE(SerializeBigint2) { 446 TEST_CASE(SerializeBigint2) {
483 CheckBigint("0x0"); 447 CheckBigint("0x0");
484 CheckBigint("0x1"); 448 CheckBigint("0x1");
485 CheckBigint("-0x1"); 449 CheckBigint("-0x1");
486 CheckBigint("0x11111111111111111111"); 450 CheckBigint("0x11111111111111111111");
487 CheckBigint("-0x11111111111111111111"); 451 CheckBigint("-0x11111111111111111111");
488 CheckBigint("0x9876543210987654321098765432109876543210"); 452 CheckBigint("0x9876543210987654321098765432109876543210");
489 CheckBigint("-0x9876543210987654321098765432109876543210"); 453 CheckBigint("-0x9876543210987654321098765432109876543210");
490 } 454 }
491 455
492
493 TEST_CASE(SerializeSingletons) { 456 TEST_CASE(SerializeSingletons) {
494 // Write snapshot with object content. 457 // Write snapshot with object content.
495 uint8_t* buffer; 458 uint8_t* buffer;
496 SnapshotWriter writer(Snapshot::kMessage, &buffer, &malloc_allocator); 459 MessageWriter writer(&buffer, &malloc_allocator);
497 writer.WriteObject(Object::class_class()); 460 writer.WriteObject(Object::class_class());
498 writer.WriteObject(Object::null_class()); 461 writer.WriteObject(Object::null_class());
499 writer.WriteObject(Object::type_class()); 462 writer.WriteObject(Object::type_class());
500 writer.WriteObject(Object::type_parameter_class()); 463 writer.WriteObject(Object::type_parameter_class());
501 writer.WriteObject(Object::type_arguments_class()); 464 writer.WriteObject(Object::type_arguments_class());
502 writer.WriteObject(Object::instantiated_type_arguments_class()); 465 writer.WriteObject(Object::instantiated_type_arguments_class());
503 writer.WriteObject(Object::function_class()); 466 writer.WriteObject(Object::function_class());
504 writer.WriteObject(Object::field_class()); 467 writer.WriteObject(Object::field_class());
505 writer.WriteObject(Object::token_stream_class()); 468 writer.WriteObject(Object::token_stream_class());
506 writer.WriteObject(Object::script_class()); 469 writer.WriteObject(Object::script_class());
507 writer.WriteObject(Object::library_class()); 470 writer.WriteObject(Object::library_class());
508 writer.WriteObject(Object::code_class()); 471 writer.WriteObject(Object::code_class());
509 writer.WriteObject(Object::instructions_class()); 472 writer.WriteObject(Object::instructions_class());
510 writer.WriteObject(Object::pc_descriptors_class()); 473 writer.WriteObject(Object::pc_descriptors_class());
511 writer.WriteObject(Object::exception_handlers_class()); 474 writer.WriteObject(Object::exception_handlers_class());
512 writer.WriteObject(Object::context_class()); 475 writer.WriteObject(Object::context_class());
513 writer.WriteObject(Object::context_scope_class()); 476 writer.WriteObject(Object::context_scope_class());
514 writer.FinalizeBuffer(); 477 intptr_t buffer_len = writer.BytesWritten();
515
516 // Create a snapshot object using the buffer.
517 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
518 478
519 // Read object back from the snapshot. 479 // Read object back from the snapshot.
520 SnapshotReader reader(snapshot, Isolate::Current()); 480 SnapshotReader reader(buffer, buffer_len, Snapshot::kMessage,
481 Isolate::Current());
521 EXPECT(Object::class_class() == reader.ReadObject()); 482 EXPECT(Object::class_class() == reader.ReadObject());
522 EXPECT(Object::null_class() == reader.ReadObject()); 483 EXPECT(Object::null_class() == reader.ReadObject());
523 EXPECT(Object::type_class() == reader.ReadObject()); 484 EXPECT(Object::type_class() == reader.ReadObject());
524 EXPECT(Object::type_parameter_class() == reader.ReadObject()); 485 EXPECT(Object::type_parameter_class() == reader.ReadObject());
525 EXPECT(Object::type_arguments_class() == reader.ReadObject()); 486 EXPECT(Object::type_arguments_class() == reader.ReadObject());
526 EXPECT(Object::instantiated_type_arguments_class() == reader.ReadObject()); 487 EXPECT(Object::instantiated_type_arguments_class() == reader.ReadObject());
527 EXPECT(Object::function_class() == reader.ReadObject()); 488 EXPECT(Object::function_class() == reader.ReadObject());
528 EXPECT(Object::field_class() == reader.ReadObject()); 489 EXPECT(Object::field_class() == reader.ReadObject());
529 EXPECT(Object::token_stream_class() == reader.ReadObject()); 490 EXPECT(Object::token_stream_class() == reader.ReadObject());
530 EXPECT(Object::script_class() == reader.ReadObject()); 491 EXPECT(Object::script_class() == reader.ReadObject());
531 EXPECT(Object::library_class() == reader.ReadObject()); 492 EXPECT(Object::library_class() == reader.ReadObject());
532 EXPECT(Object::code_class() == reader.ReadObject()); 493 EXPECT(Object::code_class() == reader.ReadObject());
533 EXPECT(Object::instructions_class() == reader.ReadObject()); 494 EXPECT(Object::instructions_class() == reader.ReadObject());
534 EXPECT(Object::pc_descriptors_class() == reader.ReadObject()); 495 EXPECT(Object::pc_descriptors_class() == reader.ReadObject());
535 EXPECT(Object::exception_handlers_class() == reader.ReadObject()); 496 EXPECT(Object::exception_handlers_class() == reader.ReadObject());
536 EXPECT(Object::context_class() == reader.ReadObject()); 497 EXPECT(Object::context_class() == reader.ReadObject());
537 EXPECT(Object::context_scope_class() == reader.ReadObject()); 498 EXPECT(Object::context_scope_class() == reader.ReadObject());
538 499
539 free(buffer); 500 free(buffer);
540 } 501 }
541 502
542 503
543 TEST_CASE(SerializeString) { 504 TEST_CASE(SerializeString) {
544 Zone zone(Isolate::Current()); 505 Zone zone(Isolate::Current());
545 506
546 // Write snapshot with object content. 507 // Write snapshot with object content.
547 uint8_t* buffer; 508 uint8_t* buffer;
548 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 509 MessageWriter writer(&buffer, &zone_allocator);
549 static const char* cstr = "This string shall be serialized"; 510 static const char* cstr = "This string shall be serialized";
550 String& str = String::Handle(String::New(cstr)); 511 String& str = String::Handle(String::New(cstr));
551 writer.WriteObject(str.raw()); 512 writer.WriteMessage(str);
552 writer.FinalizeBuffer(); 513 intptr_t buffer_len = writer.BytesWritten();
553
554 // Create a snapshot object using the buffer.
555 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
556 514
557 // Read object back from the snapshot. 515 // Read object back from the snapshot.
558 SnapshotReader reader(snapshot, Isolate::Current()); 516 SnapshotReader reader(buffer, buffer_len,
517 Snapshot::kMessage, Isolate::Current());
559 String& serialized_str = String::Handle(); 518 String& serialized_str = String::Handle();
560 serialized_str ^= reader.ReadObject(); 519 serialized_str ^= reader.ReadObject();
561 EXPECT(str.Equals(serialized_str)); 520 EXPECT(str.Equals(serialized_str));
562 521
563 // Read object back from the snapshot into a C structure. 522 // Read object back from the snapshot into a C structure.
564 ApiNativeScope scope; 523 ApiNativeScope scope;
565 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 524 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
566 writer.BytesWritten(), 525 Dart_CObject* root = api_reader.ReadMessage();
567 &zone_allocator);
568 EXPECT_EQ(Dart_CObject::kString, root->type); 526 EXPECT_EQ(Dart_CObject::kString, root->type);
569 EXPECT_STREQ(cstr, root->value.as_string); 527 EXPECT_STREQ(cstr, root->value.as_string);
570 CheckEncodeDecodeMessage(root); 528 CheckEncodeDecodeMessage(root);
571 } 529 }
572 530
573 531
574 TEST_CASE(SerializeArray) { 532 TEST_CASE(SerializeArray) {
575 Zone zone(Isolate::Current()); 533 Zone zone(Isolate::Current());
576 534
577 // Write snapshot with object content. 535 // Write snapshot with object content.
578 uint8_t* buffer; 536 uint8_t* buffer;
579 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 537 MessageWriter writer(&buffer, &zone_allocator);
580 const int kArrayLength = 10; 538 const int kArrayLength = 10;
581 Array& array = Array::Handle(Array::New(kArrayLength)); 539 Array& array = Array::Handle(Array::New(kArrayLength));
582 Smi& smi = Smi::Handle(); 540 Smi& smi = Smi::Handle();
583 for (int i = 0; i < kArrayLength; i++) { 541 for (int i = 0; i < kArrayLength; i++) {
584 smi ^= Smi::New(i); 542 smi ^= Smi::New(i);
585 array.SetAt(i, smi); 543 array.SetAt(i, smi);
586 } 544 }
587 writer.WriteObject(array.raw()); 545 writer.WriteMessage(array);
588 writer.FinalizeBuffer(); 546 intptr_t buffer_len = writer.BytesWritten();
589
590 // Create a snapshot object using the buffer.
591 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
592 547
593 // Read object back from the snapshot. 548 // Read object back from the snapshot.
594 SnapshotReader reader(snapshot, Isolate::Current()); 549 SnapshotReader reader(buffer, buffer_len,
550 Snapshot::kMessage, Isolate::Current());
595 Array& serialized_array = Array::Handle(); 551 Array& serialized_array = Array::Handle();
596 serialized_array ^= reader.ReadObject(); 552 serialized_array ^= reader.ReadObject();
597 EXPECT(array.Equals(serialized_array)); 553 EXPECT(array.Equals(serialized_array));
598 554
599 // Read object back from the snapshot into a C structure. 555 // Read object back from the snapshot into a C structure.
600 ApiNativeScope scope; 556 ApiNativeScope scope;
601 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 557 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
602 writer.BytesWritten(), 558 Dart_CObject* root = api_reader.ReadMessage();
603 &zone_allocator);
604 EXPECT_EQ(Dart_CObject::kArray, root->type); 559 EXPECT_EQ(Dart_CObject::kArray, root->type);
605 EXPECT_EQ(kArrayLength, root->value.as_array.length); 560 EXPECT_EQ(kArrayLength, root->value.as_array.length);
606 for (int i = 0; i < kArrayLength; i++) { 561 for (int i = 0; i < kArrayLength; i++) {
607 Dart_CObject* element = root->value.as_array.values[i]; 562 Dart_CObject* element = root->value.as_array.values[i];
608 EXPECT_EQ(Dart_CObject::kInt32, element->type); 563 EXPECT_EQ(Dart_CObject::kInt32, element->type);
609 EXPECT_EQ(i, element->value.as_int32); 564 EXPECT_EQ(i, element->value.as_int32);
610 } 565 }
611 CheckEncodeDecodeMessage(root); 566 CheckEncodeDecodeMessage(root);
612 } 567 }
613 568
614 569
615 TEST_CASE(SerializeEmptyArray) { 570 TEST_CASE(SerializeEmptyArray) {
616 Zone zone(Isolate::Current()); 571 Zone zone(Isolate::Current());
617 572
618 // Write snapshot with object content. 573 // Write snapshot with object content.
619 uint8_t* buffer; 574 uint8_t* buffer;
620 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 575 MessageWriter writer(&buffer, &zone_allocator);
621 const int kArrayLength = 0; 576 const int kArrayLength = 0;
622 Array& array = Array::Handle(Array::New(kArrayLength)); 577 Array& array = Array::Handle(Array::New(kArrayLength));
623 writer.WriteObject(array.raw()); 578 writer.WriteMessage(array);
624 writer.FinalizeBuffer(); 579 intptr_t buffer_len = writer.BytesWritten();
625
626 // Create a snapshot object using the buffer.
627 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
628 580
629 // Read object back from the snapshot. 581 // Read object back from the snapshot.
630 SnapshotReader reader(snapshot, Isolate::Current()); 582 SnapshotReader reader(buffer, buffer_len,
583 Snapshot::kMessage, Isolate::Current());
631 Array& serialized_array = Array::Handle(); 584 Array& serialized_array = Array::Handle();
632 serialized_array ^= reader.ReadObject(); 585 serialized_array ^= reader.ReadObject();
633 EXPECT(array.Equals(serialized_array)); 586 EXPECT(array.Equals(serialized_array));
634 587
635 // Read object back from the snapshot into a C structure. 588 // Read object back from the snapshot into a C structure.
636 ApiNativeScope scope; 589 ApiNativeScope scope;
637 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 590 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
638 writer.BytesWritten(), 591 Dart_CObject* root = api_reader.ReadMessage();
639 &zone_allocator);
640 EXPECT_EQ(Dart_CObject::kArray, root->type); 592 EXPECT_EQ(Dart_CObject::kArray, root->type);
641 EXPECT_EQ(kArrayLength, root->value.as_array.length); 593 EXPECT_EQ(kArrayLength, root->value.as_array.length);
642 EXPECT(root->value.as_array.values == NULL); 594 EXPECT(root->value.as_array.values == NULL);
643 CheckEncodeDecodeMessage(root); 595 CheckEncodeDecodeMessage(root);
644 } 596 }
645 597
646 598
647 TEST_CASE(SerializeByteArray) { 599 TEST_CASE(SerializeByteArray) {
648 Zone zone(Isolate::Current()); 600 Zone zone(Isolate::Current());
649 601
650 // Write snapshot with object content. 602 // Write snapshot with object content.
651 uint8_t* buffer; 603 uint8_t* buffer;
652 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 604 MessageWriter writer(&buffer, &zone_allocator);
653 const int kByteArrayLength = 256; 605 const int kByteArrayLength = 256;
654 Uint8Array& byte_array = 606 Uint8Array& byte_array =
655 Uint8Array::Handle(Uint8Array::New(kByteArrayLength)); 607 Uint8Array::Handle(Uint8Array::New(kByteArrayLength));
656 for (int i = 0; i < kByteArrayLength; i++) { 608 for (int i = 0; i < kByteArrayLength; i++) {
657 byte_array.SetAt(i, i); 609 byte_array.SetAt(i, i);
658 } 610 }
659 writer.WriteObject(byte_array.raw()); 611 writer.WriteMessage(byte_array);
660 writer.FinalizeBuffer(); 612 intptr_t buffer_len = writer.BytesWritten();
661
662 // Create a snapshot object using the buffer.
663 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
664 613
665 // Read object back from the snapshot. 614 // Read object back from the snapshot.
666 SnapshotReader reader(snapshot, Isolate::Current()); 615 SnapshotReader reader(buffer, buffer_len,
616 Snapshot::kMessage, Isolate::Current());
667 ByteArray& serialized_byte_array = ByteArray::Handle(); 617 ByteArray& serialized_byte_array = ByteArray::Handle();
668 serialized_byte_array ^= reader.ReadObject(); 618 serialized_byte_array ^= reader.ReadObject();
669 EXPECT(serialized_byte_array.IsByteArray()); 619 EXPECT(serialized_byte_array.IsByteArray());
670 620
671 // Read object back from the snapshot into a C structure. 621 // Read object back from the snapshot into a C structure.
672 ApiNativeScope scope; 622 ApiNativeScope scope;
673 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 623 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
674 writer.BytesWritten(), 624 Dart_CObject* root = api_reader.ReadMessage();
675 &zone_allocator);
676 EXPECT_EQ(Dart_CObject::kUint8Array, root->type); 625 EXPECT_EQ(Dart_CObject::kUint8Array, root->type);
677 EXPECT_EQ(kByteArrayLength, root->value.as_byte_array.length); 626 EXPECT_EQ(kByteArrayLength, root->value.as_byte_array.length);
678 for (int i = 0; i < kByteArrayLength; i++) { 627 for (int i = 0; i < kByteArrayLength; i++) {
679 EXPECT(root->value.as_byte_array.values[i] == i); 628 EXPECT(root->value.as_byte_array.values[i] == i);
680 } 629 }
681 CheckEncodeDecodeMessage(root); 630 CheckEncodeDecodeMessage(root);
682 } 631 }
683 632
684 633
685 TEST_CASE(SerializeEmptyByteArray) { 634 TEST_CASE(SerializeEmptyByteArray) {
686 Zone zone(Isolate::Current()); 635 Zone zone(Isolate::Current());
687 636
688 // Write snapshot with object content. 637 // Write snapshot with object content.
689 uint8_t* buffer; 638 uint8_t* buffer;
690 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 639 MessageWriter writer(&buffer, &zone_allocator);
691 const int kByteArrayLength = 0; 640 const int kByteArrayLength = 0;
692 Uint8Array& byte_array = 641 Uint8Array& byte_array =
693 Uint8Array::Handle(Uint8Array::New(kByteArrayLength)); 642 Uint8Array::Handle(Uint8Array::New(kByteArrayLength));
694 writer.WriteObject(byte_array.raw()); 643 writer.WriteMessage(byte_array);
695 writer.FinalizeBuffer(); 644 intptr_t buffer_len = writer.BytesWritten();
696
697 // Create a snapshot object using the buffer.
698 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
699 645
700 // Read object back from the snapshot. 646 // Read object back from the snapshot.
701 SnapshotReader reader(snapshot, Isolate::Current()); 647 SnapshotReader reader(buffer, buffer_len,
648 Snapshot::kMessage, Isolate::Current());
702 ByteArray& serialized_byte_array = ByteArray::Handle(); 649 ByteArray& serialized_byte_array = ByteArray::Handle();
703 serialized_byte_array ^= reader.ReadObject(); 650 serialized_byte_array ^= reader.ReadObject();
704 EXPECT(serialized_byte_array.IsByteArray()); 651 EXPECT(serialized_byte_array.IsByteArray());
705 652
706 // Read object back from the snapshot into a C structure. 653 // Read object back from the snapshot into a C structure.
707 ApiNativeScope scope; 654 ApiNativeScope scope;
708 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 655 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
709 writer.BytesWritten(), 656 Dart_CObject* root = api_reader.ReadMessage();
710 &zone_allocator);
711 EXPECT_EQ(Dart_CObject::kUint8Array, root->type); 657 EXPECT_EQ(Dart_CObject::kUint8Array, root->type);
712 EXPECT_EQ(kByteArrayLength, root->value.as_byte_array.length); 658 EXPECT_EQ(kByteArrayLength, root->value.as_byte_array.length);
713 EXPECT(root->value.as_byte_array.values == NULL); 659 EXPECT(root->value.as_byte_array.values == NULL);
714 CheckEncodeDecodeMessage(root); 660 CheckEncodeDecodeMessage(root);
715 } 661 }
716 662
717 663
664 class TestSnapshotWriter : public SnapshotWriter {
665 public:
666 TestSnapshotWriter(uint8_t** buffer, ReAlloc alloc)
667 : SnapshotWriter(Snapshot::kScript, buffer, alloc) {
668 ASSERT(buffer != NULL);
669 ASSERT(alloc != NULL);
670 }
671 ~TestSnapshotWriter() { }
672
673 // Writes just a script object
674 void WriteScript(const Script& script) {
675 WriteObject(script.raw());
676 UnmarkAll();
677 }
678
679 private:
680 DISALLOW_COPY_AND_ASSIGN(TestSnapshotWriter);
681 };
682
683
718 TEST_CASE(SerializeScript) { 684 TEST_CASE(SerializeScript) {
719 const char* kScriptChars = 685 const char* kScriptChars =
720 "class A {\n" 686 "class A {\n"
721 " static bar() { return 42; }\n" 687 " static bar() { return 42; }\n"
722 " static fly() { return 5; }\n" 688 " static fly() { return 5; }\n"
723 " static s1() { return 'this is a string in the source'; }\n" 689 " static s1() { return 'this is a string in the source'; }\n"
724 " static s2() { return 'this is a \"string\" in the source'; }\n" 690 " static s2() { return 'this is a \"string\" in the source'; }\n"
725 " static s3() { return 'this is a \\\'string\\\' in \"the\" source'; }\n" 691 " static s3() { return 'this is a \\\'string\\\' in \"the\" source'; }\n"
726 " static s4() { return 'this \"is\" a \"string\" in \"the\" source'; }\n" 692 " static s4() { return 'this \"is\" a \"string\" in \"the\" source'; }\n"
727 "}\n"; 693 "}\n";
728 694
729 String& url = String::Handle(String::New("dart-test:SerializeScript")); 695 String& url = String::Handle(String::New("dart-test:SerializeScript"));
730 String& source = String::Handle(String::New(kScriptChars)); 696 String& source = String::Handle(String::New(kScriptChars));
731 Script& script = Script::Handle(Script::New(url, 697 Script& script = Script::Handle(Script::New(url,
732 source, 698 source,
733 RawScript::kSourceTag)); 699 RawScript::kSourceTag));
734 const String& lib_url = String::Handle(Symbols::New("TestLib")); 700 const String& lib_url = String::Handle(Symbols::New("TestLib"));
735 Library& lib = Library::Handle(Library::New(lib_url)); 701 Library& lib = Library::Handle(Library::New(lib_url));
736 lib.Register(); 702 lib.Register();
737 EXPECT(CompilerTest::TestCompileScript(lib, script)); 703 EXPECT(CompilerTest::TestCompileScript(lib, script));
738 704
739 // Write snapshot with object content. 705 // Write snapshot with script content.
740 uint8_t* buffer; 706 uint8_t* buffer;
741 SnapshotWriter writer(Snapshot::kScript, &buffer, &malloc_allocator); 707 TestSnapshotWriter writer(&buffer, &malloc_allocator);
742 writer.WriteObject(script.raw()); 708 writer.WriteScript(script);
743 writer.FinalizeBuffer();
744
745 // Create a snapshot object using the buffer.
746 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
747 709
748 // Read object back from the snapshot. 710 // Read object back from the snapshot.
749 SnapshotReader reader(snapshot, Isolate::Current()); 711 SnapshotReader reader(buffer, writer.BytesWritten(),
712 Snapshot::kScript, Isolate::Current());
750 Script& serialized_script = Script::Handle(); 713 Script& serialized_script = Script::Handle();
751 serialized_script ^= reader.ReadObject(); 714 serialized_script ^= reader.ReadObject();
752 715
753 // Check if the serialized script object matches the original script. 716 // Check if the serialized script object matches the original script.
754 String& expected_literal = String::Handle(); 717 String& expected_literal = String::Handle();
755 String& actual_literal = String::Handle(); 718 String& actual_literal = String::Handle();
756 String& str = String::Handle(); 719 String& str = String::Handle();
757 str ^= serialized_script.url(); 720 str ^= serialized_script.url();
758 EXPECT(url.Equals(str)); 721 EXPECT(url.Equals(str));
759 722
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
836 799
837 // Create a test library and Load up a test script in it. 800 // Create a test library and Load up a test script in it.
838 TestCase::LoadTestScript(kScriptChars, NULL); 801 TestCase::LoadTestScript(kScriptChars, NULL);
839 timer1.Stop(); 802 timer1.Stop();
840 OS::PrintErr("Without Snapshot: %dus\n", timer1.TotalElapsedTime()); 803 OS::PrintErr("Without Snapshot: %dus\n", timer1.TotalElapsedTime());
841 804
842 // Write snapshot with object content. 805 // Write snapshot with object content.
843 Isolate* isolate = Isolate::Current(); 806 Isolate* isolate = Isolate::Current();
844 Zone zone(isolate); 807 Zone zone(isolate);
845 HandleScope scope(isolate); 808 HandleScope scope(isolate);
846 SnapshotWriter writer(Snapshot::kFull, &buffer, &malloc_allocator); 809 FullSnapshotWriter writer(&buffer, &malloc_allocator);
847 writer.WriteFullSnapshot(); 810 writer.WriteFullSnapshot();
848 } 811 }
849 812
850 // Now Create another isolate using the snapshot and execute a method 813 // Now Create another isolate using the snapshot and execute a method
851 // from the script. 814 // from the script.
852 Timer timer2(true, "Snapshot_test"); 815 Timer timer2(true, "Snapshot_test");
853 timer2.Start(); 816 timer2.Start();
854 TestCase::CreateTestIsolateFromSnapshot(buffer); 817 TestCase::CreateTestIsolateFromSnapshot(buffer);
855 { 818 {
856 Dart_EnterScope(); // Start a Dart API scope for invoking API functions. 819 Dart_EnterScope(); // Start a Dart API scope for invoking API functions.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
890 Zone zone(isolate); 853 Zone zone(isolate);
891 HandleScope scope(isolate); 854 HandleScope scope(isolate);
892 855
893 // Create a test library and Load up a test script in it. 856 // Create a test library and Load up a test script in it.
894 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 857 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
895 ClassFinalizer::FinalizePendingClasses(); 858 ClassFinalizer::FinalizePendingClasses();
896 timer1.Stop(); 859 timer1.Stop();
897 OS::PrintErr("Without Snapshot: %dus\n", timer1.TotalElapsedTime()); 860 OS::PrintErr("Without Snapshot: %dus\n", timer1.TotalElapsedTime());
898 861
899 // Write snapshot with object content. 862 // Write snapshot with object content.
900 SnapshotWriter writer(Snapshot::kFull, &buffer, &malloc_allocator); 863 FullSnapshotWriter writer(&buffer, &malloc_allocator);
901 writer.WriteFullSnapshot(); 864 writer.WriteFullSnapshot();
902 865
903 // Invoke a function which returns an object. 866 // Invoke a function which returns an object.
904 Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("FieldsTest")); 867 Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("FieldsTest"));
905 Dart_Handle result = Dart_Invoke(cls, Dart_NewString("testMain"), 0, NULL); 868 Dart_Handle result = Dart_Invoke(cls, Dart_NewString("testMain"), 0, NULL);
906 EXPECT_VALID(result); 869 EXPECT_VALID(result);
907 } 870 }
908 871
909 // Now Create another isolate using the snapshot and execute a method 872 // Now Create another isolate using the snapshot and execute a method
910 // from the script. 873 // from the script.
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1057 uint8_t* buffer = NULL; 1020 uint8_t* buffer = NULL;
1058 ApiMessageWriter writer(&buffer, &zone_allocator); 1021 ApiMessageWriter writer(&buffer, &zone_allocator);
1059 1022
1060 static const int kArrayLength = 2; 1023 static const int kArrayLength = 2;
1061 intptr_t data[kArrayLength] = {1, 2}; 1024 intptr_t data[kArrayLength] = {1, 2};
1062 int len = kArrayLength; 1025 int len = kArrayLength;
1063 writer.WriteMessage(len, data); 1026 writer.WriteMessage(len, data);
1064 1027
1065 // Read object back from the snapshot into a C structure. 1028 // Read object back from the snapshot into a C structure.
1066 ApiNativeScope scope; 1029 ApiNativeScope scope;
1067 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 1030 ApiMessageReader api_reader(buffer, writer.BytesWritten(), &zone_allocator);
1068 writer.BytesWritten(), 1031 Dart_CObject* root = api_reader.ReadMessage();
1069 &zone_allocator);
1070 EXPECT_EQ(Dart_CObject::kArray, root->type); 1032 EXPECT_EQ(Dart_CObject::kArray, root->type);
1071 EXPECT_EQ(kArrayLength, root->value.as_array.length); 1033 EXPECT_EQ(kArrayLength, root->value.as_array.length);
1072 for (int i = 0; i < kArrayLength; i++) { 1034 for (int i = 0; i < kArrayLength; i++) {
1073 Dart_CObject* element = root->value.as_array.values[i]; 1035 Dart_CObject* element = root->value.as_array.values[i];
1074 EXPECT_EQ(Dart_CObject::kInt32, element->type); 1036 EXPECT_EQ(Dart_CObject::kInt32, element->type);
1075 EXPECT_EQ(i + 1, element->value.as_int32); 1037 EXPECT_EQ(i + 1, element->value.as_int32);
1076 } 1038 }
1077 CheckEncodeDecodeMessage(root); 1039 CheckEncodeDecodeMessage(root);
1078 } 1040 }
1079 1041
1080 1042
1081 // Helper function to call a top level Dart function, serialize the 1043 // Helper function to call a top level Dart function, serialize the
1082 // result and deserialize the result into a Dart_CObject structure. 1044 // result and deserialize the result into a Dart_CObject structure.
1083 static Dart_CObject* GetDeserializedDartMessage(Dart_Handle lib, 1045 static Dart_CObject* GetDeserializedDartMessage(Dart_Handle lib,
1084 const char* dart_function) { 1046 const char* dart_function) {
1085 Dart_Handle result; 1047 Dart_Handle result;
1086 result = Dart_Invoke(lib, Dart_NewString(dart_function), 0, NULL); 1048 result = Dart_Invoke(lib, Dart_NewString(dart_function), 0, NULL);
1087 EXPECT_VALID(result); 1049 EXPECT_VALID(result);
1088 1050
1089 // Serialize the list into a message. 1051 // Serialize the list into a message.
1090 uint8_t* buffer; 1052 uint8_t* buffer;
1091 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 1053 MessageWriter writer(&buffer, &zone_allocator);
1092 const Object& list = Object::Handle(Api::UnwrapHandle(result)); 1054 const Object& list = Object::Handle(Api::UnwrapHandle(result));
1093 writer.WriteObject(list.raw()); 1055 writer.WriteMessage(list);
1094 writer.FinalizeBuffer(); 1056 intptr_t buffer_len = writer.BytesWritten();
1095 1057
1096 // Read object back from the snapshot into a C structure. 1058 // Read object back from the snapshot into a C structure.
1097 return DecodeMessage(buffer + Snapshot::kHeaderSize, 1059 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
1098 writer.BytesWritten(), 1060 return api_reader.ReadMessage();
1099 &zone_allocator);
1100 } 1061 }
1101 1062
1102 1063
1103 UNIT_TEST_CASE(DartGeneratedMessages) { 1064 UNIT_TEST_CASE(DartGeneratedMessages) {
1104 static const char* kCustomIsolateScriptChars = 1065 static const char* kCustomIsolateScriptChars =
1105 "getSmi() {\n" 1066 "getSmi() {\n"
1106 " return 42;\n" 1067 " return 42;\n"
1107 "}\n" 1068 "}\n"
1108 "getBigint() {\n" 1069 "getBigint() {\n"
1109 " return -0x424242424242424242424242424242424242;\n" 1070 " return -0x424242424242424242424242424242424242;\n"
(...skipping 23 matching lines...) Expand all
1133 string_result = Dart_Invoke(lib, Dart_NewString("getString"), 0, NULL); 1094 string_result = Dart_Invoke(lib, Dart_NewString("getString"), 0, NULL);
1134 EXPECT_VALID(string_result); 1095 EXPECT_VALID(string_result);
1135 EXPECT(Dart_IsString(string_result)); 1096 EXPECT(Dart_IsString(string_result));
1136 1097
1137 { 1098 {
1138 DARTSCOPE_NOCHECKS(isolate); 1099 DARTSCOPE_NOCHECKS(isolate);
1139 1100
1140 { 1101 {
1141 Zone zone(Isolate::Current()); 1102 Zone zone(Isolate::Current());
1142 uint8_t* buffer; 1103 uint8_t* buffer;
1143 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 1104 MessageWriter writer(&buffer, &zone_allocator);
1144 Smi& smi = Smi::Handle(); 1105 Smi& smi = Smi::Handle();
1145 smi ^= Api::UnwrapHandle(smi_result); 1106 smi ^= Api::UnwrapHandle(smi_result);
1146 writer.WriteObject(smi.raw()); 1107 writer.WriteMessage(smi);
1147 writer.FinalizeBuffer(); 1108 intptr_t buffer_len = writer.BytesWritten();
1148 1109
1149 // Read object back from the snapshot into a C structure. 1110 // Read object back from the snapshot into a C structure.
1150 ApiNativeScope scope; 1111 ApiNativeScope scope;
1151 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 1112 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
1152 writer.BytesWritten(), 1113 Dart_CObject* root = api_reader.ReadMessage();
1153 &zone_allocator);
1154 EXPECT_NOTNULL(root); 1114 EXPECT_NOTNULL(root);
1155 EXPECT_EQ(Dart_CObject::kInt32, root->type); 1115 EXPECT_EQ(Dart_CObject::kInt32, root->type);
1156 EXPECT_EQ(42, root->value.as_int32); 1116 EXPECT_EQ(42, root->value.as_int32);
1157 CheckEncodeDecodeMessage(root); 1117 CheckEncodeDecodeMessage(root);
1158 } 1118 }
1159 { 1119 {
1160 Zone zone(Isolate::Current()); 1120 Zone zone(Isolate::Current());
1161 uint8_t* buffer; 1121 uint8_t* buffer;
1162 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 1122 MessageWriter writer(&buffer, &zone_allocator);
1163 Bigint& bigint = Bigint::Handle(); 1123 Bigint& bigint = Bigint::Handle();
1164 bigint ^= Api::UnwrapHandle(bigint_result); 1124 bigint ^= Api::UnwrapHandle(bigint_result);
1165 writer.WriteObject(bigint.raw()); 1125 writer.WriteMessage(bigint);
1166 writer.FinalizeBuffer(); 1126 intptr_t buffer_len = writer.BytesWritten();
1167 1127
1168 // Read object back from the snapshot into a C structure. 1128 // Read object back from the snapshot into a C structure.
1169 ApiNativeScope scope; 1129 ApiNativeScope scope;
1170 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 1130 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
1171 writer.BytesWritten(), 1131 Dart_CObject* root = api_reader.ReadMessage();
1172 &zone_allocator);
1173 EXPECT_NOTNULL(root); 1132 EXPECT_NOTNULL(root);
1174 EXPECT_EQ(Dart_CObject::kBigint, root->type); 1133 EXPECT_EQ(Dart_CObject::kBigint, root->type);
1175 EXPECT_STREQ("-424242424242424242424242424242424242", 1134 EXPECT_STREQ("-424242424242424242424242424242424242",
1176 root->value.as_bigint); 1135 root->value.as_bigint);
1177 CheckEncodeDecodeMessage(root); 1136 CheckEncodeDecodeMessage(root);
1178 } 1137 }
1179 { 1138 {
1180 Zone zone(Isolate::Current()); 1139 Zone zone(Isolate::Current());
1181 uint8_t* buffer; 1140 uint8_t* buffer;
1182 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); 1141 MessageWriter writer(&buffer, &zone_allocator);
1183 String& str = String::Handle(); 1142 String& str = String::Handle();
1184 str ^= Api::UnwrapHandle(string_result); 1143 str ^= Api::UnwrapHandle(string_result);
1185 writer.WriteObject(str.raw()); 1144 writer.WriteMessage(str);
1186 writer.FinalizeBuffer(); 1145 intptr_t buffer_len = writer.BytesWritten();
1187 1146
1188 // Read object back from the snapshot into a C structure. 1147 // Read object back from the snapshot into a C structure.
1189 ApiNativeScope scope; 1148 ApiNativeScope scope;
1190 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, 1149 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
1191 writer.BytesWritten(), 1150 Dart_CObject* root = api_reader.ReadMessage();
1192 &zone_allocator);
1193 EXPECT_NOTNULL(root); 1151 EXPECT_NOTNULL(root);
1194 EXPECT_EQ(Dart_CObject::kString, root->type); 1152 EXPECT_EQ(Dart_CObject::kString, root->type);
1195 EXPECT_STREQ("Hello, world!", root->value.as_string); 1153 EXPECT_STREQ("Hello, world!", root->value.as_string);
1196 CheckEncodeDecodeMessage(root); 1154 CheckEncodeDecodeMessage(root);
1197 } 1155 }
1198 } 1156 }
1199 Dart_ExitScope(); 1157 Dart_ExitScope();
1200 Dart_ShutdownIsolate(); 1158 Dart_ShutdownIsolate();
1201 } 1159 }
1202 1160
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
1562 EXPECT(Dart_ErrorHasException(result)); 1520 EXPECT(Dart_ErrorHasException(result));
1563 EXPECT_SUBSTRING("Exception: nulltruefalse1234563.14[]100123456789\n", 1521 EXPECT_SUBSTRING("Exception: nulltruefalse1234563.14[]100123456789\n",
1564 Dart_GetError(result)); 1522 Dart_GetError(result));
1565 1523
1566 Dart_ExitScope(); 1524 Dart_ExitScope();
1567 } 1525 }
1568 1526
1569 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). 1527 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64).
1570 1528
1571 } // namespace dart 1529 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/snapshot.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698