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

Side by Side Diff: vm/snapshot.h

Issue 10535066: 1. Remove recursion during snapshot writing and reading (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « vm/raw_object_snapshot.cc ('k') | vm/snapshot.cc » ('j') | 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 #ifndef VM_SNAPSHOT_H_ 5 #ifndef VM_SNAPSHOT_H_
6 #define VM_SNAPSHOT_H_ 6 #define VM_SNAPSHOT_H_
7 7
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/allocation.h" 9 #include "vm/allocation.h"
10 #include "vm/bitfield.h" 10 #include "vm/bitfield.h"
11 #include "vm/globals.h" 11 #include "vm/globals.h"
12 #include "vm/growable_array.h" 12 #include "vm/growable_array.h"
13 #include "vm/isolate.h" 13 #include "vm/isolate.h"
14 #include "vm/visitor.h" 14 #include "vm/visitor.h"
15 15
16 namespace dart { 16 namespace dart {
17 17
18 // Forward declarations. 18 // Forward declarations.
19 class AbstractType; 19 class AbstractType;
20 class AbstractTypeArguments; 20 class AbstractTypeArguments;
21 class Array;
21 class Class; 22 class Class;
22 class Heap; 23 class Heap;
23 class Library; 24 class Library;
24 class Object; 25 class Object;
25 class ObjectStore; 26 class ObjectStore;
27 class RawAbstractTypeArguments;
26 class RawArray; 28 class RawArray;
27 class RawBigint; 29 class RawBigint;
28 class RawClass; 30 class RawClass;
29 class RawContext; 31 class RawContext;
30 class RawDouble; 32 class RawDouble;
31 class RawField; 33 class RawField;
32 class RawFourByteString; 34 class RawFourByteString;
33 class RawFunction; 35 class RawFunction;
34 class RawGrowableObjectArray; 36 class RawGrowableObjectArray;
35 class RawImmutableArray; 37 class RawImmutableArray;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 kHeaderTagBits> { 79 kHeaderTagBits> {
78 }; 80 };
79 81
80 82
81 class SerializedHeaderData : public BitField<intptr_t, 83 class SerializedHeaderData : public BitField<intptr_t,
82 kHeaderTagBits, 84 kHeaderTagBits,
83 kObjectIdTagBits> { 85 kObjectIdTagBits> {
84 }; 86 };
85 87
86 88
89 enum DeserializeState {
90 kIsDeserialized = 0,
91 kIsNotDeserialized = 1,
92 };
93
94
95 enum SerializeState {
96 kIsSerialized = 0,
97 kIsNotSerialized = 1,
98 };
99
100
87 // Structure capturing the raw snapshot. 101 // Structure capturing the raw snapshot.
88 class Snapshot { 102 class Snapshot {
89 public: 103 public:
90 enum Kind { 104 enum Kind {
91 kFull = 0, // Full snapshot of the current dart heap. 105 kFull = 0, // Full snapshot of the current dart heap.
92 kScript, // A partial snapshot of only the application script. 106 kScript, // A partial snapshot of only the application script.
93 kMessage, // A partial snapshot used only for isolate messaging. 107 kMessage, // A partial snapshot used only for isolate messaging.
94 }; 108 };
95 109
96 static const int kHeaderSize = 2 * sizeof(int32_t); 110 static const int kHeaderSize = 2 * sizeof(int32_t);
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 Heap* heap() const { return isolate_->heap(); } 362 Heap* heap() const { return isolate_->heap(); }
349 ObjectStore* object_store() const { return isolate_->object_store(); } 363 ObjectStore* object_store() const { return isolate_->object_store(); }
350 Object* ObjectHandle() { return &obj_; } 364 Object* ObjectHandle() { return &obj_; }
351 String* StringHandle() { return &str_; } 365 String* StringHandle() { return &str_; }
352 AbstractType* TypeHandle() { return &type_; } 366 AbstractType* TypeHandle() { return &type_; }
353 AbstractTypeArguments* TypeArgumentsHandle() { return &type_arguments_; } 367 AbstractTypeArguments* TypeArgumentsHandle() { return &type_arguments_; }
354 368
355 // Reads an object. 369 // Reads an object.
356 RawObject* ReadObject(); 370 RawObject* ReadObject();
357 371
358 RawClass* ReadClassId(intptr_t object_id); 372 // Add object to backward references.
373 void AddBackRef(intptr_t id, Object* obj, DeserializeState state);
359 374
360 // Add object to backward references. 375 // Get an object from the backward references list.
361 void AddBackwardReference(intptr_t id, Object* obj); 376 Object* GetBackRef(intptr_t id);
362 377
363 // Read a full snap shot. 378 // Read a full snap shot.
364 void ReadFullSnapshot(); 379 void ReadFullSnapshot();
365 380
366 // Helper functions for creating uninitialized versions 381 // Helper functions for creating uninitialized versions
367 // of various object types. These are used when reading a 382 // of various object types. These are used when reading a
368 // full snapshot. 383 // full snapshot.
369 RawArray* NewArray(intptr_t len); 384 RawArray* NewArray(intptr_t len);
370 RawImmutableArray* NewImmutableArray(intptr_t len); 385 RawImmutableArray* NewImmutableArray(intptr_t len);
371 RawOneByteString* NewOneByteString(intptr_t len); 386 RawOneByteString* NewOneByteString(intptr_t len);
(...skipping 11 matching lines...) Expand all
383 RawTypeParameter* NewTypeParameter(); 398 RawTypeParameter* NewTypeParameter();
384 RawFunction* NewFunction(); 399 RawFunction* NewFunction();
385 RawField* NewField(); 400 RawField* NewField();
386 RawLibrary* NewLibrary(); 401 RawLibrary* NewLibrary();
387 RawLibraryPrefix* NewLibraryPrefix(); 402 RawLibraryPrefix* NewLibraryPrefix();
388 RawScript* NewScript(); 403 RawScript* NewScript();
389 RawLiteralToken* NewLiteralToken(); 404 RawLiteralToken* NewLiteralToken();
390 RawGrowableObjectArray* NewGrowableObjectArray(); 405 RawGrowableObjectArray* NewGrowableObjectArray();
391 406
392 private: 407 private:
408 class BackRefNode : public ZoneAllocated {
409 public:
410 BackRefNode(Object* reference, DeserializeState state)
411 : reference_(reference), state_(state) {}
412 Object* reference() const { return reference_; }
413 bool is_deserialized() const { return state_ == kIsDeserialized; }
414 void set_state(DeserializeState state) { state_ = state; }
415
416 private:
417 Object* reference_;
418 DeserializeState state_;
419
420 DISALLOW_COPY_AND_ASSIGN(BackRefNode);
421 };
422
393 // Allocate uninitialized objects, this is used when reading a full snapshot. 423 // Allocate uninitialized objects, this is used when reading a full snapshot.
394 RawObject* AllocateUninitialized(const Class& cls, intptr_t size); 424 RawObject* AllocateUninitialized(const Class& cls, intptr_t size);
395 425
396 // Internal implementation of ReadObject once the header value is read. 426 RawClass* ReadClassId(intptr_t object_id);
427 RawObject* ReadObjectImpl();
397 RawObject* ReadObjectImpl(intptr_t header); 428 RawObject* ReadObjectImpl(intptr_t header);
429 RawObject* ReadObjectRef();
398 430
399 // Read an object that was serialized as an Id (singleton, object store, 431 // Read an object that was serialized as an Id (singleton, object store,
400 // or an object that was already serialized before). 432 // or an object that was already serialized before).
401 RawObject* ReadIndexedObject(intptr_t object_id); 433 RawObject* ReadIndexedObject(intptr_t object_id);
402 434
403 // Read an inlined object from the stream. 435 // Read an inlined object from the stream.
404 RawObject* ReadInlinedObject(intptr_t object_id); 436 RawObject* ReadInlinedObject(intptr_t object_id);
405 437
406 // Based on header field check to see if it is an internal VM class. 438 // Based on header field check to see if it is an internal VM class.
407 RawClass* LookupInternalClass(intptr_t class_header); 439 RawClass* LookupInternalClass(intptr_t class_header);
408 440
441 void ArrayReadFrom(const Array& result, intptr_t len, intptr_t tags);
442
409 Snapshot::Kind kind_; // Indicates type of snapshot(full, script, message). 443 Snapshot::Kind kind_; // Indicates type of snapshot(full, script, message).
410 Isolate* isolate_; // Current isolate. 444 Isolate* isolate_; // Current isolate.
411 Class& cls_; // Temporary Class handle. 445 Class& cls_; // Temporary Class handle.
412 Object& obj_; // Temporary Object handle. 446 Object& obj_; // Temporary Object handle.
413 String& str_; // Temporary String handle. 447 String& str_; // Temporary String handle.
414 Library& library_; // Temporary library handle. 448 Library& library_; // Temporary library handle.
415 AbstractType& type_; // Temporary type handle. 449 AbstractType& type_; // Temporary type handle.
416 AbstractTypeArguments& type_arguments_; // Temporary type argument handle. 450 AbstractTypeArguments& type_arguments_; // Temporary type argument handle.
417 GrowableArray<Object*> backward_references_; 451 GrowableArray<BackRefNode*> backward_references_;
418 452
453 friend class Array;
454 friend class Class;
455 friend class Context;
456 friend class ContextScope;
457 friend class Field;
458 friend class Function;
459 friend class GrowableObjectArray;
460 friend class ImmutableArray;
461 friend class InstantiatedTypeArguments;
462 friend class JSRegExp;
463 friend class Library;
464 friend class LibraryPrefix;
465 friend class LiteralToken;
466 friend class Script;
467 friend class TokenStream;
468 friend class Type;
469 friend class TypeArguments;
470 friend class TypeParameter;
471 friend class UnresolvedClass;
419 DISALLOW_COPY_AND_ASSIGN(SnapshotReader); 472 DISALLOW_COPY_AND_ASSIGN(SnapshotReader);
420 }; 473 };
421 474
422 475
423 class BaseWriter { 476 class BaseWriter {
424 public: 477 public:
425 // Size of the snapshot. 478 // Size of the snapshot.
426 intptr_t BytesWritten() const { return stream_.bytes_written(); } 479 intptr_t BytesWritten() const { return stream_.bytes_written(); }
427 480
428 // Writes raw data to the stream (basic type). 481 // Writes raw data to the stream (basic type).
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 // which comprises of a flag(full/partial snaphot) and the length of 554 // which comprises of a flag(full/partial snaphot) and the length of
502 // serialzed bytes. 555 // serialzed bytes.
503 void FinalizeBuffer() { 556 void FinalizeBuffer() {
504 BaseWriter::FinalizeBuffer(kind_); 557 BaseWriter::FinalizeBuffer(kind_);
505 UnmarkAll(); 558 UnmarkAll();
506 } 559 }
507 560
508 // Serialize an object into the buffer. 561 // Serialize an object into the buffer.
509 void WriteObject(RawObject* raw); 562 void WriteObject(RawObject* raw);
510 563
511 void WriteClassId(RawClass* cls);
512
513 // Unmark all objects that were marked as forwarded for serializing.
514 void UnmarkAll();
515
516 // Writes a full snapshot of the Isolate. 564 // Writes a full snapshot of the Isolate.
517 void WriteFullSnapshot(); 565 void WriteFullSnapshot();
518 566
519 uword GetObjectTags(RawObject* raw); 567 uword GetObjectTags(RawObject* raw);
520 568
521 private: 569 private:
522 class ForwardObjectNode : public ZoneAllocated { 570 class ForwardObjectNode : public ZoneAllocated {
523 public: 571 public:
524 ForwardObjectNode(RawObject* raw, uword tags) : raw_(raw), tags_(tags) {} 572 ForwardObjectNode(RawObject* raw, uword tags, SerializeState state)
573 : raw_(raw), tags_(tags), state_(state) {}
525 RawObject* raw() const { return raw_; } 574 RawObject* raw() const { return raw_; }
526 uword tags() const { return tags_; } 575 uword tags() const { return tags_; }
576 bool is_serialized() const { return state_ == kIsSerialized; }
577 void set_state(SerializeState value) { state_ = value; }
527 578
528 private: 579 private:
529 RawObject* raw_; 580 RawObject* raw_;
530 uword tags_; 581 uword tags_;
582 SerializeState state_;
531 583
532 DISALLOW_COPY_AND_ASSIGN(ForwardObjectNode); 584 DISALLOW_COPY_AND_ASSIGN(ForwardObjectNode);
533 }; 585 };
534 586
535 intptr_t MarkObject(RawObject* raw); 587 intptr_t MarkObject(RawObject* raw, SerializeState state);
588 void UnmarkAll();
536 589
537 bool CheckAndWritePredefinedObject(RawObject* raw); 590 bool CheckAndWritePredefinedObject(RawObject* raw);
538 591
592 void WriteObjectRef(RawObject* raw);
593 void WriteClassId(RawClass* cls);
594 void WriteObjectImpl(RawObject* raw);
539 void WriteInlinedObject(RawObject* raw); 595 void WriteInlinedObject(RawObject* raw);
596 void WriteForwardedObjects();
597 void ArrayWriteTo(intptr_t object_id,
598 intptr_t array_kind,
599 intptr_t tags,
600 RawSmi* length,
601 RawAbstractTypeArguments* type_arguments,
602 RawObject* data[]);
540 603
541 ObjectStore* object_store() const { return object_store_; } 604 ObjectStore* object_store() const { return object_store_; }
542 605
543 Snapshot::Kind kind_; 606 Snapshot::Kind kind_;
544 ObjectStore* object_store_; // Object store for common classes. 607 ObjectStore* object_store_; // Object store for common classes.
545 ClassTable* class_table_; // Class table for the class index to class lookup. 608 ClassTable* class_table_; // Class table for the class index to class lookup.
546 GrowableArray<ForwardObjectNode*> forward_list_; 609 GrowableArray<ForwardObjectNode*> forward_list_;
547 610
611 friend class RawArray;
612 friend class RawClass;
613 friend class RawGrowableObjectArray;
614 friend class RawImmutableArray;
615 friend class RawJSRegExp;
616 friend class RawLibrary;
617 friend class RawLiteralToken;
618 friend class RawScript;
619 friend class RawTokenStream;
620 friend class RawTypeArguments;
621 friend class SnapshotWriterVisitor;
548 DISALLOW_COPY_AND_ASSIGN(SnapshotWriter); 622 DISALLOW_COPY_AND_ASSIGN(SnapshotWriter);
549 }; 623 };
550 624
551 625
552 class ScriptSnapshotWriter : public SnapshotWriter { 626 class ScriptSnapshotWriter : public SnapshotWriter {
553 public: 627 public:
554 ScriptSnapshotWriter(uint8_t** buffer, ReAlloc alloc) 628 ScriptSnapshotWriter(uint8_t** buffer, ReAlloc alloc)
555 : SnapshotWriter(Snapshot::kScript, buffer, alloc) { 629 : SnapshotWriter(Snapshot::kScript, buffer, alloc) {
556 ASSERT(buffer != NULL); 630 ASSERT(buffer != NULL);
557 ASSERT(alloc != NULL); 631 ASSERT(alloc != NULL);
558 } 632 }
559 ~ScriptSnapshotWriter() { } 633 ~ScriptSnapshotWriter() { }
560 634
561 // Writes a partial snapshot of the script. 635 // Writes a partial snapshot of the script.
562 void WriteScriptSnapshot(const Library& lib); 636 void WriteScriptSnapshot(const Library& lib);
563 637
564 private: 638 private:
565 DISALLOW_COPY_AND_ASSIGN(ScriptSnapshotWriter); 639 DISALLOW_COPY_AND_ASSIGN(ScriptSnapshotWriter);
566 }; 640 };
567 641
568 642
569 // An object pointer visitor implementation which writes out 643 // An object pointer visitor implementation which writes out
570 // objects to a snap shot. 644 // objects to a snap shot.
571 class SnapshotWriterVisitor : public ObjectPointerVisitor { 645 class SnapshotWriterVisitor : public ObjectPointerVisitor {
572 public: 646 public:
573 explicit SnapshotWriterVisitor(SnapshotWriter* writer) 647 explicit SnapshotWriterVisitor(SnapshotWriter* writer)
574 : ObjectPointerVisitor(Isolate::Current()), writer_(writer) {} 648 : ObjectPointerVisitor(Isolate::Current()),
649 writer_(writer),
650 as_references_(true) {}
651
652 SnapshotWriterVisitor(SnapshotWriter* writer, bool as_references)
653 : ObjectPointerVisitor(Isolate::Current()),
654 writer_(writer),
655 as_references_(as_references) {}
575 656
576 virtual void VisitPointers(RawObject** first, RawObject** last); 657 virtual void VisitPointers(RawObject** first, RawObject** last);
577 658
578 private: 659 private:
579 SnapshotWriter* writer_; 660 SnapshotWriter* writer_;
661 bool as_references_;
580 662
581 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor); 663 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor);
582 }; 664 };
583 665
584 } // namespace dart 666 } // namespace dart
585 667
586 #endif // VM_SNAPSHOT_H_ 668 #endif // VM_SNAPSHOT_H_
OLDNEW
« no previous file with comments | « vm/raw_object_snapshot.cc ('k') | vm/snapshot.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698