OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/api.h" | 8 #include "src/api.h" |
9 #include "src/base/platform/platform.h" | 9 #include "src/base/platform/platform.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 1534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1545 } | 1545 } |
1546 | 1546 |
1547 // Serialize the map (first word of the object). | 1547 // Serialize the map (first word of the object). |
1548 serializer_->SerializeObject(map, kPlain, kStartOfObject, 0); | 1548 serializer_->SerializeObject(map, kPlain, kStartOfObject, 0); |
1549 } | 1549 } |
1550 | 1550 |
1551 | 1551 |
1552 void Serializer::ObjectSerializer::SerializeExternalString() { | 1552 void Serializer::ObjectSerializer::SerializeExternalString() { |
1553 // Instead of serializing this as an external string, we serialize | 1553 // Instead of serializing this as an external string, we serialize |
1554 // an imaginary sequential string with the same content. | 1554 // an imaginary sequential string with the same content. |
1555 DCHECK(object_->IsExternalString() && object_->IsInternalizedString()); | |
1556 Isolate* isolate = serializer_->isolate(); | 1555 Isolate* isolate = serializer_->isolate(); |
| 1556 DCHECK(object_->IsExternalString()); |
| 1557 DCHECK(object_->map() != isolate->heap()->native_source_string_map()); |
1557 ExternalString* string = ExternalString::cast(object_); | 1558 ExternalString* string = ExternalString::cast(object_); |
1558 int length = string->length(); | 1559 int length = string->length(); |
1559 Map* map; | 1560 Map* map; |
1560 int size; | 1561 int size; |
1561 const char* resource; | 1562 const char* resource; |
1562 // Find the map and size for the imaginary sequential string. | 1563 // Find the map and size for the imaginary sequential string. |
1563 if (object_->IsExternalOneByteString()) { | 1564 if (object_->IsExternalOneByteString()) { |
1564 map = isolate->heap()->one_byte_internalized_string_map(); | 1565 map = isolate->heap()->one_byte_internalized_string_map(); |
1565 size = SeqOneByteString::SizeFor(length); | 1566 size = SeqOneByteString::SizeFor(length); |
1566 resource = ExternalOneByteString::cast(string)->resource()->data(); | 1567 resource = ExternalOneByteString::cast(string)->resource()->data(); |
(...skipping 26 matching lines...) Expand all Loading... |
1593 for (int i = 0; i < content_length; i++) { | 1594 for (int i = 0; i < content_length; i++) { |
1594 sink_->PutSection(resource[i], "StringContent"); | 1595 sink_->PutSection(resource[i], "StringContent"); |
1595 } | 1596 } |
1596 | 1597 |
1597 sink_->Put(kSkip, "SkipAfterString"); | 1598 sink_->Put(kSkip, "SkipAfterString"); |
1598 sink_->PutInt(bytes_to_output, "SkipDistance"); | 1599 sink_->PutInt(bytes_to_output, "SkipDistance"); |
1599 } | 1600 } |
1600 | 1601 |
1601 | 1602 |
1602 void Serializer::ObjectSerializer::Serialize() { | 1603 void Serializer::ObjectSerializer::Serialize() { |
1603 if (object_->IsExternalString() && object_->IsInternalizedString()) { | 1604 if (object_->IsExternalString()) { |
1604 // Native source code strings are not internalized and are handled in | 1605 Heap* heap = serializer_->isolate()->heap(); |
1605 // VisitExternalOneByteString. We deal with embedded external strings | 1606 if (object_->map() != heap->native_source_string_map()) { |
1606 // by serializing them as sequential strings on the heap. | 1607 // Usually we cannot recreate resources for external strings. To work |
1607 // This can only happen with CodeSerializer. | 1608 // around this, external strings are serialized to look like ordinary |
1608 SerializeExternalString(); | 1609 // sequential strings. |
1609 } else { | 1610 // The exception are native source code strings, since we can recreate |
1610 int size = object_->Size(); | 1611 // their resources. In that case we fall through and leave it to |
1611 Map* map = object_->map(); | 1612 // VisitExternalOneByteString further down. |
1612 SerializePrologue(Serializer::SpaceOfObject(object_), size, map); | 1613 SerializeExternalString(); |
| 1614 return; |
| 1615 } |
| 1616 } |
1613 | 1617 |
1614 // Serialize the rest of the object. | 1618 int size = object_->Size(); |
1615 CHECK_EQ(0, bytes_processed_so_far_); | 1619 Map* map = object_->map(); |
1616 bytes_processed_so_far_ = kPointerSize; | 1620 SerializePrologue(Serializer::SpaceOfObject(object_), size, map); |
1617 | 1621 |
1618 object_->IterateBody(map->instance_type(), size, this); | 1622 // Serialize the rest of the object. |
1619 OutputRawData(object_->address() + size); | 1623 CHECK_EQ(0, bytes_processed_so_far_); |
1620 } | 1624 bytes_processed_so_far_ = kPointerSize; |
| 1625 |
| 1626 object_->IterateBody(map->instance_type(), size, this); |
| 1627 OutputRawData(object_->address() + size); |
1621 } | 1628 } |
1622 | 1629 |
1623 | 1630 |
1624 void Serializer::ObjectSerializer::VisitPointers(Object** start, | 1631 void Serializer::ObjectSerializer::VisitPointers(Object** start, |
1625 Object** end) { | 1632 Object** end) { |
1626 Object** current = start; | 1633 Object** current = start; |
1627 while (current < end) { | 1634 while (current < end) { |
1628 while (current < end && (*current)->IsSmi()) current++; | 1635 while (current < end && (*current)->IsSmi()) current++; |
1629 if (current < end) OutputRawData(reinterpret_cast<Address>(current)); | 1636 if (current < end) OutputRawData(reinterpret_cast<Address>(current)); |
1630 | 1637 |
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2179 | 2186 |
2180 int SerializedCodeData::CheckSum(String* string) { | 2187 int SerializedCodeData::CheckSum(String* string) { |
2181 int checksum = Version::Hash(); | 2188 int checksum = Version::Hash(); |
2182 #ifdef DEBUG | 2189 #ifdef DEBUG |
2183 uint32_t seed = static_cast<uint32_t>(checksum); | 2190 uint32_t seed = static_cast<uint32_t>(checksum); |
2184 checksum = static_cast<int>(IteratingStringHasher::Hash(string, seed)); | 2191 checksum = static_cast<int>(IteratingStringHasher::Hash(string, seed)); |
2185 #endif // DEBUG | 2192 #endif // DEBUG |
2186 return checksum; | 2193 return checksum; |
2187 } | 2194 } |
2188 } } // namespace v8::internal | 2195 } } // namespace v8::internal |
OLD | NEW |