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

Side by Side Diff: src/serialize.cc

Issue 411483002: Correctly hook up back references to internalized strings in code deserializer. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: edited comment Created 6 years, 5 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
« no previous file with comments | « src/serialize.h ('k') | test/cctest/test-serialize.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 849 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 MUST_USE_RESULT virtual Handle<Object> AsHandle(Isolate* isolate) 860 MUST_USE_RESULT virtual Handle<Object> AsHandle(Isolate* isolate)
861 V8_OVERRIDE { 861 V8_OVERRIDE {
862 return handle(string_, isolate); 862 return handle(string_, isolate);
863 } 863 }
864 864
865 String* string_; 865 String* string_;
866 uint32_t hash_; 866 uint32_t hash_;
867 }; 867 };
868 868
869 869
870 HeapObject* Deserializer::ProcessObjectFromSerializedCode(HeapObject* obj) { 870 HeapObject* Deserializer::ProcessNewObjectFromSerializedCode(HeapObject* obj) {
871 if (obj->IsString()) { 871 if (obj->IsString()) {
872 String* string = String::cast(obj); 872 String* string = String::cast(obj);
873 // Uninitialize hash field as the hash seed may have changed. 873 // Uninitialize hash field as the hash seed may have changed.
874 string->set_hash_field(String::kEmptyHashField); 874 string->set_hash_field(String::kEmptyHashField);
875 if (string->IsInternalizedString()) { 875 if (string->IsInternalizedString()) {
876 DisallowHeapAllocation no_gc; 876 DisallowHeapAllocation no_gc;
877 HandleScope scope(isolate_); 877 HandleScope scope(isolate_);
878 StringTableInsertionKey key(string); 878 StringTableInsertionKey key(string);
879 return *StringTable::LookupKey(isolate_, &key); 879 String* canonical = *StringTable::LookupKey(isolate_, &key);
880 string->SetForwardedInternalizedString(canonical);
881 return canonical;
880 } 882 }
881 } 883 }
882 return obj; 884 return obj;
883 } 885 }
884 886
885 887
888 Object* Deserializer::ProcessBackRefInSerializedCode(Object* obj) {
889 if (obj->IsInternalizedString()) {
890 return String::cast(obj)->GetForwardedInternalizedString();
891 }
892 return obj;
893 }
894
895
886 // This routine writes the new object into the pointer provided and then 896 // This routine writes the new object into the pointer provided and then
887 // returns true if the new object was in young space and false otherwise. 897 // returns true if the new object was in young space and false otherwise.
888 // The reason for this strange interface is that otherwise the object is 898 // The reason for this strange interface is that otherwise the object is
889 // written very late, which means the FreeSpace map is not set up by the 899 // written very late, which means the FreeSpace map is not set up by the
890 // time we need to use it to mark the space at the end of a page free. 900 // time we need to use it to mark the space at the end of a page free.
891 void Deserializer::ReadObject(int space_number, 901 void Deserializer::ReadObject(int space_number,
892 Object** write_back) { 902 Object** write_back) {
893 int size = source_->GetInt() << kObjectAlignmentBits; 903 int size = source_->GetInt() << kObjectAlignmentBits;
894 Address address = Allocate(space_number, size); 904 Address address = Allocate(space_number, size);
895 HeapObject* obj = HeapObject::FromAddress(address); 905 HeapObject* obj = HeapObject::FromAddress(address);
896 isolate_->heap()->OnAllocationEvent(obj, size); 906 isolate_->heap()->OnAllocationEvent(obj, size);
897 Object** current = reinterpret_cast<Object**>(address); 907 Object** current = reinterpret_cast<Object**>(address);
898 Object** limit = current + (size >> kPointerSizeLog2); 908 Object** limit = current + (size >> kPointerSizeLog2);
899 if (FLAG_log_snapshot_positions) { 909 if (FLAG_log_snapshot_positions) {
900 LOG(isolate_, SnapshotPositionEvent(address, source_->position())); 910 LOG(isolate_, SnapshotPositionEvent(address, source_->position()));
901 } 911 }
902 ReadChunk(current, limit, space_number, address); 912 ReadChunk(current, limit, space_number, address);
903 913
904 // TODO(mvstanton): consider treating the heap()->allocation_sites_list() 914 // TODO(mvstanton): consider treating the heap()->allocation_sites_list()
905 // as a (weak) root. If this root is relocated correctly, 915 // as a (weak) root. If this root is relocated correctly,
906 // RelinkAllocationSite() isn't necessary. 916 // RelinkAllocationSite() isn't necessary.
907 if (obj->IsAllocationSite()) RelinkAllocationSite(AllocationSite::cast(obj)); 917 if (obj->IsAllocationSite()) RelinkAllocationSite(AllocationSite::cast(obj));
908 918
909 // Fix up strings from serialized user code. 919 // Fix up strings from serialized user code.
910 if (deserializing_user_code()) obj = ProcessObjectFromSerializedCode(obj); 920 if (deserializing_user_code()) obj = ProcessNewObjectFromSerializedCode(obj);
911 921
912 *write_back = obj; 922 *write_back = obj;
913 #ifdef DEBUG 923 #ifdef DEBUG
914 bool is_codespace = (space_number == CODE_SPACE); 924 bool is_codespace = (space_number == CODE_SPACE);
915 ASSERT(obj->IsCode() == is_codespace); 925 ASSERT(obj->IsCode() == is_codespace);
916 #endif 926 #endif
917 } 927 }
918 928
919 void Deserializer::ReadChunk(Object** current, 929 void Deserializer::ReadChunk(Object** current,
920 Object** limit, 930 Object** limit,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 } else if (where == kExternalReference) { \ 975 } else if (where == kExternalReference) { \
966 int skip = source_->GetInt(); \ 976 int skip = source_->GetInt(); \
967 current = reinterpret_cast<Object**>( \ 977 current = reinterpret_cast<Object**>( \
968 reinterpret_cast<Address>(current) + skip); \ 978 reinterpret_cast<Address>(current) + skip); \
969 int reference_id = source_->GetInt(); \ 979 int reference_id = source_->GetInt(); \
970 Address address = external_reference_decoder_->Decode(reference_id); \ 980 Address address = external_reference_decoder_->Decode(reference_id); \
971 new_object = reinterpret_cast<Object*>(address); \ 981 new_object = reinterpret_cast<Object*>(address); \
972 } else if (where == kBackref) { \ 982 } else if (where == kBackref) { \
973 emit_write_barrier = (space_number == NEW_SPACE); \ 983 emit_write_barrier = (space_number == NEW_SPACE); \
974 new_object = GetAddressFromEnd(data & kSpaceMask); \ 984 new_object = GetAddressFromEnd(data & kSpaceMask); \
985 if (deserializing_user_code()) { \
986 new_object = ProcessBackRefInSerializedCode(new_object); \
987 } \
975 } else if (where == kBuiltin) { \ 988 } else if (where == kBuiltin) { \
976 ASSERT(deserializing_user_code()); \ 989 ASSERT(deserializing_user_code()); \
977 int builtin_id = source_->GetInt(); \ 990 int builtin_id = source_->GetInt(); \
978 ASSERT_LE(0, builtin_id); \ 991 ASSERT_LE(0, builtin_id); \
979 ASSERT_LT(builtin_id, Builtins::builtin_count); \ 992 ASSERT_LT(builtin_id, Builtins::builtin_count); \
980 Builtins::Name name = static_cast<Builtins::Name>(builtin_id); \ 993 Builtins::Name name = static_cast<Builtins::Name>(builtin_id); \
981 new_object = isolate->builtins()->builtin(name); \ 994 new_object = isolate->builtins()->builtin(name); \
982 emit_write_barrier = false; \ 995 emit_write_barrier = false; \
983 } else if (where == kAttachedReference) { \ 996 } else if (where == kAttachedReference) { \
984 ASSERT(deserializing_user_code()); \ 997 ASSERT(deserializing_user_code()); \
985 int index = source_->GetInt(); \ 998 int index = source_->GetInt(); \
986 new_object = attached_objects_->at(index); \ 999 new_object = attached_objects_->at(index); \
987 emit_write_barrier = isolate->heap()->InNewSpace(new_object); \ 1000 emit_write_barrier = isolate->heap()->InNewSpace(new_object); \
988 } else { \ 1001 } else { \
989 ASSERT(where == kBackrefWithSkip); \ 1002 ASSERT(where == kBackrefWithSkip); \
990 int skip = source_->GetInt(); \ 1003 int skip = source_->GetInt(); \
991 current = reinterpret_cast<Object**>( \ 1004 current = reinterpret_cast<Object**>( \
992 reinterpret_cast<Address>(current) + skip); \ 1005 reinterpret_cast<Address>(current) + skip); \
993 emit_write_barrier = (space_number == NEW_SPACE); \ 1006 emit_write_barrier = (space_number == NEW_SPACE); \
994 new_object = GetAddressFromEnd(data & kSpaceMask); \ 1007 new_object = GetAddressFromEnd(data & kSpaceMask); \
1008 if (deserializing_user_code()) { \
1009 new_object = ProcessBackRefInSerializedCode(new_object); \
1010 } \
995 } \ 1011 } \
996 if (within == kInnerPointer) { \ 1012 if (within == kInnerPointer) { \
997 if (space_number != CODE_SPACE || new_object->IsCode()) { \ 1013 if (space_number != CODE_SPACE || new_object->IsCode()) { \
998 Code* new_code_object = reinterpret_cast<Code*>(new_object); \ 1014 Code* new_code_object = reinterpret_cast<Code*>(new_object); \
999 new_object = \ 1015 new_object = \
1000 reinterpret_cast<Object*>(new_code_object->instruction_start()); \ 1016 reinterpret_cast<Object*>(new_code_object->instruction_start()); \
1001 } else { \ 1017 } else { \
1002 ASSERT(space_number == CODE_SPACE); \ 1018 ASSERT(space_number == CODE_SPACE); \
1003 Cell* cell = Cell::cast(new_object); \ 1019 Cell* cell = Cell::cast(new_object); \
1004 new_object = reinterpret_cast<Object*>(cell->ValueAddress()); \ 1020 new_object = reinterpret_cast<Object*>(cell->ValueAddress()); \
(...skipping 1040 matching lines...) Expand 10 before | Expand all | Expand 10 after
2045 2061
2046 int SerializedCodeData::CheckSum(String* string) { 2062 int SerializedCodeData::CheckSum(String* string) {
2047 int checksum = Version::Hash(); 2063 int checksum = Version::Hash();
2048 #ifdef DEBUG 2064 #ifdef DEBUG
2049 uint32_t seed = static_cast<uint32_t>(checksum); 2065 uint32_t seed = static_cast<uint32_t>(checksum);
2050 checksum = static_cast<int>(IteratingStringHasher::Hash(string, seed)); 2066 checksum = static_cast<int>(IteratingStringHasher::Hash(string, seed));
2051 #endif // DEBUG 2067 #endif // DEBUG
2052 return checksum; 2068 return checksum;
2053 } 2069 }
2054 } } // namespace v8::internal 2070 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/serialize.h ('k') | test/cctest/test-serialize.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698