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

Side by Side Diff: src/objects.cc

Issue 12546024: Consistently pass a Heap* to HashTable-related AsObject methods. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 9 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/objects.h ('k') | src/objects-inl.h » ('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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 6219 matching lines...) Expand 10 before | Expand all | Expand 10 after
6230 6230
6231 uint32_t Hash() { return NameFlagsHashHelper(name_, flags_); } 6231 uint32_t Hash() { return NameFlagsHashHelper(name_, flags_); }
6232 6232
6233 uint32_t HashForObject(Object* obj) { 6233 uint32_t HashForObject(Object* obj) {
6234 FixedArray* pair = FixedArray::cast(obj); 6234 FixedArray* pair = FixedArray::cast(obj);
6235 Name* name = Name::cast(pair->get(0)); 6235 Name* name = Name::cast(pair->get(0));
6236 Code* code = Code::cast(pair->get(1)); 6236 Code* code = Code::cast(pair->get(1));
6237 return NameFlagsHashHelper(name, code->flags()); 6237 return NameFlagsHashHelper(name, code->flags());
6238 } 6238 }
6239 6239
6240 MUST_USE_RESULT MaybeObject* AsObject() { 6240 MUST_USE_RESULT MaybeObject* AsObject(Heap* heap) {
6241 ASSERT(code_ != NULL); 6241 ASSERT(code_ != NULL);
6242 Object* obj; 6242 Object* obj;
6243 { MaybeObject* maybe_obj = code_->GetHeap()->AllocateFixedArray(2); 6243 { MaybeObject* maybe_obj = heap->AllocateFixedArray(2);
6244 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 6244 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
6245 } 6245 }
6246 FixedArray* pair = FixedArray::cast(obj); 6246 FixedArray* pair = FixedArray::cast(obj);
6247 pair->set(0, name_); 6247 pair->set(0, name_);
6248 pair->set(1, code_); 6248 pair->set(1, code_);
6249 return pair; 6249 return pair;
6250 } 6250 }
6251 6251
6252 private: 6252 private:
6253 Name* name_; 6253 Name* name_;
(...skipping 16 matching lines...) Expand all
6270 Object* obj; 6270 Object* obj;
6271 { MaybeObject* maybe_obj = EnsureCapacity(1, &key); 6271 { MaybeObject* maybe_obj = EnsureCapacity(1, &key);
6272 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 6272 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
6273 } 6273 }
6274 6274
6275 // Don't use |this|, as the table might have grown. 6275 // Don't use |this|, as the table might have grown.
6276 CodeCacheHashTable* cache = reinterpret_cast<CodeCacheHashTable*>(obj); 6276 CodeCacheHashTable* cache = reinterpret_cast<CodeCacheHashTable*>(obj);
6277 6277
6278 int entry = cache->FindInsertionEntry(key.Hash()); 6278 int entry = cache->FindInsertionEntry(key.Hash());
6279 Object* k; 6279 Object* k;
6280 { MaybeObject* maybe_k = key.AsObject(); 6280 { MaybeObject* maybe_k = key.AsObject(GetHeap());
6281 if (!maybe_k->ToObject(&k)) return maybe_k; 6281 if (!maybe_k->ToObject(&k)) return maybe_k;
6282 } 6282 }
6283 6283
6284 cache->set(EntryToIndex(entry), k); 6284 cache->set(EntryToIndex(entry), k);
6285 cache->set(EntryToIndex(entry) + 1, code); 6285 cache->set(EntryToIndex(entry) + 1, code);
6286 cache->ElementAdded(); 6286 cache->ElementAdded();
6287 return cache; 6287 return cache;
6288 } 6288 }
6289 6289
6290 6290
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
6403 return MapsHashHelper(maps_, code_flags_); 6403 return MapsHashHelper(maps_, code_flags_);
6404 } 6404 }
6405 6405
6406 uint32_t HashForObject(Object* obj) { 6406 uint32_t HashForObject(Object* obj) {
6407 MapHandleList other_maps(kDefaultListAllocationSize); 6407 MapHandleList other_maps(kDefaultListAllocationSize);
6408 int other_flags; 6408 int other_flags;
6409 FromObject(obj, &other_flags, &other_maps); 6409 FromObject(obj, &other_flags, &other_maps);
6410 return MapsHashHelper(&other_maps, other_flags); 6410 return MapsHashHelper(&other_maps, other_flags);
6411 } 6411 }
6412 6412
6413 MUST_USE_RESULT MaybeObject* AsObject() { 6413 MUST_USE_RESULT MaybeObject* AsObject(Heap* heap) {
6414 Object* obj; 6414 Object* obj;
6415 // The maps in |maps_| must be copied to a newly allocated FixedArray, 6415 // The maps in |maps_| must be copied to a newly allocated FixedArray,
6416 // both because the referenced MapList is short-lived, and because C++ 6416 // both because the referenced MapList is short-lived, and because C++
6417 // objects can't be stored in the heap anyway. 6417 // objects can't be stored in the heap anyway.
6418 { MaybeObject* maybe_obj = 6418 { MaybeObject* maybe_obj =
6419 HEAP->AllocateUninitializedFixedArray(maps_->length() + 1); 6419 heap->AllocateUninitializedFixedArray(maps_->length() + 1);
6420 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 6420 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
6421 } 6421 }
6422 FixedArray* list = FixedArray::cast(obj); 6422 FixedArray* list = FixedArray::cast(obj);
6423 list->set(0, Smi::FromInt(code_flags_)); 6423 list->set(0, Smi::FromInt(code_flags_));
6424 for (int i = 0; i < maps_->length(); ++i) { 6424 for (int i = 0; i < maps_->length(); ++i) {
6425 list->set(i + 1, *maps_->at(i)); 6425 list->set(i + 1, *maps_->at(i));
6426 } 6426 }
6427 return list; 6427 return list;
6428 } 6428 }
6429 6429
(...skipping 29 matching lines...) Expand all
6459 int code_flags, 6459 int code_flags,
6460 Code* code) { 6460 Code* code) {
6461 PolymorphicCodeCacheHashTableKey key(maps, code_flags); 6461 PolymorphicCodeCacheHashTableKey key(maps, code_flags);
6462 Object* obj; 6462 Object* obj;
6463 { MaybeObject* maybe_obj = EnsureCapacity(1, &key); 6463 { MaybeObject* maybe_obj = EnsureCapacity(1, &key);
6464 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 6464 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
6465 } 6465 }
6466 PolymorphicCodeCacheHashTable* cache = 6466 PolymorphicCodeCacheHashTable* cache =
6467 reinterpret_cast<PolymorphicCodeCacheHashTable*>(obj); 6467 reinterpret_cast<PolymorphicCodeCacheHashTable*>(obj);
6468 int entry = cache->FindInsertionEntry(key.Hash()); 6468 int entry = cache->FindInsertionEntry(key.Hash());
6469 { MaybeObject* maybe_obj = key.AsObject(); 6469 { MaybeObject* maybe_obj = key.AsObject(GetHeap());
6470 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 6470 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
6471 } 6471 }
6472 cache->set(EntryToIndex(entry), obj); 6472 cache->set(EntryToIndex(entry), obj);
6473 cache->set(EntryToIndex(entry) + 1, code); 6473 cache->set(EntryToIndex(entry) + 1, code);
6474 cache->ElementAdded(); 6474 cache->ElementAdded();
6475 return cache; 6475 return cache;
6476 } 6476 }
6477 6477
6478 6478
6479 MaybeObject* FixedArray::AddKeysFromJSArray(JSArray* array) { 6479 MaybeObject* FixedArray::AddKeysFromJSArray(JSArray* array) {
(...skipping 5267 matching lines...) Expand 10 before | Expand all | Expand 10 after
11747 if (hash_ != HashForObject(string)) { 11747 if (hash_ != HashForObject(string)) {
11748 return false; 11748 return false;
11749 } 11749 }
11750 return string_->Equals(String::cast(string)); 11750 return string_->Equals(String::cast(string));
11751 } 11751 }
11752 11752
11753 uint32_t Hash() { return hash_; } 11753 uint32_t Hash() { return hash_; }
11754 11754
11755 uint32_t HashForObject(Object* other) { return String::cast(other)->Hash(); } 11755 uint32_t HashForObject(Object* other) { return String::cast(other)->Hash(); }
11756 11756
11757 Object* AsObject() { return string_; } 11757 Object* AsObject(Heap* heap) { return string_; }
11758 11758
11759 String* string_; 11759 String* string_;
11760 uint32_t hash_; 11760 uint32_t hash_;
11761 }; 11761 };
11762 11762
11763 11763
11764 // StringSharedKeys are used as keys in the eval cache. 11764 // StringSharedKeys are used as keys in the eval cache.
11765 class StringSharedKey : public HashTableKey { 11765 class StringSharedKey : public HashTableKey {
11766 public: 11766 public:
11767 StringSharedKey(String* source, 11767 StringSharedKey(String* source,
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
11822 int language_unchecked = Smi::cast(other_array->get(2))->value(); 11822 int language_unchecked = Smi::cast(other_array->get(2))->value();
11823 ASSERT(language_unchecked == CLASSIC_MODE || 11823 ASSERT(language_unchecked == CLASSIC_MODE ||
11824 language_unchecked == STRICT_MODE || 11824 language_unchecked == STRICT_MODE ||
11825 language_unchecked == EXTENDED_MODE); 11825 language_unchecked == EXTENDED_MODE);
11826 LanguageMode language_mode = static_cast<LanguageMode>(language_unchecked); 11826 LanguageMode language_mode = static_cast<LanguageMode>(language_unchecked);
11827 int scope_position = Smi::cast(other_array->get(3))->value(); 11827 int scope_position = Smi::cast(other_array->get(3))->value();
11828 return StringSharedHashHelper( 11828 return StringSharedHashHelper(
11829 source, shared, language_mode, scope_position); 11829 source, shared, language_mode, scope_position);
11830 } 11830 }
11831 11831
11832 MUST_USE_RESULT MaybeObject* AsObject() { 11832 MUST_USE_RESULT MaybeObject* AsObject(Heap* heap) {
11833 Object* obj; 11833 Object* obj;
11834 { MaybeObject* maybe_obj = source_->GetHeap()->AllocateFixedArray(4); 11834 { MaybeObject* maybe_obj = heap->AllocateFixedArray(4);
11835 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 11835 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
11836 } 11836 }
11837 FixedArray* other_array = FixedArray::cast(obj); 11837 FixedArray* other_array = FixedArray::cast(obj);
11838 other_array->set(0, shared_); 11838 other_array->set(0, shared_);
11839 other_array->set(1, source_); 11839 other_array->set(1, source_);
11840 other_array->set(2, Smi::FromInt(language_mode_)); 11840 other_array->set(2, Smi::FromInt(language_mode_));
11841 other_array->set(3, Smi::FromInt(scope_position_)); 11841 other_array->set(3, Smi::FromInt(scope_position_));
11842 return other_array; 11842 return other_array;
11843 } 11843 }
11844 11844
(...skipping 17 matching lines...) Expand all
11862 // compares the search key to the found object, rather than comparing 11862 // compares the search key to the found object, rather than comparing
11863 // a key to a key. 11863 // a key to a key.
11864 bool IsMatch(Object* obj) { 11864 bool IsMatch(Object* obj) {
11865 FixedArray* val = FixedArray::cast(obj); 11865 FixedArray* val = FixedArray::cast(obj);
11866 return string_->Equals(String::cast(val->get(JSRegExp::kSourceIndex))) 11866 return string_->Equals(String::cast(val->get(JSRegExp::kSourceIndex)))
11867 && (flags_ == val->get(JSRegExp::kFlagsIndex)); 11867 && (flags_ == val->get(JSRegExp::kFlagsIndex));
11868 } 11868 }
11869 11869
11870 uint32_t Hash() { return RegExpHash(string_, flags_); } 11870 uint32_t Hash() { return RegExpHash(string_, flags_); }
11871 11871
11872 Object* AsObject() { 11872 Object* AsObject(Heap* heap) {
11873 // Plain hash maps, which is where regexp keys are used, don't 11873 // Plain hash maps, which is where regexp keys are used, don't
11874 // use this function. 11874 // use this function.
11875 UNREACHABLE(); 11875 UNREACHABLE();
11876 return NULL; 11876 return NULL;
11877 } 11877 }
11878 11878
11879 uint32_t HashForObject(Object* obj) { 11879 uint32_t HashForObject(Object* obj) {
11880 FixedArray* val = FixedArray::cast(obj); 11880 FixedArray* val = FixedArray::cast(obj);
11881 return RegExpHash(String::cast(val->get(JSRegExp::kSourceIndex)), 11881 return RegExpHash(String::cast(val->get(JSRegExp::kSourceIndex)),
11882 Smi::cast(val->get(JSRegExp::kFlagsIndex))); 11882 Smi::cast(val->get(JSRegExp::kFlagsIndex)));
(...skipping 22 matching lines...) Expand all
11905 hash_field_ = StringHasher::ComputeUtf8Hash(string_, seed_, &chars_); 11905 hash_field_ = StringHasher::ComputeUtf8Hash(string_, seed_, &chars_);
11906 uint32_t result = hash_field_ >> String::kHashShift; 11906 uint32_t result = hash_field_ >> String::kHashShift;
11907 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. 11907 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed.
11908 return result; 11908 return result;
11909 } 11909 }
11910 11910
11911 uint32_t HashForObject(Object* other) { 11911 uint32_t HashForObject(Object* other) {
11912 return String::cast(other)->Hash(); 11912 return String::cast(other)->Hash();
11913 } 11913 }
11914 11914
11915 MaybeObject* AsObject() { 11915 MaybeObject* AsObject(Heap* heap) {
11916 if (hash_field_ == 0) Hash(); 11916 if (hash_field_ == 0) Hash();
11917 return Isolate::Current()->heap()->AllocateInternalizedStringFromUtf8( 11917 return heap->AllocateInternalizedStringFromUtf8(string_,
11918 string_, chars_, hash_field_); 11918 chars_,
11919 hash_field_);
11919 } 11920 }
11920 11921
11921 Vector<const char> string_; 11922 Vector<const char> string_;
11922 uint32_t hash_field_; 11923 uint32_t hash_field_;
11923 int chars_; // Caches the number of characters when computing the hash code. 11924 int chars_; // Caches the number of characters when computing the hash code.
11924 uint32_t seed_; 11925 uint32_t seed_;
11925 }; 11926 };
11926 11927
11927 11928
11928 template <typename Char> 11929 template <typename Char>
(...skipping 26 matching lines...) Expand all
11955 11956
11956 class OneByteStringKey : public SequentialStringKey<uint8_t> { 11957 class OneByteStringKey : public SequentialStringKey<uint8_t> {
11957 public: 11958 public:
11958 OneByteStringKey(Vector<const uint8_t> str, uint32_t seed) 11959 OneByteStringKey(Vector<const uint8_t> str, uint32_t seed)
11959 : SequentialStringKey<uint8_t>(str, seed) { } 11960 : SequentialStringKey<uint8_t>(str, seed) { }
11960 11961
11961 bool IsMatch(Object* string) { 11962 bool IsMatch(Object* string) {
11962 return String::cast(string)->IsOneByteEqualTo(string_); 11963 return String::cast(string)->IsOneByteEqualTo(string_);
11963 } 11964 }
11964 11965
11965 MaybeObject* AsObject() { 11966 MaybeObject* AsObject(Heap* heap) {
11966 if (hash_field_ == 0) Hash(); 11967 if (hash_field_ == 0) Hash();
11967 return HEAP->AllocateOneByteInternalizedString(string_, hash_field_); 11968 return heap->AllocateOneByteInternalizedString(string_, hash_field_);
11968 } 11969 }
11969 }; 11970 };
11970 11971
11971 11972
11972 class SubStringOneByteStringKey : public HashTableKey { 11973 class SubStringOneByteStringKey : public HashTableKey {
11973 public: 11974 public:
11974 explicit SubStringOneByteStringKey(Handle<SeqOneByteString> string, 11975 explicit SubStringOneByteStringKey(Handle<SeqOneByteString> string,
11975 int from, 11976 int from,
11976 int length) 11977 int length)
11977 : string_(string), from_(from), length_(length) { } 11978 : string_(string), from_(from), length_(length) { }
(...skipping 12 matching lines...) Expand all
11990 11991
11991 uint32_t HashForObject(Object* other) { 11992 uint32_t HashForObject(Object* other) {
11992 return String::cast(other)->Hash(); 11993 return String::cast(other)->Hash();
11993 } 11994 }
11994 11995
11995 bool IsMatch(Object* string) { 11996 bool IsMatch(Object* string) {
11996 Vector<const uint8_t> chars(string_->GetChars() + from_, length_); 11997 Vector<const uint8_t> chars(string_->GetChars() + from_, length_);
11997 return String::cast(string)->IsOneByteEqualTo(chars); 11998 return String::cast(string)->IsOneByteEqualTo(chars);
11998 } 11999 }
11999 12000
12000 MaybeObject* AsObject() { 12001 MaybeObject* AsObject(Heap* heap) {
12001 if (hash_field_ == 0) Hash(); 12002 if (hash_field_ == 0) Hash();
12002 Vector<const uint8_t> chars(string_->GetChars() + from_, length_); 12003 Vector<const uint8_t> chars(string_->GetChars() + from_, length_);
12003 return HEAP->AllocateOneByteInternalizedString(chars, hash_field_); 12004 return heap->AllocateOneByteInternalizedString(chars, hash_field_);
12004 } 12005 }
12005 12006
12006 private: 12007 private:
12007 Handle<SeqOneByteString> string_; 12008 Handle<SeqOneByteString> string_;
12008 int from_; 12009 int from_;
12009 int length_; 12010 int length_;
12010 uint32_t hash_field_; 12011 uint32_t hash_field_;
12011 }; 12012 };
12012 12013
12013 12014
12014 class TwoByteStringKey : public SequentialStringKey<uc16> { 12015 class TwoByteStringKey : public SequentialStringKey<uc16> {
12015 public: 12016 public:
12016 explicit TwoByteStringKey(Vector<const uc16> str, uint32_t seed) 12017 explicit TwoByteStringKey(Vector<const uc16> str, uint32_t seed)
12017 : SequentialStringKey<uc16>(str, seed) { } 12018 : SequentialStringKey<uc16>(str, seed) { }
12018 12019
12019 bool IsMatch(Object* string) { 12020 bool IsMatch(Object* string) {
12020 return String::cast(string)->IsTwoByteEqualTo(string_); 12021 return String::cast(string)->IsTwoByteEqualTo(string_);
12021 } 12022 }
12022 12023
12023 MaybeObject* AsObject() { 12024 MaybeObject* AsObject(Heap* heap) {
12024 if (hash_field_ == 0) Hash(); 12025 if (hash_field_ == 0) Hash();
12025 return HEAP->AllocateTwoByteInternalizedString(string_, hash_field_); 12026 return heap->AllocateTwoByteInternalizedString(string_, hash_field_);
12026 } 12027 }
12027 }; 12028 };
12028 12029
12029 12030
12030 // InternalizedStringKey carries a string/internalized-string object as key. 12031 // InternalizedStringKey carries a string/internalized-string object as key.
12031 class InternalizedStringKey : public HashTableKey { 12032 class InternalizedStringKey : public HashTableKey {
12032 public: 12033 public:
12033 explicit InternalizedStringKey(String* string) 12034 explicit InternalizedStringKey(String* string)
12034 : string_(string) { } 12035 : string_(string) { }
12035 12036
12036 bool IsMatch(Object* string) { 12037 bool IsMatch(Object* string) {
12037 return String::cast(string)->Equals(string_); 12038 return String::cast(string)->Equals(string_);
12038 } 12039 }
12039 12040
12040 uint32_t Hash() { return string_->Hash(); } 12041 uint32_t Hash() { return string_->Hash(); }
12041 12042
12042 uint32_t HashForObject(Object* other) { 12043 uint32_t HashForObject(Object* other) {
12043 return String::cast(other)->Hash(); 12044 return String::cast(other)->Hash();
12044 } 12045 }
12045 12046
12046 MaybeObject* AsObject() { 12047 MaybeObject* AsObject(Heap* heap) {
12047 // Attempt to flatten the string, so that internalized strings will most 12048 // Attempt to flatten the string, so that internalized strings will most
12048 // often be flat strings. 12049 // often be flat strings.
12049 string_ = string_->TryFlattenGetString(); 12050 string_ = string_->TryFlattenGetString();
12050 Heap* heap = string_->GetHeap();
12051 // Internalize the string if possible. 12051 // Internalize the string if possible.
12052 Map* map = heap->InternalizedStringMapForString(string_); 12052 Map* map = heap->InternalizedStringMapForString(string_);
12053 if (map != NULL) { 12053 if (map != NULL) {
12054 string_->set_map_no_write_barrier(map); 12054 string_->set_map_no_write_barrier(map);
12055 ASSERT(string_->IsInternalizedString()); 12055 ASSERT(string_->IsInternalizedString());
12056 return string_; 12056 return string_;
12057 } 12057 }
12058 // Otherwise allocate a new internalized string. 12058 // Otherwise allocate a new internalized string.
12059 return heap->AllocateInternalizedStringImpl( 12059 return heap->AllocateInternalizedStringImpl(
12060 string_, string_->length(), string_->hash_field()); 12060 string_, string_->length(), string_->hash_field());
(...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after
12864 if (other->Get(0) != c1_) return false; 12864 if (other->Get(0) != c1_) return false;
12865 return other->Get(1) == c2_; 12865 return other->Get(1) == c2_;
12866 } 12866 }
12867 12867
12868 uint32_t Hash() { return hash_; } 12868 uint32_t Hash() { return hash_; }
12869 uint32_t HashForObject(Object* key) { 12869 uint32_t HashForObject(Object* key) {
12870 if (!key->IsString()) return 0; 12870 if (!key->IsString()) return 0;
12871 return String::cast(key)->Hash(); 12871 return String::cast(key)->Hash();
12872 } 12872 }
12873 12873
12874 Object* AsObject() { 12874 Object* AsObject(Heap* heap) {
12875 // The TwoCharHashTableKey is only used for looking in the string 12875 // The TwoCharHashTableKey is only used for looking in the string
12876 // table, not for adding to it. 12876 // table, not for adding to it.
12877 UNREACHABLE(); 12877 UNREACHABLE();
12878 return NULL; 12878 return NULL;
12879 } 12879 }
12880 12880
12881 private: 12881 private:
12882 uint16_t c1_; 12882 uint16_t c1_;
12883 uint16_t c2_; 12883 uint16_t c2_;
12884 uint32_t hash_; 12884 uint32_t hash_;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
12953 } 12953 }
12954 12954
12955 // Adding new string. Grow table if needed. 12955 // Adding new string. Grow table if needed.
12956 Object* obj; 12956 Object* obj;
12957 { MaybeObject* maybe_obj = EnsureCapacity(1, key); 12957 { MaybeObject* maybe_obj = EnsureCapacity(1, key);
12958 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 12958 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
12959 } 12959 }
12960 12960
12961 // Create string object. 12961 // Create string object.
12962 Object* string; 12962 Object* string;
12963 { MaybeObject* maybe_string = key->AsObject(); 12963 { MaybeObject* maybe_string = key->AsObject(GetHeap());
12964 if (!maybe_string->ToObject(&string)) return maybe_string; 12964 if (!maybe_string->ToObject(&string)) return maybe_string;
12965 } 12965 }
12966 12966
12967 // If the string table grew as part of EnsureCapacity, obj is not 12967 // If the string table grew as part of EnsureCapacity, obj is not
12968 // the current string table and therefore we cannot use 12968 // the current string table and therefore we cannot use
12969 // StringTable::cast here. 12969 // StringTable::cast here.
12970 StringTable* table = reinterpret_cast<StringTable*>(obj); 12970 StringTable* table = reinterpret_cast<StringTable*>(obj);
12971 12971
12972 // Add the new string and return it along with the string table. 12972 // Add the new string and return it along with the string table.
12973 entry = table->FindInsertionEntry(key->Hash()); 12973 entry = table->FindInsertionEntry(key->Hash());
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
13030 SharedFunctionInfo* shared = context->closure()->shared(); 13030 SharedFunctionInfo* shared = context->closure()->shared();
13031 StringSharedKey key(src, 13031 StringSharedKey key(src,
13032 shared, 13032 shared,
13033 CurrentGlobalLanguageMode(), 13033 CurrentGlobalLanguageMode(),
13034 RelocInfo::kNoPosition); 13034 RelocInfo::kNoPosition);
13035 CompilationCacheTable* cache; 13035 CompilationCacheTable* cache;
13036 MaybeObject* maybe_cache = EnsureCapacity(1, &key); 13036 MaybeObject* maybe_cache = EnsureCapacity(1, &key);
13037 if (!maybe_cache->To(&cache)) return maybe_cache; 13037 if (!maybe_cache->To(&cache)) return maybe_cache;
13038 13038
13039 Object* k; 13039 Object* k;
13040 MaybeObject* maybe_k = key.AsObject(); 13040 MaybeObject* maybe_k = key.AsObject(GetHeap());
13041 if (!maybe_k->To(&k)) return maybe_k; 13041 if (!maybe_k->To(&k)) return maybe_k;
13042 13042
13043 int entry = cache->FindInsertionEntry(key.Hash()); 13043 int entry = cache->FindInsertionEntry(key.Hash());
13044 cache->set(EntryToIndex(entry), k); 13044 cache->set(EntryToIndex(entry), k);
13045 cache->set(EntryToIndex(entry) + 1, value); 13045 cache->set(EntryToIndex(entry) + 1, value);
13046 cache->ElementAdded(); 13046 cache->ElementAdded();
13047 return cache; 13047 return cache;
13048 } 13048 }
13049 13049
13050 13050
13051 MaybeObject* CompilationCacheTable::PutEval(String* src, 13051 MaybeObject* CompilationCacheTable::PutEval(String* src,
13052 Context* context, 13052 Context* context,
13053 SharedFunctionInfo* value, 13053 SharedFunctionInfo* value,
13054 int scope_position) { 13054 int scope_position) {
13055 StringSharedKey key(src, 13055 StringSharedKey key(src,
13056 context->closure()->shared(), 13056 context->closure()->shared(),
13057 value->language_mode(), 13057 value->language_mode(),
13058 scope_position); 13058 scope_position);
13059 Object* obj; 13059 Object* obj;
13060 { MaybeObject* maybe_obj = EnsureCapacity(1, &key); 13060 { MaybeObject* maybe_obj = EnsureCapacity(1, &key);
13061 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 13061 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
13062 } 13062 }
13063 13063
13064 CompilationCacheTable* cache = 13064 CompilationCacheTable* cache =
13065 reinterpret_cast<CompilationCacheTable*>(obj); 13065 reinterpret_cast<CompilationCacheTable*>(obj);
13066 int entry = cache->FindInsertionEntry(key.Hash()); 13066 int entry = cache->FindInsertionEntry(key.Hash());
13067 13067
13068 Object* k; 13068 Object* k;
13069 { MaybeObject* maybe_k = key.AsObject(); 13069 { MaybeObject* maybe_k = key.AsObject(GetHeap());
13070 if (!maybe_k->ToObject(&k)) return maybe_k; 13070 if (!maybe_k->ToObject(&k)) return maybe_k;
13071 } 13071 }
13072 13072
13073 cache->set(EntryToIndex(entry), k); 13073 cache->set(EntryToIndex(entry), k);
13074 cache->set(EntryToIndex(entry) + 1, value); 13074 cache->set(EntryToIndex(entry) + 1, value);
13075 cache->ElementAdded(); 13075 cache->ElementAdded();
13076 return cache; 13076 return cache;
13077 } 13077 }
13078 13078
13079 13079
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
13133 uint32_t HashForObject(Object* obj) { 13133 uint32_t HashForObject(Object* obj) {
13134 FixedArray* strings = FixedArray::cast(obj); 13134 FixedArray* strings = FixedArray::cast(obj);
13135 int len = strings->length(); 13135 int len = strings->length();
13136 uint32_t hash = 0; 13136 uint32_t hash = 0;
13137 for (int i = 0; i < len; i++) { 13137 for (int i = 0; i < len; i++) {
13138 hash ^= String::cast(strings->get(i))->Hash(); 13138 hash ^= String::cast(strings->get(i))->Hash();
13139 } 13139 }
13140 return hash; 13140 return hash;
13141 } 13141 }
13142 13142
13143 Object* AsObject() { return strings_; } 13143 Object* AsObject(Heap* heap) { return strings_; }
13144 13144
13145 private: 13145 private:
13146 FixedArray* strings_; 13146 FixedArray* strings_;
13147 }; 13147 };
13148 13148
13149 13149
13150 Object* MapCache::Lookup(FixedArray* array) { 13150 Object* MapCache::Lookup(FixedArray* array) {
13151 StringsKey key(array); 13151 StringsKey key(array);
13152 int entry = FindEntry(&key); 13152 int entry = FindEntry(&key);
13153 if (entry == kNotFound) return GetHeap()->undefined_value(); 13153 if (entry == kNotFound) return GetHeap()->undefined_value();
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
13297 return this; 13297 return this;
13298 } 13298 }
13299 13299
13300 // Check whether the dictionary should be extended. 13300 // Check whether the dictionary should be extended.
13301 Object* obj; 13301 Object* obj;
13302 { MaybeObject* maybe_obj = EnsureCapacity(1, key); 13302 { MaybeObject* maybe_obj = EnsureCapacity(1, key);
13303 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 13303 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
13304 } 13304 }
13305 13305
13306 Object* k; 13306 Object* k;
13307 { MaybeObject* maybe_k = Shape::AsObject(this->GetIsolate(), key); 13307 { MaybeObject* maybe_k = Shape::AsObject(this->GetHeap(), key);
13308 if (!maybe_k->ToObject(&k)) return maybe_k; 13308 if (!maybe_k->ToObject(&k)) return maybe_k;
13309 } 13309 }
13310 PropertyDetails details = PropertyDetails(NONE, NORMAL); 13310 PropertyDetails details = PropertyDetails(NONE, NORMAL);
13311 13311
13312 return Dictionary<Shape, Key>::cast(obj)->AddEntry(key, value, details, 13312 return Dictionary<Shape, Key>::cast(obj)->AddEntry(key, value, details,
13313 Dictionary<Shape, Key>::Hash(key)); 13313 Dictionary<Shape, Key>::Hash(key));
13314 } 13314 }
13315 13315
13316 13316
13317 template<typename Shape, typename Key> 13317 template<typename Shape, typename Key>
(...skipping 16 matching lines...) Expand all
13334 13334
13335 13335
13336 // Add a key, value pair to the dictionary. 13336 // Add a key, value pair to the dictionary.
13337 template<typename Shape, typename Key> 13337 template<typename Shape, typename Key>
13338 MaybeObject* Dictionary<Shape, Key>::AddEntry(Key key, 13338 MaybeObject* Dictionary<Shape, Key>::AddEntry(Key key,
13339 Object* value, 13339 Object* value,
13340 PropertyDetails details, 13340 PropertyDetails details,
13341 uint32_t hash) { 13341 uint32_t hash) {
13342 // Compute the key object. 13342 // Compute the key object.
13343 Object* k; 13343 Object* k;
13344 { MaybeObject* maybe_k = Shape::AsObject(this->GetIsolate(), key); 13344 { MaybeObject* maybe_k = Shape::AsObject(this->GetHeap(), key);
13345 if (!maybe_k->ToObject(&k)) return maybe_k; 13345 if (!maybe_k->ToObject(&k)) return maybe_k;
13346 } 13346 }
13347 13347
13348 uint32_t entry = Dictionary<Shape, Key>::FindInsertionEntry(hash); 13348 uint32_t entry = Dictionary<Shape, Key>::FindInsertionEntry(hash);
13349 // Insert element at empty or deleted entry 13349 // Insert element at empty or deleted entry
13350 if (!details.IsDeleted() && 13350 if (!details.IsDeleted() &&
13351 details.dictionary_index() == 0 && 13351 details.dictionary_index() == 0 &&
13352 Shape::kIsEnumerable) { 13352 Shape::kIsEnumerable) {
13353 // Assign an enumeration index to the property and update 13353 // Assign an enumeration index to the property and update
13354 // SetNextEnumerationIndex. 13354 // SetNextEnumerationIndex.
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
13435 MaybeObject* SeededNumberDictionary::Set(uint32_t key, 13435 MaybeObject* SeededNumberDictionary::Set(uint32_t key,
13436 Object* value, 13436 Object* value,
13437 PropertyDetails details) { 13437 PropertyDetails details) {
13438 int entry = FindEntry(key); 13438 int entry = FindEntry(key);
13439 if (entry == kNotFound) return AddNumberEntry(key, value, details); 13439 if (entry == kNotFound) return AddNumberEntry(key, value, details);
13440 // Preserve enumeration index. 13440 // Preserve enumeration index.
13441 details = PropertyDetails(details.attributes(), 13441 details = PropertyDetails(details.attributes(),
13442 details.type(), 13442 details.type(),
13443 DetailsAt(entry).dictionary_index()); 13443 DetailsAt(entry).dictionary_index());
13444 MaybeObject* maybe_object_key = 13444 MaybeObject* maybe_object_key =
13445 SeededNumberDictionaryShape::AsObject(GetIsolate(), key); 13445 SeededNumberDictionaryShape::AsObject(GetHeap(), key);
13446 Object* object_key; 13446 Object* object_key;
13447 if (!maybe_object_key->ToObject(&object_key)) return maybe_object_key; 13447 if (!maybe_object_key->ToObject(&object_key)) return maybe_object_key;
13448 SetEntry(entry, object_key, value, details); 13448 SetEntry(entry, object_key, value, details);
13449 return this; 13449 return this;
13450 } 13450 }
13451 13451
13452 13452
13453 MaybeObject* UnseededNumberDictionary::Set(uint32_t key, 13453 MaybeObject* UnseededNumberDictionary::Set(uint32_t key,
13454 Object* value) { 13454 Object* value) {
13455 int entry = FindEntry(key); 13455 int entry = FindEntry(key);
13456 if (entry == kNotFound) return AddNumberEntry(key, value); 13456 if (entry == kNotFound) return AddNumberEntry(key, value);
13457 MaybeObject* maybe_object_key = 13457 MaybeObject* maybe_object_key =
13458 UnseededNumberDictionaryShape::AsObject(GetIsolate(), key); 13458 UnseededNumberDictionaryShape::AsObject(GetHeap(), key);
13459 Object* object_key; 13459 Object* object_key;
13460 if (!maybe_object_key->ToObject(&object_key)) return maybe_object_key; 13460 if (!maybe_object_key->ToObject(&object_key)) return maybe_object_key;
13461 SetEntry(entry, object_key, value); 13461 SetEntry(entry, object_key, value);
13462 return this; 13462 return this;
13463 } 13463 }
13464 13464
13465 13465
13466 13466
13467 template<typename Shape, typename Key> 13467 template<typename Shape, typename Key>
13468 int Dictionary<Shape, Key>::NumberOfElementsFilterAttributes( 13468 int Dictionary<Shape, Key>::NumberOfElementsFilterAttributes(
(...skipping 827 matching lines...) Expand 10 before | Expand all | Expand 10 after
14296 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); 14296 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER);
14297 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); 14297 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER);
14298 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); 14298 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER);
14299 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); 14299 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER);
14300 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); 14300 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER);
14301 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); 14301 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER);
14302 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); 14302 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER);
14303 } 14303 }
14304 14304
14305 } } // namespace v8::internal 14305 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698