| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index e4d25f9441a08b29bac4292db72aa403d1289846..1c39f98e249db4932960b3e67a6d5e6870a42589 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -7961,8 +7961,7 @@ class CodeCacheHashTableKey : public HashTableKey {
|
| CodeCacheHashTableKey(Handle<Name> name, Handle<Code> code)
|
| : name_(name), flags_(code->flags()), code_(code) { }
|
|
|
| -
|
| - bool IsMatch(Object* other) {
|
| + bool IsMatch(Object* other) V8_OVERRIDE {
|
| if (!other->IsFixedArray()) return false;
|
| FixedArray* pair = FixedArray::cast(other);
|
| Name* name = Name::cast(pair->get(0));
|
| @@ -7977,34 +7976,23 @@ class CodeCacheHashTableKey : public HashTableKey {
|
| return name->Hash() ^ flags;
|
| }
|
|
|
| - uint32_t Hash() { return NameFlagsHashHelper(*name_, flags_); }
|
| + uint32_t Hash() V8_OVERRIDE { return NameFlagsHashHelper(*name_, flags_); }
|
|
|
| - uint32_t HashForObject(Object* obj) {
|
| + uint32_t HashForObject(Object* obj) V8_OVERRIDE {
|
| FixedArray* pair = FixedArray::cast(obj);
|
| Name* name = Name::cast(pair->get(0));
|
| Code* code = Code::cast(pair->get(1));
|
| return NameFlagsHashHelper(name, code->flags());
|
| }
|
|
|
| - MUST_USE_RESULT MaybeObject* AsObject(Heap* heap) {
|
| + MUST_USE_RESULT Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE {
|
| Handle<Code> code = code_.ToHandleChecked();
|
| - Object* obj;
|
| - { MaybeObject* maybe_obj = heap->AllocateFixedArray(2);
|
| - if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| - }
|
| - FixedArray* pair = FixedArray::cast(obj);
|
| + Handle<FixedArray> pair = isolate->factory()->NewFixedArray(2);
|
| pair->set(0, *name_);
|
| pair->set(1, *code);
|
| return pair;
|
| }
|
|
|
| - Handle<FixedArray> AsHandle() {
|
| - Isolate* isolate = name_->GetIsolate();
|
| - CALL_HEAP_FUNCTION(isolate,
|
| - AsObject(isolate->heap()),
|
| - FixedArray);
|
| - }
|
| -
|
| private:
|
| Handle<Name> name_;
|
| Code::Flags flags_;
|
| @@ -8029,7 +8017,7 @@ Handle<CodeCacheHashTable> CodeCacheHashTable::Put(
|
| Handle<CodeCacheHashTable> new_cache = EnsureCapacity(cache, 1, &key);
|
|
|
| int entry = new_cache->FindInsertionEntry(key.Hash());
|
| - Handle<Object> k = key.AsHandle();
|
| + Handle<Object> k = key.AsHandle(cache->GetIsolate());
|
|
|
| new_cache->set(EntryToIndex(entry), *k);
|
| new_cache->set(EntryToIndex(entry) + 1, *code);
|
| @@ -8097,13 +8085,11 @@ Handle<Object> PolymorphicCodeCache::Lookup(MapHandleList* maps,
|
| class PolymorphicCodeCacheHashTableKey : public HashTableKey {
|
| public:
|
| // Callers must ensure that |maps| outlives the newly constructed object.
|
| - PolymorphicCodeCacheHashTableKey(
|
| - Isolate* isolate, MapHandleList* maps, int code_flags)
|
| - : isolate_(isolate),
|
| - maps_(maps),
|
| + PolymorphicCodeCacheHashTableKey(MapHandleList* maps, int code_flags)
|
| + : maps_(maps),
|
| code_flags_(code_flags) {}
|
|
|
| - bool IsMatch(Object* other) {
|
| + bool IsMatch(Object* other) V8_OVERRIDE {
|
| MapHandleList other_maps(kDefaultListAllocationSize);
|
| int other_flags;
|
| FromObject(other, &other_flags, &other_maps);
|
| @@ -8138,27 +8124,23 @@ class PolymorphicCodeCacheHashTableKey : public HashTableKey {
|
| return hash;
|
| }
|
|
|
| - uint32_t Hash() {
|
| + uint32_t Hash() V8_OVERRIDE {
|
| return MapsHashHelper(maps_, code_flags_);
|
| }
|
|
|
| - uint32_t HashForObject(Object* obj) {
|
| + uint32_t HashForObject(Object* obj) V8_OVERRIDE {
|
| MapHandleList other_maps(kDefaultListAllocationSize);
|
| int other_flags;
|
| FromObject(obj, &other_flags, &other_maps);
|
| return MapsHashHelper(&other_maps, other_flags);
|
| }
|
|
|
| - MUST_USE_RESULT MaybeObject* AsObject(Heap* heap) {
|
| - Object* obj;
|
| + MUST_USE_RESULT Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE {
|
| // The maps in |maps_| must be copied to a newly allocated FixedArray,
|
| // both because the referenced MapList is short-lived, and because C++
|
| // objects can't be stored in the heap anyway.
|
| - { MaybeObject* maybe_obj =
|
| - heap->AllocateUninitializedFixedArray(maps_->length() + 1);
|
| - if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| - }
|
| - FixedArray* list = FixedArray::cast(obj);
|
| + Handle<FixedArray> list =
|
| + isolate->factory()->NewUninitializedFixedArray(maps_->length() + 1);
|
| list->set(0, Smi::FromInt(code_flags_));
|
| for (int i = 0; i < maps_->length(); ++i) {
|
| list->set(i + 1, *maps_->at(i));
|
| @@ -8166,12 +8148,6 @@ class PolymorphicCodeCacheHashTableKey : public HashTableKey {
|
| return list;
|
| }
|
|
|
| - Handle<FixedArray> AsHandle() {
|
| - CALL_HEAP_FUNCTION(isolate_,
|
| - AsObject(isolate_->heap()),
|
| - FixedArray);
|
| - }
|
| -
|
| private:
|
| static MapHandleList* FromObject(Object* obj,
|
| int* code_flags,
|
| @@ -8185,7 +8161,6 @@ class PolymorphicCodeCacheHashTableKey : public HashTableKey {
|
| return maps;
|
| }
|
|
|
| - Isolate* isolate_;
|
| MapHandleList* maps_; // weak.
|
| int code_flags_;
|
| static const int kDefaultListAllocationSize = kMaxKeyedPolymorphism + 1;
|
| @@ -8195,7 +8170,7 @@ class PolymorphicCodeCacheHashTableKey : public HashTableKey {
|
| Object* PolymorphicCodeCacheHashTable::Lookup(MapHandleList* maps,
|
| int code_kind) {
|
| DisallowHeapAllocation no_alloc;
|
| - PolymorphicCodeCacheHashTableKey key(GetIsolate(), maps, code_kind);
|
| + PolymorphicCodeCacheHashTableKey key(maps, code_kind);
|
| int entry = FindEntry(&key);
|
| if (entry == kNotFound) return GetHeap()->undefined_value();
|
| return get(EntryToIndex(entry) + 1);
|
| @@ -8207,13 +8182,12 @@ Handle<PolymorphicCodeCacheHashTable> PolymorphicCodeCacheHashTable::Put(
|
| MapHandleList* maps,
|
| int code_kind,
|
| Handle<Code> code) {
|
| - PolymorphicCodeCacheHashTableKey key(
|
| - hash_table->GetIsolate(), maps, code_kind);
|
| + PolymorphicCodeCacheHashTableKey key(maps, code_kind);
|
| Handle<PolymorphicCodeCacheHashTable> cache =
|
| EnsureCapacity(hash_table, 1, &key);
|
| int entry = cache->FindInsertionEntry(key.Hash());
|
|
|
| - Handle<FixedArray> obj = key.AsHandle();
|
| + Handle<Object> obj = key.AsHandle(hash_table->GetIsolate());
|
| cache->set(EntryToIndex(entry), *obj);
|
| cache->set(EntryToIndex(entry) + 1, *code);
|
| cache->ElementAdded();
|
| @@ -14355,7 +14329,7 @@ class StringSharedKey : public HashTableKey {
|
| strict_mode_(strict_mode),
|
| scope_position_(scope_position) { }
|
|
|
| - bool IsMatch(Object* other) {
|
| + bool IsMatch(Object* other) V8_OVERRIDE {
|
| DisallowHeapAllocation no_allocation;
|
| if (!other->IsFixedArray()) return false;
|
| FixedArray* other_array = FixedArray::cast(other);
|
| @@ -14390,12 +14364,12 @@ class StringSharedKey : public HashTableKey {
|
| return hash;
|
| }
|
|
|
| - uint32_t Hash() {
|
| + uint32_t Hash() V8_OVERRIDE {
|
| return StringSharedHashHelper(*source_, *shared_, strict_mode_,
|
| scope_position_);
|
| }
|
|
|
| - uint32_t HashForObject(Object* obj) {
|
| + uint32_t HashForObject(Object* obj) V8_OVERRIDE {
|
| DisallowHeapAllocation no_allocation;
|
| FixedArray* other_array = FixedArray::cast(obj);
|
| SharedFunctionInfo* shared = SharedFunctionInfo::cast(other_array->get(0));
|
| @@ -14409,14 +14383,8 @@ class StringSharedKey : public HashTableKey {
|
| }
|
|
|
|
|
| - Object* AsObject(Heap* heap) {
|
| - UNREACHABLE();
|
| - return NULL;
|
| - }
|
| -
|
| -
|
| - Handle<Object> AsObject(Factory* factory) {
|
| - Handle<FixedArray> array = factory->NewFixedArray(4);
|
| + Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE {
|
| + Handle<FixedArray> array = isolate->factory()->NewFixedArray(4);
|
| array->set(0, *shared_);
|
| array->set(1, *source_);
|
| array->set(2, Smi::FromInt(strict_mode_));
|
| @@ -14443,22 +14411,22 @@ class RegExpKey : public HashTableKey {
|
| // stored value is stored where the key should be. IsMatch then
|
| // compares the search key to the found object, rather than comparing
|
| // a key to a key.
|
| - bool IsMatch(Object* obj) {
|
| + bool IsMatch(Object* obj) V8_OVERRIDE {
|
| FixedArray* val = FixedArray::cast(obj);
|
| return string_->Equals(String::cast(val->get(JSRegExp::kSourceIndex)))
|
| && (flags_ == val->get(JSRegExp::kFlagsIndex));
|
| }
|
|
|
| - uint32_t Hash() { return RegExpHash(*string_, flags_); }
|
| + uint32_t Hash() V8_OVERRIDE { return RegExpHash(*string_, flags_); }
|
|
|
| - Object* AsObject(Heap* heap) {
|
| + Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE {
|
| // Plain hash maps, which is where regexp keys are used, don't
|
| // use this function.
|
| UNREACHABLE();
|
| - return NULL;
|
| + return MaybeHandle<Object>().ToHandleChecked();
|
| }
|
|
|
| - uint32_t HashForObject(Object* obj) {
|
| + uint32_t HashForObject(Object* obj) V8_OVERRIDE {
|
| FixedArray* val = FixedArray::cast(obj);
|
| return RegExpHash(String::cast(val->get(JSRegExp::kSourceIndex)),
|
| Smi::cast(val->get(JSRegExp::kFlagsIndex)));
|
| @@ -14473,15 +14441,15 @@ class RegExpKey : public HashTableKey {
|
| };
|
|
|
|
|
| -MaybeObject* OneByteStringKey::AsObject(Heap* heap) {
|
| +Handle<Object> OneByteStringKey::AsHandle(Isolate* isolate) {
|
| if (hash_field_ == 0) Hash();
|
| - return heap->AllocateOneByteInternalizedString(string_, hash_field_);
|
| + return isolate->factory()->NewOneByteInternalizedString(string_, hash_field_);
|
| }
|
|
|
|
|
| -MaybeObject* TwoByteStringKey::AsObject(Heap* heap) {
|
| +Handle<Object> TwoByteStringKey::AsHandle(Isolate* isolate) {
|
| if (hash_field_ == 0) Hash();
|
| - return heap->AllocateTwoByteInternalizedString(string_, hash_field_);
|
| + return isolate->factory()->NewTwoByteInternalizedString(string_, hash_field_);
|
| }
|
|
|
|
|
| @@ -14502,19 +14470,18 @@ const uint16_t* SubStringKey<uint16_t>::GetChars() {
|
|
|
|
|
| template<>
|
| -MaybeObject* SubStringKey<uint8_t>::AsObject(Heap* heap) {
|
| +Handle<Object> SubStringKey<uint8_t>::AsHandle(Isolate* isolate) {
|
| if (hash_field_ == 0) Hash();
|
| Vector<const uint8_t> chars(GetChars() + from_, length_);
|
| - return heap->AllocateOneByteInternalizedString(chars, hash_field_);
|
| + return isolate->factory()->NewOneByteInternalizedString(chars, hash_field_);
|
| }
|
|
|
|
|
| template<>
|
| -MaybeObject* SubStringKey<uint16_t>::AsObject(
|
| - Heap* heap) {
|
| +Handle<Object> SubStringKey<uint16_t>::AsHandle(Isolate* isolate) {
|
| if (hash_field_ == 0) Hash();
|
| Vector<const uint16_t> chars(GetChars() + from_, length_);
|
| - return heap->AllocateTwoByteInternalizedString(chars, hash_field_);
|
| + return isolate->factory()->NewTwoByteInternalizedString(chars, hash_field_);
|
| }
|
|
|
|
|
| @@ -14552,16 +14519,18 @@ class InternalizedStringKey : public HashTableKey {
|
| return String::cast(other)->Hash();
|
| }
|
|
|
| - virtual MaybeObject* AsObject(Heap* heap) V8_OVERRIDE {
|
| + virtual Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE {
|
| // Internalize the string if possible.
|
| - Map* map = heap->InternalizedStringMapForString(*string_);
|
| - if (map != NULL) {
|
| - string_->set_map_no_write_barrier(map);
|
| + MaybeHandle<Map> maybe_map =
|
| + isolate->factory()->InternalizedStringMapForString(string_);
|
| + Handle<Map> map;
|
| + if (maybe_map.ToHandle(&map)) {
|
| + string_->set_map_no_write_barrier(*map);
|
| ASSERT(string_->IsInternalizedString());
|
| - return *string_;
|
| + return string_;
|
| }
|
| // Otherwise allocate a new internalized string.
|
| - return heap->AllocateInternalizedStringImpl(
|
| + return isolate->factory()->NewInternalizedStringImpl(
|
| *string_, string_->length(), string_->hash_field());
|
| }
|
|
|
| @@ -15487,7 +15456,7 @@ class TwoCharHashTableKey : public HashTableKey {
|
| #endif
|
| }
|
|
|
| - bool IsMatch(Object* o) {
|
| + bool IsMatch(Object* o) V8_OVERRIDE {
|
| if (!o->IsString()) return false;
|
| String* other = String::cast(o);
|
| if (other->length() != 2) return false;
|
| @@ -15495,17 +15464,17 @@ class TwoCharHashTableKey : public HashTableKey {
|
| return other->Get(1) == c2_;
|
| }
|
|
|
| - uint32_t Hash() { return hash_; }
|
| - uint32_t HashForObject(Object* key) {
|
| + uint32_t Hash() V8_OVERRIDE { return hash_; }
|
| + uint32_t HashForObject(Object* key) V8_OVERRIDE {
|
| if (!key->IsString()) return 0;
|
| return String::cast(key)->Hash();
|
| }
|
|
|
| - Object* AsObject(Heap* heap) {
|
| + Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE {
|
| // The TwoCharHashTableKey is only used for looking in the string
|
| // table, not for adding to it.
|
| UNREACHABLE();
|
| - return NULL;
|
| + return MaybeHandle<Object>().ToHandleChecked();
|
| }
|
|
|
| private:
|
| @@ -15627,7 +15596,7 @@ Handle<CompilationCacheTable> CompilationCacheTable::Put(
|
| StringSharedKey key(src, shared, FLAG_use_strict ? STRICT : SLOPPY,
|
| RelocInfo::kNoPosition);
|
| cache = EnsureCapacity(cache, 1, &key);
|
| - Handle<Object> k = key.AsObject(isolate->factory());
|
| + Handle<Object> k = key.AsHandle(isolate);
|
| int entry = cache->FindInsertionEntry(key.Hash());
|
| cache->set(EntryToIndex(entry), *k);
|
| cache->set(EntryToIndex(entry) + 1, *value);
|
| @@ -15644,7 +15613,7 @@ Handle<CompilationCacheTable> CompilationCacheTable::PutEval(
|
| Handle<SharedFunctionInfo> shared(context->closure()->shared());
|
| StringSharedKey key(src, shared, value->strict_mode(), scope_position);
|
| cache = EnsureCapacity(cache, 1, &key);
|
| - Handle<Object> k = key.AsObject(isolate->factory());
|
| + Handle<Object> k = key.AsHandle(isolate);
|
| int entry = cache->FindInsertionEntry(key.Hash());
|
| cache->set(EntryToIndex(entry), *k);
|
| cache->set(EntryToIndex(entry) + 1, *value);
|
| @@ -15689,7 +15658,7 @@ class StringsKey : public HashTableKey {
|
| public:
|
| explicit StringsKey(Handle<FixedArray> strings) : strings_(strings) { }
|
|
|
| - bool IsMatch(Object* strings) {
|
| + bool IsMatch(Object* strings) V8_OVERRIDE {
|
| FixedArray* o = FixedArray::cast(strings);
|
| int len = strings_->length();
|
| if (o->length() != len) return false;
|
| @@ -15699,9 +15668,9 @@ class StringsKey : public HashTableKey {
|
| return true;
|
| }
|
|
|
| - uint32_t Hash() { return HashForObject(*strings_); }
|
| + uint32_t Hash() V8_OVERRIDE { return HashForObject(*strings_); }
|
|
|
| - uint32_t HashForObject(Object* obj) {
|
| + uint32_t HashForObject(Object* obj) V8_OVERRIDE {
|
| FixedArray* strings = FixedArray::cast(obj);
|
| int len = strings->length();
|
| uint32_t hash = 0;
|
| @@ -15711,7 +15680,7 @@ class StringsKey : public HashTableKey {
|
| return hash;
|
| }
|
|
|
| - Object* AsObject(Heap* heap) { return *strings_; }
|
| + Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE { return strings_; }
|
|
|
| private:
|
| Handle<FixedArray> strings_;
|
|
|