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

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

Issue 509153003: New bigint implementation in the vm. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 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
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 "vm/bigint_operations.h"
6 #include "vm/object.h" 5 #include "vm/object.h"
7 #include "vm/object_store.h" 6 #include "vm/object_store.h"
8 #include "vm/snapshot.h" 7 #include "vm/snapshot.h"
9 #include "vm/stub_code.h" 8 #include "vm/stub_code.h"
10 #include "vm/symbols.h" 9 #include "vm/symbols.h"
11 #include "vm/visitor.h" 10 #include "vm/visitor.h"
12 11
13 namespace dart { 12 namespace dart {
14 13
15 #define NEW_OBJECT(type) \ 14 #define NEW_OBJECT(type) \
16 ((kind == Snapshot::kFull) ? reader->New##type() : type::New()) 15 ((kind == Snapshot::kFull) ? reader->New##type() : type::New())
17 16
18 #define NEW_OBJECT_WITH_LEN(type, len) \ 17 #define NEW_OBJECT_WITH_LEN(type, len) \
19 ((kind == Snapshot::kFull) ? reader->New##type(len) : type::New(len)) 18 ((kind == Snapshot::kFull) ? reader->New##type(len) : type::New(len))
20 19
21 #define NEW_OBJECT_WITH_LEN_SPACE(type, len, kind) \ 20 #define NEW_OBJECT_WITH_LEN_SPACE(type, len, kind) \
22 ((kind == Snapshot::kFull) ? \ 21 ((kind == Snapshot::kFull) ? \
23 reader->New##type(len) : type::New(len, HEAP_SPACE(kind))) 22 reader->New##type(len) : type::New(len, HEAP_SPACE(kind)))
24 23
25 24
26 static uword BigintAllocator(intptr_t size) {
27 Zone* zone = Isolate::Current()->current_zone();
28 return zone->AllocUnsafe(size);
29 }
30
31
32 RawClass* Class::ReadFrom(SnapshotReader* reader, 25 RawClass* Class::ReadFrom(SnapshotReader* reader,
33 intptr_t object_id, 26 intptr_t object_id,
34 intptr_t tags, 27 intptr_t tags,
35 Snapshot::Kind kind) { 28 Snapshot::Kind kind) {
36 ASSERT(reader != NULL); 29 ASSERT(reader != NULL);
37 30
38 Class& cls = Class::ZoneHandle(reader->isolate(), Class::null()); 31 Class& cls = Class::ZoneHandle(reader->isolate(), Class::null());
39 if ((kind == Snapshot::kFull) || 32 if ((kind == Snapshot::kFull) ||
40 (kind == Snapshot::kScript && !RawObject::IsCreatedFromSnapshot(tags))) { 33 (kind == Snapshot::kScript && !RawObject::IsCreatedFromSnapshot(tags))) {
41 // Read in the base information. 34 // Read in the base information.
(...skipping 1663 matching lines...) Expand 10 before | Expand all | Expand 10 after
1705 // Write out the class and tags information. 1698 // Write out the class and tags information.
1706 writer->WriteIndexedObject(kMintCid); 1699 writer->WriteIndexedObject(kMintCid);
1707 writer->WriteTags(writer->GetObjectTags(this)); 1700 writer->WriteTags(writer->GetObjectTags(this));
1708 1701
1709 // Write out the 64 bit value. 1702 // Write out the 64 bit value.
1710 writer->Write<int64_t>(ptr()->value_); 1703 writer->Write<int64_t>(ptr()->value_);
1711 } 1704 }
1712 1705
1713 1706
1714 RawBigint* Bigint::ReadFrom(SnapshotReader* reader, 1707 RawBigint* Bigint::ReadFrom(SnapshotReader* reader,
1715 intptr_t object_id, 1708 intptr_t object_id,
1716 intptr_t tags, 1709 intptr_t tags,
1717 Snapshot::Kind kind) { 1710 Snapshot::Kind kind) {
1718 ASSERT(reader != NULL); 1711 ASSERT(reader != NULL);
1719 1712
1720 // Read in the HexCString representation of the bigint. 1713 // Allocate bigint object.
1721 intptr_t len = reader->ReadIntptrValue(); 1714 Bigint& obj = Bigint::ZoneHandle(reader->isolate(), NEW_OBJECT(Bigint));
1722 char* str = reader->isolate()->current_zone()->Alloc<char>(len + 1); 1715 reader->AddBackRef(object_id, &obj, kIsDeserialized);
1723 str[len] = '\0';
1724 reader->ReadBytes(reinterpret_cast<uint8_t*>(str), len);
1725 1716
1726 // Create a Bigint object from HexCString. 1717 // Set all the object fields.
1727 Bigint& obj = Bigint::ZoneHandle( 1718 // TODO(5411462): Need to assert No GC can happen here, even though
1728 reader->isolate(), 1719 // allocations may happen.
1729 ((kind == Snapshot::kFull) ? reader->NewBigint(str) : 1720 intptr_t num_flds = (obj.raw()->to() - obj.raw()->from());
1730 BigintOperations::FromHexCString(str, HEAP_SPACE(kind)))); 1721 for (intptr_t i = 0; i <= num_flds; i++) {
1722 (*reader->PassiveObjectHandle()) = reader->ReadObjectRef();
1723 obj.StorePointer(obj.raw()->from() + i,
1724 reader->PassiveObjectHandle()->raw());
1725 }
1731 1726
1732 // If it is a canonical constant make it one. 1727 // If it is a canonical constant make it one.
1733 // When reading a full snapshot we don't need to canonicalize the object 1728 // When reading a full snapshot we don't need to canonicalize the object
1734 // as it would already be a canonical object. 1729 // as it would already be a canonical object.
1735 // When reading a script snapshot we need to canonicalize only those object 1730 // When reading a script snapshot we need to canonicalize only those object
1736 // references that are objects from the core library (loaded from a 1731 // references that are objects from the core library (loaded from a
1737 // full snapshot). Objects that are only in the script need not be 1732 // full snapshot). Objects that are only in the script need not be
1738 // canonicalized as they are already canonical. 1733 // canonicalized as they are already canonical.
1739 // When reading a message snapshot we always have to canonicalize the object. 1734 // When reading a message snapshot we always have to canonicalize the object.
1740 if ((kind != Snapshot::kFull) && RawObject::IsCanonical(tags) && 1735 if ((kind != Snapshot::kFull) && RawObject::IsCanonical(tags) &&
1741 (RawObject::IsCreatedFromSnapshot(tags) || 1736 (RawObject::IsCreatedFromSnapshot(tags) ||
1742 (kind == Snapshot::kMessage))) { 1737 (kind == Snapshot::kMessage))) {
1743 obj ^= obj.CheckAndCanonicalize(NULL); 1738 obj ^= obj.CheckAndCanonicalize(NULL);
1744 ASSERT(!obj.IsNull()); 1739 ASSERT(!obj.IsNull());
1745 } 1740 }
1746 reader->AddBackRef(object_id, &obj, kIsDeserialized);
1747 1741
1748 // Set the object tags. 1742 // Set the object tags.
1749 obj.set_tags(tags); 1743 obj.set_tags(tags);
1750 1744
1751 return obj.raw(); 1745 return obj.raw();
1752 } 1746 }
1753 1747
1754 1748
1755 void RawBigint::WriteTo(SnapshotWriter* writer, 1749 void RawBigint::WriteTo(SnapshotWriter* writer,
1756 intptr_t object_id, 1750 intptr_t object_id,
1757 Snapshot::Kind kind) { 1751 Snapshot::Kind kind) {
1758 ASSERT(writer != NULL); 1752 ASSERT(writer != NULL);
1759 1753
1760 // Write out the serialization header value for this object. 1754 // Write out the serialization header value for this object.
1761 writer->WriteInlinedObjectHeader(object_id); 1755 writer->WriteInlinedObjectHeader(object_id);
1762 1756
1763 // Write out the class and tags information. 1757 // Write out the class and tags information.
1764 writer->WriteIndexedObject(kBigintCid); 1758 writer->WriteIndexedObject(kBigintCid);
1765 writer->WriteTags(writer->GetObjectTags(this)); 1759 writer->WriteTags(writer->GetObjectTags(this));
1766 1760
1767 // Write out the bigint value as a HEXCstring. 1761 // Write out all the object pointer fields.
1768 intptr_t length = ptr()->signed_length_; 1762 SnapshotWriterVisitor visitor(writer);
1769 bool is_negative = false; 1763 visitor.VisitPointers(from(), to());
1770 if (length <= 0) {
1771 length = -length;
1772 is_negative = true;
1773 }
1774 uword data_start = reinterpret_cast<uword>(ptr()) + sizeof(RawBigint);
1775 const char* str = BigintOperations::ToHexCString(
1776 length,
1777 is_negative,
1778 reinterpret_cast<void*>(data_start),
1779 &BigintAllocator);
1780 bool neg = false;
1781 if (*str == '-') {
1782 neg = true;
1783 str++;
1784 }
1785 intptr_t len = strlen(str);
1786 ASSERT(len > 2 && str[0] == '0' && str[1] == 'x');
1787 if (neg) {
1788 writer->WriteIntptrValue(len - 1); // Include '-' in length.
1789 writer->Write<uint8_t>('-');
1790 } else {
1791 writer->WriteIntptrValue(len - 2);
1792 }
1793 writer->WriteBytes(reinterpret_cast<const uint8_t*>(&(str[2])), (len - 2));
1794 } 1764 }
1795 1765
1796 1766
1797 RawDouble* Double::ReadFrom(SnapshotReader* reader, 1767 RawDouble* Double::ReadFrom(SnapshotReader* reader,
1798 intptr_t object_id, 1768 intptr_t object_id,
1799 intptr_t tags, 1769 intptr_t tags,
1800 Snapshot::Kind kind) { 1770 Snapshot::Kind kind) {
1801 ASSERT(reader != NULL); 1771 ASSERT(reader != NULL);
1802 ASSERT(kind != Snapshot::kMessage); 1772 ASSERT(kind != Snapshot::kMessage);
1803 // Read the double value for the object. 1773 // Read the double value for the object.
(...skipping 1065 matching lines...) Expand 10 before | Expand all | Expand 10 after
2869 // We do not allow objects with native fields in an isolate message. 2839 // We do not allow objects with native fields in an isolate message.
2870 writer->SetWriteException(Exceptions::kArgument, 2840 writer->SetWriteException(Exceptions::kArgument,
2871 "Illegal argument in isolate message" 2841 "Illegal argument in isolate message"
2872 " : (object is a UserTag)"); 2842 " : (object is a UserTag)");
2873 } else { 2843 } else {
2874 UNREACHABLE(); 2844 UNREACHABLE();
2875 } 2845 }
2876 } 2846 }
2877 2847
2878 } // namespace dart 2848 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698