OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/bigint_operations.h" | 5 #include "vm/bigint_operations.h" |
6 #include "vm/object.h" | 6 #include "vm/object.h" |
7 #include "vm/object_store.h" | 7 #include "vm/object_store.h" |
8 #include "vm/snapshot.h" | 8 #include "vm/snapshot.h" |
9 #include "vm/symbols.h" | 9 #include "vm/symbols.h" |
10 #include "vm/visitor.h" | 10 #include "vm/visitor.h" |
(...skipping 1666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1677 intptr_t object_id, | 1677 intptr_t object_id, |
1678 Snapshot::Kind kind) { | 1678 Snapshot::Kind kind) { |
1679 UNREACHABLE(); | 1679 UNREACHABLE(); |
1680 } | 1680 } |
1681 | 1681 |
1682 | 1682 |
1683 RawInstance* Instance::ReadFrom(SnapshotReader* reader, | 1683 RawInstance* Instance::ReadFrom(SnapshotReader* reader, |
1684 intptr_t object_id, | 1684 intptr_t object_id, |
1685 intptr_t tags, | 1685 intptr_t tags, |
1686 Snapshot::Kind kind) { | 1686 Snapshot::Kind kind) { |
1687 UNREACHABLE(); | 1687 ASSERT(reader != NULL); |
1688 return Instance::null(); | 1688 |
| 1689 // Create an Instance object or get canonical one if it is a canonical |
| 1690 // constant. |
| 1691 Instance& obj = Instance::ZoneHandle(reader->isolate(), Instance::null()); |
| 1692 if (kind == Snapshot::kFull) { |
| 1693 obj = reader->NewInstance(); |
| 1694 } else { |
| 1695 obj ^= Object::Allocate(kInstanceCid, |
| 1696 Instance::InstanceSize(), |
| 1697 HEAP_SPACE(kind)); |
| 1698 // When reading a script snapshot we need to canonicalize only those object |
| 1699 // references that are objects from the core library (loaded from a |
| 1700 // full snapshot). Objects that are only in the script need not be |
| 1701 // canonicalized as they are already canonical. |
| 1702 // When reading a message snapshot we always have to canonicalize. |
| 1703 if (RawObject::IsCanonical(tags) && |
| 1704 (RawObject::IsCreatedFromSnapshot(tags) || |
| 1705 (kind == Snapshot::kMessage))) { |
| 1706 obj = obj.CheckAndCanonicalize(NULL); |
| 1707 } |
| 1708 } |
| 1709 reader->AddBackRef(object_id, &obj, kIsDeserialized); |
| 1710 |
| 1711 // Set the object tags. |
| 1712 obj.set_tags(tags); |
| 1713 |
| 1714 return obj.raw(); |
1689 } | 1715 } |
1690 | 1716 |
1691 | 1717 |
1692 void RawInstance::WriteTo(SnapshotWriter* writer, | 1718 void RawInstance::WriteTo(SnapshotWriter* writer, |
1693 intptr_t object_id, | 1719 intptr_t object_id, |
1694 Snapshot::Kind kind) { | 1720 Snapshot::Kind kind) { |
1695 UNREACHABLE(); | 1721 ASSERT(writer != NULL); |
| 1722 |
| 1723 // Write out the serialization header value for this object. |
| 1724 writer->WriteInlinedObjectHeader(object_id); |
| 1725 |
| 1726 // Write out the class and tags information. |
| 1727 writer->WriteIndexedObject(kInstanceCid); |
| 1728 writer->WriteIntptrValue(writer->GetObjectTags(this)); |
1696 } | 1729 } |
1697 | 1730 |
1698 | 1731 |
1699 RawMint* Mint::ReadFrom(SnapshotReader* reader, | 1732 RawMint* Mint::ReadFrom(SnapshotReader* reader, |
1700 intptr_t object_id, | 1733 intptr_t object_id, |
1701 intptr_t tags, | 1734 intptr_t tags, |
1702 Snapshot::Kind kind) { | 1735 Snapshot::Kind kind) { |
1703 ASSERT(reader != NULL); | 1736 ASSERT(reader != NULL); |
1704 | 1737 |
1705 // Read the 64 bit value for the object. | 1738 // Read the 64 bit value for the object. |
(...skipping 848 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2554 array ^= reader->ReadObjectRef(); | 2587 array ^= reader->ReadObjectRef(); |
2555 result.set_code_array(array); | 2588 result.set_code_array(array); |
2556 array ^= reader->ReadObjectRef(); | 2589 array ^= reader->ReadObjectRef(); |
2557 result.set_pc_offset_array(array); | 2590 result.set_pc_offset_array(array); |
2558 | 2591 |
2559 array ^= reader->ReadObjectRef(); | 2592 array ^= reader->ReadObjectRef(); |
2560 result.set_catch_code_array(array); | 2593 result.set_catch_code_array(array); |
2561 array ^= reader->ReadObjectRef(); | 2594 array ^= reader->ReadObjectRef(); |
2562 result.set_catch_pc_offset_array(array); | 2595 result.set_catch_pc_offset_array(array); |
2563 | 2596 |
| 2597 bool expand_inlined = reader->Read<bool>(); |
| 2598 result.set_expand_inlined(expand_inlined); |
| 2599 |
2564 return result.raw(); | 2600 return result.raw(); |
2565 } | 2601 } |
2566 UNREACHABLE(); // Stacktraces are not sent in a snapshot. | 2602 UNREACHABLE(); // Stacktraces are not sent in a snapshot. |
2567 return Stacktrace::null(); | 2603 return Stacktrace::null(); |
2568 } | 2604 } |
2569 | 2605 |
2570 | 2606 |
2571 void RawStacktrace::WriteTo(SnapshotWriter* writer, | 2607 void RawStacktrace::WriteTo(SnapshotWriter* writer, |
2572 intptr_t object_id, | 2608 intptr_t object_id, |
2573 Snapshot::Kind kind) { | 2609 Snapshot::Kind kind) { |
2574 if (kind == Snapshot::kFull) { | 2610 if (kind == Snapshot::kFull) { |
2575 ASSERT(writer != NULL); | 2611 ASSERT(writer != NULL); |
2576 ASSERT(this == Isolate::Current()->object_store()-> | 2612 ASSERT(this == Isolate::Current()->object_store()-> |
2577 preallocated_stack_trace()); | 2613 preallocated_stack_trace()); |
2578 | 2614 |
2579 // Write out the serialization header value for this object. | 2615 // Write out the serialization header value for this object. |
2580 writer->WriteInlinedObjectHeader(object_id); | 2616 writer->WriteInlinedObjectHeader(object_id); |
2581 | 2617 |
2582 // Write out the class and tags information. | 2618 // Write out the class and tags information. |
2583 writer->WriteIndexedObject(kStacktraceCid); | 2619 writer->WriteIndexedObject(kStacktraceCid); |
2584 writer->WriteIntptrValue(writer->GetObjectTags(this)); | 2620 writer->WriteIntptrValue(writer->GetObjectTags(this)); |
2585 | 2621 |
2586 // There are no non object pointer fields. | |
2587 | |
2588 // Write out all the object pointer fields. | 2622 // Write out all the object pointer fields. |
2589 SnapshotWriterVisitor visitor(writer); | 2623 SnapshotWriterVisitor visitor(writer); |
2590 visitor.VisitPointers(from(), to()); | 2624 visitor.VisitPointers(from(), to()); |
| 2625 |
| 2626 writer->Write(expand_inlined_); |
2591 } else { | 2627 } else { |
2592 // Stacktraces are not allowed in other snapshot forms. | 2628 // Stacktraces are not allowed in other snapshot forms. |
2593 writer->SetWriteException(Exceptions::kArgument, | 2629 writer->SetWriteException(Exceptions::kArgument, |
2594 "Illegal argument in isolate message" | 2630 "Illegal argument in isolate message" |
2595 " : (object is a stacktrace)"); | 2631 " : (object is a stacktrace)"); |
2596 } | 2632 } |
2597 } | 2633 } |
2598 | 2634 |
2599 | 2635 |
2600 RawJSRegExp* JSRegExp::ReadFrom(SnapshotReader* reader, | 2636 RawJSRegExp* JSRegExp::ReadFrom(SnapshotReader* reader, |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2710 // We do not allow objects with native fields in an isolate message. | 2746 // We do not allow objects with native fields in an isolate message. |
2711 writer->SetWriteException(Exceptions::kArgument, | 2747 writer->SetWriteException(Exceptions::kArgument, |
2712 "Illegal argument in isolate message" | 2748 "Illegal argument in isolate message" |
2713 " : (object is a MirrorReference)"); | 2749 " : (object is a MirrorReference)"); |
2714 } else { | 2750 } else { |
2715 UNREACHABLE(); | 2751 UNREACHABLE(); |
2716 } | 2752 } |
2717 } | 2753 } |
2718 | 2754 |
2719 } // namespace dart | 2755 } // namespace dart |
OLD | NEW |