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/stub_code.h" | 9 #include "vm/stub_code.h" |
10 #include "vm/symbols.h" | 10 #include "vm/symbols.h" |
(...skipping 811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
822 | 822 |
823 // Create the literal token object. | 823 // Create the literal token object. |
824 LiteralToken& literal_token = LiteralToken::ZoneHandle( | 824 LiteralToken& literal_token = LiteralToken::ZoneHandle( |
825 reader->isolate(), NEW_OBJECT(LiteralToken)); | 825 reader->isolate(), NEW_OBJECT(LiteralToken)); |
826 reader->AddBackRef(object_id, &literal_token, kIsDeserialized); | 826 reader->AddBackRef(object_id, &literal_token, kIsDeserialized); |
827 | 827 |
828 // Set the object tags. | 828 // Set the object tags. |
829 literal_token.set_tags(tags); | 829 literal_token.set_tags(tags); |
830 | 830 |
831 // Read the token attributes. | 831 // Read the token attributes. |
832 Token::Kind token_kind = static_cast<Token::Kind>(reader->ReadIntptrValue()); | 832 Token::Kind token_kind = static_cast<Token::Kind>(reader->Read<int32_t>()); |
833 literal_token.set_kind(token_kind); | 833 literal_token.set_kind(token_kind); |
834 *reader->StringHandle() ^= reader->ReadObjectImpl(); | 834 *reader->StringHandle() ^= reader->ReadObjectImpl(); |
835 literal_token.set_literal(*reader->StringHandle()); | 835 literal_token.set_literal(*reader->StringHandle()); |
836 *reader->PassiveObjectHandle() = reader->ReadObjectImpl(); | 836 *reader->PassiveObjectHandle() = reader->ReadObjectImpl(); |
837 literal_token.set_value(*reader->PassiveObjectHandle()); | 837 literal_token.set_value(*reader->PassiveObjectHandle()); |
838 | 838 |
839 return literal_token.raw(); | 839 return literal_token.raw(); |
840 } | 840 } |
841 | 841 |
842 | 842 |
843 void RawLiteralToken::WriteTo(SnapshotWriter* writer, | 843 void RawLiteralToken::WriteTo(SnapshotWriter* writer, |
844 intptr_t object_id, | 844 intptr_t object_id, |
845 Snapshot::Kind kind) { | 845 Snapshot::Kind kind) { |
846 ASSERT(writer != NULL); | 846 ASSERT(writer != NULL); |
847 ASSERT(kind != Snapshot::kMessage); | 847 ASSERT(kind != Snapshot::kMessage); |
848 | 848 |
849 // Write out the serialization header value for this object. | 849 // Write out the serialization header value for this object. |
850 writer->WriteInlinedObjectHeader(object_id); | 850 writer->WriteInlinedObjectHeader(object_id); |
851 | 851 |
852 // Write out the class and tags information. | 852 // Write out the class and tags information. |
853 writer->WriteVMIsolateObject(kLiteralTokenCid); | 853 writer->WriteVMIsolateObject(kLiteralTokenCid); |
854 writer->WriteTags(writer->GetObjectTags(this)); | 854 writer->WriteTags(writer->GetObjectTags(this)); |
855 | 855 |
856 // Write out the kind field. | 856 // Write out the kind field. |
857 writer->Write<intptr_t>(ptr()->kind_); | 857 writer->Write<int32_t>(ptr()->kind_); |
858 | 858 |
859 // Write out literal and value fields. | 859 // Write out literal and value fields. |
860 writer->WriteObjectImpl(ptr()->literal_); | 860 writer->WriteObjectImpl(ptr()->literal_); |
861 writer->WriteObjectImpl(ptr()->value_); | 861 writer->WriteObjectImpl(ptr()->value_); |
862 } | 862 } |
863 | 863 |
864 | 864 |
865 RawTokenStream* TokenStream::ReadFrom(SnapshotReader* reader, | 865 RawTokenStream* TokenStream::ReadFrom(SnapshotReader* reader, |
866 intptr_t object_id, | 866 intptr_t object_id, |
867 intptr_t tags, | 867 intptr_t tags, |
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1316 } | 1316 } |
1317 | 1317 |
1318 | 1318 |
1319 RawContext* Context::ReadFrom(SnapshotReader* reader, | 1319 RawContext* Context::ReadFrom(SnapshotReader* reader, |
1320 intptr_t object_id, | 1320 intptr_t object_id, |
1321 intptr_t tags, | 1321 intptr_t tags, |
1322 Snapshot::Kind kind) { | 1322 Snapshot::Kind kind) { |
1323 ASSERT(reader != NULL); | 1323 ASSERT(reader != NULL); |
1324 | 1324 |
1325 // Allocate context object. | 1325 // Allocate context object. |
1326 intptr_t num_vars = reader->ReadIntptrValue(); | 1326 int32_t num_vars = reader->Read<int32_t>(); |
1327 Context& context = Context::ZoneHandle(reader->isolate(), Context::null()); | 1327 Context& context = Context::ZoneHandle(reader->isolate(), Context::null()); |
1328 if (kind == Snapshot::kFull) { | 1328 if (kind == Snapshot::kFull) { |
1329 context = reader->NewContext(num_vars); | 1329 context = reader->NewContext(num_vars); |
1330 } else { | 1330 } else { |
1331 context = Context::New(num_vars, HEAP_SPACE(kind)); | 1331 context = Context::New(num_vars, HEAP_SPACE(kind)); |
1332 } | 1332 } |
1333 reader->AddBackRef(object_id, &context, kIsDeserialized); | 1333 reader->AddBackRef(object_id, &context, kIsDeserialized); |
1334 | 1334 |
1335 // Set the object tags. | 1335 // Set the object tags. |
1336 context.set_tags(tags); | 1336 context.set_tags(tags); |
(...skipping 21 matching lines...) Expand all Loading... |
1358 ASSERT(writer != NULL); | 1358 ASSERT(writer != NULL); |
1359 | 1359 |
1360 // Write out the serialization header value for this object. | 1360 // Write out the serialization header value for this object. |
1361 writer->WriteInlinedObjectHeader(object_id); | 1361 writer->WriteInlinedObjectHeader(object_id); |
1362 | 1362 |
1363 // Write out the class and tags information. | 1363 // Write out the class and tags information. |
1364 writer->WriteVMIsolateObject(kContextCid); | 1364 writer->WriteVMIsolateObject(kContextCid); |
1365 writer->WriteTags(writer->GetObjectTags(this)); | 1365 writer->WriteTags(writer->GetObjectTags(this)); |
1366 | 1366 |
1367 // Write out num of variables in the context. | 1367 // Write out num of variables in the context. |
1368 writer->WriteIntptrValue(ptr()->num_variables_); | 1368 writer->Write<int32_t>(ptr()->num_variables_); |
1369 | 1369 |
1370 // Can't serialize the isolate pointer, we set it implicitly on read. | 1370 // Can't serialize the isolate pointer, we set it implicitly on read. |
1371 | 1371 |
1372 // Write out all the object pointer fields. | 1372 // Write out all the object pointer fields. |
1373 SnapshotWriterVisitor visitor(writer); | 1373 SnapshotWriterVisitor visitor(writer); |
1374 visitor.VisitPointers(from(), to(ptr()->num_variables_)); | 1374 visitor.VisitPointers(from(), to(ptr()->num_variables_)); |
1375 } | 1375 } |
1376 | 1376 |
1377 | 1377 |
1378 RawContextScope* ContextScope::ReadFrom(SnapshotReader* reader, | 1378 RawContextScope* ContextScope::ReadFrom(SnapshotReader* reader, |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1711 } | 1711 } |
1712 | 1712 |
1713 | 1713 |
1714 RawBigint* Bigint::ReadFrom(SnapshotReader* reader, | 1714 RawBigint* Bigint::ReadFrom(SnapshotReader* reader, |
1715 intptr_t object_id, | 1715 intptr_t object_id, |
1716 intptr_t tags, | 1716 intptr_t tags, |
1717 Snapshot::Kind kind) { | 1717 Snapshot::Kind kind) { |
1718 ASSERT(reader != NULL); | 1718 ASSERT(reader != NULL); |
1719 | 1719 |
1720 // Read in the HexCString representation of the bigint. | 1720 // Read in the HexCString representation of the bigint. |
1721 intptr_t len = reader->ReadIntptrValue(); | 1721 int32_t len = reader->Read<int32_t>(); |
1722 char* str = reader->isolate()->current_zone()->Alloc<char>(len + 1); | 1722 char* str = reader->isolate()->current_zone()->Alloc<char>(len + 1); |
1723 str[len] = '\0'; | 1723 str[len] = '\0'; |
1724 reader->ReadBytes(reinterpret_cast<uint8_t*>(str), len); | 1724 reader->ReadBytes(reinterpret_cast<uint8_t*>(str), len); |
1725 | 1725 |
1726 // Create a Bigint object from HexCString. | 1726 // Create a Bigint object from HexCString. |
1727 Bigint& obj = Bigint::ZoneHandle( | 1727 Bigint& obj = Bigint::ZoneHandle( |
1728 reader->isolate(), | 1728 reader->isolate(), |
1729 ((kind == Snapshot::kFull) ? reader->NewBigint(str) : | 1729 ((kind == Snapshot::kFull) ? reader->NewBigint(str) : |
1730 BigintOperations::FromHexCString(str, HEAP_SPACE(kind)))); | 1730 BigintOperations::FromHexCString(str, HEAP_SPACE(kind)))); |
1731 | 1731 |
(...skipping 26 matching lines...) Expand all Loading... |
1758 ASSERT(writer != NULL); | 1758 ASSERT(writer != NULL); |
1759 | 1759 |
1760 // Write out the serialization header value for this object. | 1760 // Write out the serialization header value for this object. |
1761 writer->WriteInlinedObjectHeader(object_id); | 1761 writer->WriteInlinedObjectHeader(object_id); |
1762 | 1762 |
1763 // Write out the class and tags information. | 1763 // Write out the class and tags information. |
1764 writer->WriteIndexedObject(kBigintCid); | 1764 writer->WriteIndexedObject(kBigintCid); |
1765 writer->WriteTags(writer->GetObjectTags(this)); | 1765 writer->WriteTags(writer->GetObjectTags(this)); |
1766 | 1766 |
1767 // Write out the bigint value as a HEXCstring. | 1767 // Write out the bigint value as a HEXCstring. |
1768 intptr_t length = ptr()->signed_length_; | 1768 int32_t length = ptr()->signed_length_; |
1769 bool is_negative = false; | 1769 bool is_negative = false; |
1770 if (length <= 0) { | 1770 if (length <= 0) { |
1771 length = -length; | 1771 length = -length; |
1772 is_negative = true; | 1772 is_negative = true; |
1773 } | 1773 } |
1774 uword data_start = reinterpret_cast<uword>(ptr()) + sizeof(RawBigint); | 1774 uword data_start = reinterpret_cast<uword>(ptr()) + sizeof(RawBigint); |
1775 const char* str = BigintOperations::ToHexCString( | 1775 const char* str = BigintOperations::ToHexCString( |
1776 length, | 1776 length, |
1777 is_negative, | 1777 is_negative, |
1778 reinterpret_cast<void*>(data_start), | 1778 reinterpret_cast<void*>(data_start), |
1779 &BigintAllocator); | 1779 &BigintAllocator); |
1780 bool neg = false; | 1780 bool neg = false; |
1781 if (*str == '-') { | 1781 if (*str == '-') { |
1782 neg = true; | 1782 neg = true; |
1783 str++; | 1783 str++; |
1784 } | 1784 } |
1785 intptr_t len = strlen(str); | 1785 intptr_t len = strlen(str); |
1786 ASSERT(len > 2 && str[0] == '0' && str[1] == 'x'); | 1786 ASSERT(len > 2 && str[0] == '0' && str[1] == 'x'); |
1787 if (neg) { | 1787 if (neg) { |
1788 writer->WriteIntptrValue(len - 1); // Include '-' in length. | 1788 writer->Write<int32_t>(len - 1); // Include '-' in length. |
1789 writer->Write<uint8_t>('-'); | 1789 writer->Write<uint8_t>('-'); |
1790 } else { | 1790 } else { |
1791 writer->WriteIntptrValue(len - 2); | 1791 writer->Write<int32_t>(len - 2); |
1792 } | 1792 } |
1793 writer->WriteBytes(reinterpret_cast<const uint8_t*>(&(str[2])), (len - 2)); | 1793 writer->WriteBytes(reinterpret_cast<const uint8_t*>(&(str[2])), (len - 2)); |
1794 } | 1794 } |
1795 | 1795 |
1796 | 1796 |
1797 RawDouble* Double::ReadFrom(SnapshotReader* reader, | 1797 RawDouble* Double::ReadFrom(SnapshotReader* reader, |
1798 intptr_t object_id, | 1798 intptr_t object_id, |
1799 intptr_t tags, | 1799 intptr_t tags, |
1800 Snapshot::Kind kind) { | 1800 Snapshot::Kind kind) { |
1801 ASSERT(reader != NULL); | 1801 ASSERT(reader != NULL); |
(...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2748 reader->isolate(), JSRegExp::New(len, HEAP_SPACE(kind))); | 2748 reader->isolate(), JSRegExp::New(len, HEAP_SPACE(kind))); |
2749 reader->AddBackRef(object_id, ®ex, kIsDeserialized); | 2749 reader->AddBackRef(object_id, ®ex, kIsDeserialized); |
2750 | 2750 |
2751 // Set the object tags. | 2751 // Set the object tags. |
2752 regex.set_tags(tags); | 2752 regex.set_tags(tags); |
2753 | 2753 |
2754 // Read and Set all the other fields. | 2754 // Read and Set all the other fields. |
2755 regex.raw_ptr()->num_bracket_expressions_ = reader->ReadAsSmi(); | 2755 regex.raw_ptr()->num_bracket_expressions_ = reader->ReadAsSmi(); |
2756 *reader->StringHandle() ^= reader->ReadObjectImpl(); | 2756 *reader->StringHandle() ^= reader->ReadObjectImpl(); |
2757 regex.set_pattern(*reader->StringHandle()); | 2757 regex.set_pattern(*reader->StringHandle()); |
2758 regex.raw_ptr()->type_ = reader->ReadIntptrValue(); | 2758 regex.raw_ptr()->type_flags_ = reader->Read<int8_t>(); |
2759 regex.raw_ptr()->flags_ = reader->ReadIntptrValue(); | |
2760 | 2759 |
2761 // TODO(5411462): Need to implement a way of recompiling the regex. | 2760 // TODO(5411462): Need to implement a way of recompiling the regex. |
2762 | 2761 |
2763 return regex.raw(); | 2762 return regex.raw(); |
2764 } | 2763 } |
2765 | 2764 |
2766 | 2765 |
2767 void RawJSRegExp::WriteTo(SnapshotWriter* writer, | 2766 void RawJSRegExp::WriteTo(SnapshotWriter* writer, |
2768 intptr_t object_id, | 2767 intptr_t object_id, |
2769 Snapshot::Kind kind) { | 2768 Snapshot::Kind kind) { |
2770 ASSERT(writer != NULL); | 2769 ASSERT(writer != NULL); |
2771 ASSERT(kind == Snapshot::kMessage); | 2770 ASSERT(kind == Snapshot::kMessage); |
2772 | 2771 |
2773 // Write out the serialization header value for this object. | 2772 // Write out the serialization header value for this object. |
2774 writer->WriteInlinedObjectHeader(object_id); | 2773 writer->WriteInlinedObjectHeader(object_id); |
2775 | 2774 |
2776 // Write out the class and tags information. | 2775 // Write out the class and tags information. |
2777 writer->WriteIndexedObject(kJSRegExpCid); | 2776 writer->WriteIndexedObject(kJSRegExpCid); |
2778 writer->WriteTags(writer->GetObjectTags(this)); | 2777 writer->WriteTags(writer->GetObjectTags(this)); |
2779 | 2778 |
2780 // Write out the data length field. | 2779 // Write out the data length field. |
2781 writer->Write<RawObject*>(ptr()->data_length_); | 2780 writer->Write<RawObject*>(ptr()->data_length_); |
2782 | 2781 |
2783 // Write out all the other fields. | 2782 // Write out all the other fields. |
2784 writer->Write<RawObject*>(ptr()->num_bracket_expressions_); | 2783 writer->Write<RawObject*>(ptr()->num_bracket_expressions_); |
2785 writer->WriteObjectImpl(ptr()->pattern_); | 2784 writer->WriteObjectImpl(ptr()->pattern_); |
2786 writer->WriteIntptrValue(ptr()->type_); | 2785 writer->Write<int8_t>(ptr()->type_flags_); |
2787 writer->WriteIntptrValue(ptr()->flags_); | |
2788 | 2786 |
2789 // Do not write out the data part which is native. | 2787 // Do not write out the data part which is native. |
2790 } | 2788 } |
2791 | 2789 |
2792 | 2790 |
2793 RawWeakProperty* WeakProperty::ReadFrom(SnapshotReader* reader, | 2791 RawWeakProperty* WeakProperty::ReadFrom(SnapshotReader* reader, |
2794 intptr_t object_id, | 2792 intptr_t object_id, |
2795 intptr_t tags, | 2793 intptr_t tags, |
2796 Snapshot::Kind kind) { | 2794 Snapshot::Kind kind) { |
2797 ASSERT(reader != NULL); | 2795 ASSERT(reader != NULL); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2869 // We do not allow objects with native fields in an isolate message. | 2867 // We do not allow objects with native fields in an isolate message. |
2870 writer->SetWriteException(Exceptions::kArgument, | 2868 writer->SetWriteException(Exceptions::kArgument, |
2871 "Illegal argument in isolate message" | 2869 "Illegal argument in isolate message" |
2872 " : (object is a UserTag)"); | 2870 " : (object is a UserTag)"); |
2873 } else { | 2871 } else { |
2874 UNREACHABLE(); | 2872 UNREACHABLE(); |
2875 } | 2873 } |
2876 } | 2874 } |
2877 | 2875 |
2878 } // namespace dart | 2876 } // namespace dart |
OLD | NEW |