Chromium Code Reviews| 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 #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 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 348 Heap* heap() const { return isolate_->heap(); } | 350 Heap* heap() const { return isolate_->heap(); } |
| 349 ObjectStore* object_store() const { return isolate_->object_store(); } | 351 ObjectStore* object_store() const { return isolate_->object_store(); } |
| 350 Object* ObjectHandle() { return &obj_; } | 352 Object* ObjectHandle() { return &obj_; } |
| 351 String* StringHandle() { return &str_; } | 353 String* StringHandle() { return &str_; } |
| 352 AbstractType* TypeHandle() { return &type_; } | 354 AbstractType* TypeHandle() { return &type_; } |
| 353 AbstractTypeArguments* TypeArgumentsHandle() { return &type_arguments_; } | 355 AbstractTypeArguments* TypeArgumentsHandle() { return &type_arguments_; } |
| 354 | 356 |
| 355 // Reads an object. | 357 // Reads an object. |
| 356 RawObject* ReadObject(); | 358 RawObject* ReadObject(); |
| 357 | 359 |
| 358 RawClass* ReadClassId(intptr_t object_id); | 360 // Add object to backward references. |
| 361 void AddBackwardReference(intptr_t id, Object* obj, bool is_deserialized); | |
|
cshapiro
2012/06/08 22:04:39
Can we make this an enum instead of a bool?
siva
2012/06/11 20:49:06
Done.
| |
| 359 | 362 |
| 360 // Add object to backward references. | 363 // Get an object from the backward references list. |
| 361 void AddBackwardReference(intptr_t id, Object* obj); | 364 Object* GetBackwardReference(intptr_t id); |
| 362 | 365 |
| 363 // Read a full snap shot. | 366 // Read a full snap shot. |
| 364 void ReadFullSnapshot(); | 367 void ReadFullSnapshot(); |
| 365 | 368 |
| 366 // Helper functions for creating uninitialized versions | 369 // Helper functions for creating uninitialized versions |
| 367 // of various object types. These are used when reading a | 370 // of various object types. These are used when reading a |
| 368 // full snapshot. | 371 // full snapshot. |
| 369 RawArray* NewArray(intptr_t len); | 372 RawArray* NewArray(intptr_t len); |
| 370 RawImmutableArray* NewImmutableArray(intptr_t len); | 373 RawImmutableArray* NewImmutableArray(intptr_t len); |
| 371 RawOneByteString* NewOneByteString(intptr_t len); | 374 RawOneByteString* NewOneByteString(intptr_t len); |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 383 RawTypeParameter* NewTypeParameter(); | 386 RawTypeParameter* NewTypeParameter(); |
| 384 RawFunction* NewFunction(); | 387 RawFunction* NewFunction(); |
| 385 RawField* NewField(); | 388 RawField* NewField(); |
| 386 RawLibrary* NewLibrary(); | 389 RawLibrary* NewLibrary(); |
| 387 RawLibraryPrefix* NewLibraryPrefix(); | 390 RawLibraryPrefix* NewLibraryPrefix(); |
| 388 RawScript* NewScript(); | 391 RawScript* NewScript(); |
| 389 RawLiteralToken* NewLiteralToken(); | 392 RawLiteralToken* NewLiteralToken(); |
| 390 RawGrowableObjectArray* NewGrowableObjectArray(); | 393 RawGrowableObjectArray* NewGrowableObjectArray(); |
| 391 | 394 |
| 392 private: | 395 private: |
| 396 class BackwardReferenceNode : public ZoneAllocated { | |
| 397 public: | |
| 398 BackwardReferenceNode(Object* reference, bool is_deserialized) | |
|
cshapiro
2012/06/08 22:04:39
same here
siva
2012/06/11 20:49:06
Done.
| |
| 399 : reference_(reference), is_deserialized_(is_deserialized) {} | |
| 400 Object* reference() const { return reference_; } | |
| 401 bool is_deserialized() const { return is_deserialized_; } | |
| 402 void set_is_deserialized(bool value) { is_deserialized_ = value; } | |
| 403 | |
| 404 private: | |
| 405 Object* reference_; | |
| 406 bool is_deserialized_; | |
| 407 | |
| 408 DISALLOW_COPY_AND_ASSIGN(BackwardReferenceNode); | |
| 409 }; | |
| 410 | |
| 393 // Allocate uninitialized objects, this is used when reading a full snapshot. | 411 // Allocate uninitialized objects, this is used when reading a full snapshot. |
| 394 RawObject* AllocateUninitialized(const Class& cls, intptr_t size); | 412 RawObject* AllocateUninitialized(const Class& cls, intptr_t size); |
| 395 | 413 |
| 396 // Internal implementation of ReadObject once the header value is read. | 414 RawClass* ReadClassId(intptr_t object_id); |
| 415 RawObject* ReadObjectImpl(); | |
| 397 RawObject* ReadObjectImpl(intptr_t header); | 416 RawObject* ReadObjectImpl(intptr_t header); |
| 417 RawObject* ReadObjectRef(); | |
| 398 | 418 |
| 399 // Read an object that was serialized as an Id (singleton, object store, | 419 // Read an object that was serialized as an Id (singleton, object store, |
| 400 // or an object that was already serialized before). | 420 // or an object that was already serialized before). |
| 401 RawObject* ReadIndexedObject(intptr_t object_id); | 421 RawObject* ReadIndexedObject(intptr_t object_id); |
| 402 | 422 |
| 403 // Read an inlined object from the stream. | 423 // Read an inlined object from the stream. |
| 404 RawObject* ReadInlinedObject(intptr_t object_id); | 424 RawObject* ReadInlinedObject(intptr_t object_id); |
| 405 | 425 |
| 406 // Based on header field check to see if it is an internal VM class. | 426 // Based on header field check to see if it is an internal VM class. |
| 407 RawClass* LookupInternalClass(intptr_t class_header); | 427 RawClass* LookupInternalClass(intptr_t class_header); |
| 408 | 428 |
| 429 void ArrayReadFrom(const Array& result, intptr_t len, intptr_t tags); | |
| 430 | |
| 409 Snapshot::Kind kind_; // Indicates type of snapshot(full, script, message). | 431 Snapshot::Kind kind_; // Indicates type of snapshot(full, script, message). |
| 410 Isolate* isolate_; // Current isolate. | 432 Isolate* isolate_; // Current isolate. |
| 411 Class& cls_; // Temporary Class handle. | 433 Class& cls_; // Temporary Class handle. |
| 412 Object& obj_; // Temporary Object handle. | 434 Object& obj_; // Temporary Object handle. |
| 413 String& str_; // Temporary String handle. | 435 String& str_; // Temporary String handle. |
| 414 Library& library_; // Temporary library handle. | 436 Library& library_; // Temporary library handle. |
| 415 AbstractType& type_; // Temporary type handle. | 437 AbstractType& type_; // Temporary type handle. |
| 416 AbstractTypeArguments& type_arguments_; // Temporary type argument handle. | 438 AbstractTypeArguments& type_arguments_; // Temporary type argument handle. |
| 417 GrowableArray<Object*> backward_references_; | 439 GrowableArray<BackwardReferenceNode*> backward_references_; |
| 418 | 440 |
| 441 friend class Array; | |
| 442 friend class Class; | |
| 443 friend class Context; | |
| 444 friend class ContextScope; | |
| 445 friend class Field; | |
| 446 friend class Function; | |
| 447 friend class GrowableObjectArray; | |
| 448 friend class ImmutableArray; | |
| 449 friend class InstantiatedTypeArguments; | |
| 450 friend class JSRegExp; | |
| 451 friend class Library; | |
| 452 friend class LibraryPrefix; | |
| 453 friend class LiteralToken; | |
| 454 friend class Script; | |
| 455 friend class TokenStream; | |
| 456 friend class Type; | |
| 457 friend class TypeArguments; | |
| 458 friend class TypeParameter; | |
| 459 friend class UnresolvedClass; | |
| 419 DISALLOW_COPY_AND_ASSIGN(SnapshotReader); | 460 DISALLOW_COPY_AND_ASSIGN(SnapshotReader); |
| 420 }; | 461 }; |
| 421 | 462 |
| 422 | 463 |
| 423 class BaseWriter { | 464 class BaseWriter { |
| 424 public: | 465 public: |
| 425 // Size of the snapshot. | 466 // Size of the snapshot. |
| 426 intptr_t BytesWritten() const { return stream_.bytes_written(); } | 467 intptr_t BytesWritten() const { return stream_.bytes_written(); } |
| 427 | 468 |
| 428 // Writes raw data to the stream (basic type). | 469 // Writes raw data to the stream (basic type). |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 501 // which comprises of a flag(full/partial snaphot) and the length of | 542 // which comprises of a flag(full/partial snaphot) and the length of |
| 502 // serialzed bytes. | 543 // serialzed bytes. |
| 503 void FinalizeBuffer() { | 544 void FinalizeBuffer() { |
| 504 BaseWriter::FinalizeBuffer(kind_); | 545 BaseWriter::FinalizeBuffer(kind_); |
| 505 UnmarkAll(); | 546 UnmarkAll(); |
| 506 } | 547 } |
| 507 | 548 |
| 508 // Serialize an object into the buffer. | 549 // Serialize an object into the buffer. |
| 509 void WriteObject(RawObject* raw); | 550 void WriteObject(RawObject* raw); |
| 510 | 551 |
| 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. | 552 // Writes a full snapshot of the Isolate. |
| 517 void WriteFullSnapshot(); | 553 void WriteFullSnapshot(); |
| 518 | 554 |
| 519 uword GetObjectTags(RawObject* raw); | 555 uword GetObjectTags(RawObject* raw); |
| 520 | 556 |
| 521 private: | 557 private: |
| 522 class ForwardObjectNode : public ZoneAllocated { | 558 class ForwardObjectNode : public ZoneAllocated { |
| 523 public: | 559 public: |
| 524 ForwardObjectNode(RawObject* raw, uword tags) : raw_(raw), tags_(tags) {} | 560 ForwardObjectNode(RawObject* raw, uword tags, bool is_serialized) |
|
cshapiro
2012/06/08 22:04:39
same here
siva
2012/06/11 20:49:06
Done.
| |
| 561 : raw_(raw), tags_(tags), is_serialized_(is_serialized) {} | |
| 525 RawObject* raw() const { return raw_; } | 562 RawObject* raw() const { return raw_; } |
| 526 uword tags() const { return tags_; } | 563 uword tags() const { return tags_; } |
| 564 bool is_serialized() const { return is_serialized_; } | |
| 565 void set_is_serialized(bool value) { is_serialized_ = value; } | |
| 527 | 566 |
| 528 private: | 567 private: |
| 529 RawObject* raw_; | 568 RawObject* raw_; |
| 530 uword tags_; | 569 uword tags_; |
| 570 bool is_serialized_; | |
| 531 | 571 |
| 532 DISALLOW_COPY_AND_ASSIGN(ForwardObjectNode); | 572 DISALLOW_COPY_AND_ASSIGN(ForwardObjectNode); |
| 533 }; | 573 }; |
| 534 | 574 |
| 535 intptr_t MarkObject(RawObject* raw); | 575 intptr_t MarkObject(RawObject* raw, bool is_serialized); |
|
cshapiro
2012/06/08 22:04:39
same here
siva
2012/06/11 20:49:06
Done.
| |
| 576 void UnmarkAll(); | |
| 536 | 577 |
| 537 bool CheckAndWritePredefinedObject(RawObject* raw); | 578 bool CheckAndWritePredefinedObject(RawObject* raw); |
| 538 | 579 |
| 580 void WriteObjectRef(RawObject* raw); | |
| 581 void WriteClassId(RawClass* cls); | |
| 582 void WriteObjectImpl(RawObject* raw); | |
| 539 void WriteInlinedObject(RawObject* raw); | 583 void WriteInlinedObject(RawObject* raw); |
| 584 void WriteForwardedObjects(); | |
| 585 void ArrayWriteTo(intptr_t object_id, | |
| 586 intptr_t array_kind, | |
| 587 intptr_t tags, | |
| 588 RawSmi* length, | |
| 589 RawAbstractTypeArguments* type_arguments, | |
| 590 RawObject* data[]); | |
| 540 | 591 |
| 541 ObjectStore* object_store() const { return object_store_; } | 592 ObjectStore* object_store() const { return object_store_; } |
| 542 | 593 |
| 543 Snapshot::Kind kind_; | 594 Snapshot::Kind kind_; |
| 544 ObjectStore* object_store_; // Object store for common classes. | 595 ObjectStore* object_store_; // Object store for common classes. |
| 545 ClassTable* class_table_; // Class table for the class index to class lookup. | 596 ClassTable* class_table_; // Class table for the class index to class lookup. |
| 546 GrowableArray<ForwardObjectNode*> forward_list_; | 597 GrowableArray<ForwardObjectNode*> forward_list_; |
| 547 | 598 |
| 599 friend class RawArray; | |
| 600 friend class RawClass; | |
| 601 friend class RawGrowableObjectArray; | |
| 602 friend class RawImmutableArray; | |
| 603 friend class RawJSRegExp; | |
| 604 friend class RawLibrary; | |
| 605 friend class RawLiteralToken; | |
| 606 friend class RawScript; | |
| 607 friend class RawTokenStream; | |
| 608 friend class RawTypeArguments; | |
| 609 friend class SnapshotWriterVisitor; | |
| 548 DISALLOW_COPY_AND_ASSIGN(SnapshotWriter); | 610 DISALLOW_COPY_AND_ASSIGN(SnapshotWriter); |
| 549 }; | 611 }; |
| 550 | 612 |
| 551 | 613 |
| 552 class ScriptSnapshotWriter : public SnapshotWriter { | 614 class ScriptSnapshotWriter : public SnapshotWriter { |
| 553 public: | 615 public: |
| 554 ScriptSnapshotWriter(uint8_t** buffer, ReAlloc alloc) | 616 ScriptSnapshotWriter(uint8_t** buffer, ReAlloc alloc) |
| 555 : SnapshotWriter(Snapshot::kScript, buffer, alloc) { | 617 : SnapshotWriter(Snapshot::kScript, buffer, alloc) { |
| 556 ASSERT(buffer != NULL); | 618 ASSERT(buffer != NULL); |
| 557 ASSERT(alloc != NULL); | 619 ASSERT(alloc != NULL); |
| 558 } | 620 } |
| 559 ~ScriptSnapshotWriter() { } | 621 ~ScriptSnapshotWriter() { } |
| 560 | 622 |
| 561 // Writes a partial snapshot of the script. | 623 // Writes a partial snapshot of the script. |
| 562 void WriteScriptSnapshot(const Library& lib); | 624 void WriteScriptSnapshot(const Library& lib); |
| 563 | 625 |
| 564 private: | 626 private: |
| 565 DISALLOW_COPY_AND_ASSIGN(ScriptSnapshotWriter); | 627 DISALLOW_COPY_AND_ASSIGN(ScriptSnapshotWriter); |
| 566 }; | 628 }; |
| 567 | 629 |
| 568 | 630 |
| 569 // An object pointer visitor implementation which writes out | 631 // An object pointer visitor implementation which writes out |
| 570 // objects to a snap shot. | 632 // objects to a snap shot. |
| 571 class SnapshotWriterVisitor : public ObjectPointerVisitor { | 633 class SnapshotWriterVisitor : public ObjectPointerVisitor { |
| 572 public: | 634 public: |
| 573 explicit SnapshotWriterVisitor(SnapshotWriter* writer) | 635 explicit SnapshotWriterVisitor(SnapshotWriter* writer) |
| 574 : ObjectPointerVisitor(Isolate::Current()), writer_(writer) {} | 636 : ObjectPointerVisitor(Isolate::Current()), |
| 637 writer_(writer), | |
| 638 as_references_(true) {} | |
| 639 | |
| 640 SnapshotWriterVisitor(SnapshotWriter* writer, bool as_references) | |
| 641 : ObjectPointerVisitor(Isolate::Current()), | |
| 642 writer_(writer), | |
| 643 as_references_(as_references) {} | |
| 575 | 644 |
| 576 virtual void VisitPointers(RawObject** first, RawObject** last); | 645 virtual void VisitPointers(RawObject** first, RawObject** last); |
| 577 | 646 |
| 578 private: | 647 private: |
| 579 SnapshotWriter* writer_; | 648 SnapshotWriter* writer_; |
| 649 bool as_references_; | |
| 580 | 650 |
| 581 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor); | 651 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor); |
| 582 }; | 652 }; |
| 583 | 653 |
| 584 } // namespace dart | 654 } // namespace dart |
| 585 | 655 |
| 586 #endif // VM_SNAPSHOT_H_ | 656 #endif // VM_SNAPSHOT_H_ |
| OLD | NEW |