Commit 5cbb2094 authored by bak@chromium.org's avatar bak@chromium.org

Removed virtual behavior from Dictionaries.

Review URL: http://codereview.chromium.org/150168

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2324 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 9518261f
...@@ -1434,8 +1434,8 @@ void Genesis::TransferNamedProperties(Handle<JSObject> from, ...@@ -1434,8 +1434,8 @@ void Genesis::TransferNamedProperties(Handle<JSObject> from,
} }
} }
} else { } else {
Handle<Dictionary> properties = Handle<StringDictionary> properties =
Handle<Dictionary>(from->property_dictionary()); Handle<StringDictionary>(from->property_dictionary());
int capacity = properties->Capacity(); int capacity = properties->Capacity();
for (int i = 0; i < capacity; i++) { for (int i = 0; i < capacity; i++) {
Object* raw_key(properties->KeyAt(i)); Object* raw_key(properties->KeyAt(i));
......
...@@ -37,8 +37,8 @@ namespace internal { ...@@ -37,8 +37,8 @@ namespace internal {
Handle<Code> CodeStub::GetCode() { Handle<Code> CodeStub::GetCode() {
uint32_t key = GetKey(); uint32_t key = GetKey();
int index = Heap::code_stubs()->FindNumberEntry(key); int index = Heap::code_stubs()->FindEntry(key);
if (index == -1) { if (index == NumberDictionary::kNotFound) {
HandleScope scope; HandleScope scope;
// Update the static counter each time a new code stub is generated. // Update the static counter each time a new code stub is generated.
...@@ -80,14 +80,15 @@ Handle<Code> CodeStub::GetCode() { ...@@ -80,14 +80,15 @@ Handle<Code> CodeStub::GetCode() {
#endif #endif
// Update the dictionary and the root in Heap. // Update the dictionary and the root in Heap.
Handle<Dictionary> dict = Handle<NumberDictionary> dict =
Factory::DictionaryAtNumberPut(Handle<Dictionary>(Heap::code_stubs()), Factory::DictionaryAtNumberPut(
key, Handle<NumberDictionary>(Heap::code_stubs()),
code); key,
code);
Heap::set_code_stubs(*dict); Heap::set_code_stubs(*dict);
index = Heap::code_stubs()->FindNumberEntry(key); index = Heap::code_stubs()->FindEntry(key);
} }
ASSERT(index != -1); ASSERT(index != NumberDictionary::kNotFound);
return Handle<Code>(Code::cast(Heap::code_stubs()->ValueAt(index))); return Handle<Code>(Code::cast(Heap::code_stubs()->ValueAt(index)));
} }
......
...@@ -49,9 +49,17 @@ Handle<FixedArray> Factory::NewFixedArrayWithHoles(int size) { ...@@ -49,9 +49,17 @@ Handle<FixedArray> Factory::NewFixedArrayWithHoles(int size) {
} }
Handle<Dictionary> Factory::NewDictionary(int at_least_space_for) { Handle<StringDictionary> Factory::NewStringDictionary(int at_least_space_for) {
ASSERT(0 <= at_least_space_for); ASSERT(0 <= at_least_space_for);
CALL_HEAP_FUNCTION(Dictionary::Allocate(at_least_space_for), Dictionary); CALL_HEAP_FUNCTION(StringDictionary::Allocate(at_least_space_for),
StringDictionary);
}
Handle<NumberDictionary> Factory::NewNumberDictionary(int at_least_space_for) {
ASSERT(0 <= at_least_space_for);
CALL_HEAP_FUNCTION(NumberDictionary::Allocate(at_least_space_for),
NumberDictionary);
} }
...@@ -655,10 +663,11 @@ Handle<SharedFunctionInfo> Factory::NewSharedFunctionInfo(Handle<String> name) { ...@@ -655,10 +663,11 @@ Handle<SharedFunctionInfo> Factory::NewSharedFunctionInfo(Handle<String> name) {
} }
Handle<Dictionary> Factory::DictionaryAtNumberPut(Handle<Dictionary> dictionary, Handle<NumberDictionary> Factory::DictionaryAtNumberPut(
uint32_t key, Handle<NumberDictionary> dictionary,
Handle<Object> value) { uint32_t key,
CALL_HEAP_FUNCTION(dictionary->AtNumberPut(key, *value), Dictionary); Handle<Object> value) {
CALL_HEAP_FUNCTION(dictionary->AtNumberPut(key, *value), NumberDictionary);
} }
......
...@@ -47,7 +47,9 @@ class Factory : public AllStatic { ...@@ -47,7 +47,9 @@ class Factory : public AllStatic {
// Allocate a new fixed array with non-existing entries (the hole). // Allocate a new fixed array with non-existing entries (the hole).
static Handle<FixedArray> NewFixedArrayWithHoles(int size); static Handle<FixedArray> NewFixedArrayWithHoles(int size);
static Handle<Dictionary> NewDictionary(int at_least_space_for); static Handle<NumberDictionary> NewNumberDictionary(int at_least_space_for);
static Handle<StringDictionary> NewStringDictionary(int at_least_space_for);
static Handle<DescriptorArray> NewDescriptorArray(int number_of_descriptors); static Handle<DescriptorArray> NewDescriptorArray(int number_of_descriptors);
...@@ -313,9 +315,10 @@ class Factory : public AllStatic { ...@@ -313,9 +315,10 @@ class Factory : public AllStatic {
static Handle<SharedFunctionInfo> NewSharedFunctionInfo(Handle<String> name); static Handle<SharedFunctionInfo> NewSharedFunctionInfo(Handle<String> name);
static Handle<Dictionary> DictionaryAtNumberPut(Handle<Dictionary>, static Handle<NumberDictionary> DictionaryAtNumberPut(
uint32_t key, Handle<NumberDictionary>,
Handle<Object> value); uint32_t key,
Handle<Object> value);
#ifdef ENABLE_DEBUGGER_SUPPORT #ifdef ENABLE_DEBUGGER_SUPPORT
static Handle<DebugInfo> NewDebugInfo(Handle<SharedFunctionInfo> shared); static Handle<DebugInfo> NewDebugInfo(Handle<SharedFunctionInfo> shared);
......
...@@ -198,7 +198,8 @@ class FixedArray; ...@@ -198,7 +198,8 @@ class FixedArray;
class FunctionEntry; class FunctionEntry;
class FunctionLiteral; class FunctionLiteral;
class FunctionTemplateInfo; class FunctionTemplateInfo;
class Dictionary; class NumberDictionary;
class StringDictionary;
class FreeStoreAllocationPolicy; class FreeStoreAllocationPolicy;
template <typename T> class Handle; template <typename T> class Handle;
class Heap; class Heap;
......
...@@ -1392,14 +1392,14 @@ bool Heap::CreateInitialObjects() { ...@@ -1392,14 +1392,14 @@ bool Heap::CreateInitialObjects() {
prototype_accessors_ = Proxy::cast(obj); prototype_accessors_ = Proxy::cast(obj);
// Allocate the code_stubs dictionary. // Allocate the code_stubs dictionary.
obj = Dictionary::Allocate(4); obj = NumberDictionary::Allocate(4);
if (obj->IsFailure()) return false; if (obj->IsFailure()) return false;
code_stubs_ = Dictionary::cast(obj); code_stubs_ = NumberDictionary::cast(obj);
// Allocate the non_monomorphic_cache used in stub-cache.cc // Allocate the non_monomorphic_cache used in stub-cache.cc
obj = Dictionary::Allocate(4); obj = NumberDictionary::Allocate(4);
if (obj->IsFailure()) return false; if (obj->IsFailure()) return false;
non_monomorphic_cache_ = Dictionary::cast(obj); non_monomorphic_cache_ = NumberDictionary::cast(obj);
CreateFixedStubs(); CreateFixedStubs();
...@@ -2563,7 +2563,7 @@ Object* Heap::AllocateHashTable(int length) { ...@@ -2563,7 +2563,7 @@ Object* Heap::AllocateHashTable(int length) {
Object* result = Heap::AllocateFixedArray(length); Object* result = Heap::AllocateFixedArray(length);
if (result->IsFailure()) return result; if (result->IsFailure()) return result;
reinterpret_cast<Array*>(result)->set_map(hash_table_map()); reinterpret_cast<Array*>(result)->set_map(hash_table_map());
ASSERT(result->IsDictionary()); ASSERT(result->IsHashTable());
return result; return result;
} }
......
...@@ -118,8 +118,8 @@ namespace internal { ...@@ -118,8 +118,8 @@ namespace internal {
V(Map, neander_map) \ V(Map, neander_map) \
V(JSObject, message_listeners) \ V(JSObject, message_listeners) \
V(Proxy, prototype_accessors) \ V(Proxy, prototype_accessors) \
V(Dictionary, code_stubs) \ V(NumberDictionary, code_stubs) \
V(Dictionary, non_monomorphic_cache) \ V(NumberDictionary, non_monomorphic_cache) \
V(Code, js_entry_code) \ V(Code, js_entry_code) \
V(Code, js_construct_entry_code) \ V(Code, js_construct_entry_code) \
V(Code, c_entry_code) \ V(Code, c_entry_code) \
...@@ -692,10 +692,10 @@ class Heap : public AllStatic { ...@@ -692,10 +692,10 @@ class Heap : public AllStatic {
static inline AllocationSpace TargetSpaceId(InstanceType type); static inline AllocationSpace TargetSpaceId(InstanceType type);
// Sets the stub_cache_ (only used when expanding the dictionary). // Sets the stub_cache_ (only used when expanding the dictionary).
static void set_code_stubs(Dictionary* value) { code_stubs_ = value; } static void set_code_stubs(NumberDictionary* value) { code_stubs_ = value; }
// Sets the non_monomorphic_cache_ (only used when expanding the dictionary). // Sets the non_monomorphic_cache_ (only used when expanding the dictionary).
static void set_non_monomorphic_cache(Dictionary* value) { static void set_non_monomorphic_cache(NumberDictionary* value) {
non_monomorphic_cache_ = value; non_monomorphic_cache_ = value;
} }
......
...@@ -83,7 +83,7 @@ static void GenerateDictionaryLoad(MacroAssembler* masm, Label* miss_label, ...@@ -83,7 +83,7 @@ static void GenerateDictionaryLoad(MacroAssembler* masm, Label* miss_label,
// Compute the capacity mask. // Compute the capacity mask.
const int kCapacityOffset = const int kCapacityOffset =
Array::kHeaderSize + Dictionary::kCapacityIndex * kPointerSize; Array::kHeaderSize + StringDictionary::kCapacityIndex * kPointerSize;
__ mov(r2, FieldOperand(r0, kCapacityOffset)); __ mov(r2, FieldOperand(r0, kCapacityOffset));
__ shr(r2, kSmiTagSize); // convert smi to int __ shr(r2, kSmiTagSize); // convert smi to int
__ dec(r2); __ dec(r2);
...@@ -93,18 +93,18 @@ static void GenerateDictionaryLoad(MacroAssembler* masm, Label* miss_label, ...@@ -93,18 +93,18 @@ static void GenerateDictionaryLoad(MacroAssembler* masm, Label* miss_label,
// cover ~93% of loads from dictionaries. // cover ~93% of loads from dictionaries.
static const int kProbes = 4; static const int kProbes = 4;
const int kElementsStartOffset = const int kElementsStartOffset =
Array::kHeaderSize + Dictionary::kElementsStartIndex * kPointerSize; Array::kHeaderSize + StringDictionary::kElementsStartIndex * kPointerSize;
for (int i = 0; i < kProbes; i++) { for (int i = 0; i < kProbes; i++) {
// Compute the masked index: (hash + i + i * i) & mask. // Compute the masked index: (hash + i + i * i) & mask.
__ mov(r1, FieldOperand(name, String::kLengthOffset)); __ mov(r1, FieldOperand(name, String::kLengthOffset));
__ shr(r1, String::kHashShift); __ shr(r1, String::kHashShift);
if (i > 0) { if (i > 0) {
__ add(Operand(r1), Immediate(Dictionary::GetProbeOffset(i))); __ add(Operand(r1), Immediate(StringDictionary::GetProbeOffset(i)));
} }
__ and_(r1, Operand(r2)); __ and_(r1, Operand(r2));
// Scale the index by multiplying by the element size. // Scale the index by multiplying by the entry size.
ASSERT(Dictionary::kElementSize == 3); ASSERT(StringDictionary::kEntrySize == 3);
__ lea(r1, Operand(r1, r1, times_2, 0)); // r1 = r1 * 3 __ lea(r1, Operand(r1, r1, times_2, 0)); // r1 = r1 * 3
// Check if the key is identical to the name. // Check if the key is identical to the name.
......
...@@ -744,12 +744,12 @@ void Proxy::ProxyVerify() { ...@@ -744,12 +744,12 @@ void Proxy::ProxyVerify() {
ASSERT(IsProxy()); ASSERT(IsProxy());
} }
template<typename Shape, typename Key>
void Dictionary::Print() { void Dictionary<Shape, Key>::Print() {
int capacity = Capacity(); int capacity = HashTable<Shape, Key>::Capacity();
for (int i = 0; i < capacity; i++) { for (int i = 0; i < capacity; i++) {
Object* k = KeyAt(i); Object* k = HashTable<Shape, Key>::KeyAt(i);
if (IsKey(k)) { if (HashTable<Shape, Key>::IsKey(k)) {
PrintF(" "); PrintF(" ");
if (k->IsString()) { if (k->IsString()) {
String::cast(k)->StringPrint(); String::cast(k)->StringPrint();
...@@ -1017,7 +1017,7 @@ void JSObject::IncrementSpillStatistics(SpillInformation* info) { ...@@ -1017,7 +1017,7 @@ void JSObject::IncrementSpillStatistics(SpillInformation* info) {
info->number_of_fast_used_fields_ += map()->NextFreePropertyIndex(); info->number_of_fast_used_fields_ += map()->NextFreePropertyIndex();
info->number_of_fast_unused_fields_ += map()->unused_property_fields(); info->number_of_fast_unused_fields_ += map()->unused_property_fields();
} else { } else {
Dictionary* dict = property_dictionary(); StringDictionary* dict = property_dictionary();
info->number_of_slow_used_properties_ += dict->NumberOfElements(); info->number_of_slow_used_properties_ += dict->NumberOfElements();
info->number_of_slow_unused_properties_ += info->number_of_slow_unused_properties_ +=
dict->Capacity() - dict->NumberOfElements(); dict->Capacity() - dict->NumberOfElements();
...@@ -1034,7 +1034,7 @@ void JSObject::IncrementSpillStatistics(SpillInformation* info) { ...@@ -1034,7 +1034,7 @@ void JSObject::IncrementSpillStatistics(SpillInformation* info) {
info->number_of_fast_used_elements_ += len - holes; info->number_of_fast_used_elements_ += len - holes;
info->number_of_fast_unused_elements_ += holes; info->number_of_fast_unused_elements_ += holes;
} else { } else {
Dictionary* dict = element_dictionary(); NumberDictionary* dict = element_dictionary();
info->number_of_slow_used_elements_ += dict->NumberOfElements(); info->number_of_slow_used_elements_ += dict->NumberOfElements();
info->number_of_slow_unused_elements_ += info->number_of_slow_unused_elements_ +=
dict->Capacity() - dict->NumberOfElements(); dict->Capacity() - dict->NumberOfElements();
......
...@@ -1370,15 +1370,14 @@ void DescriptorArray::Swap(int first, int second) { ...@@ -1370,15 +1370,14 @@ void DescriptorArray::Swap(int first, int second) {
} }
bool Dictionary::requires_slow_elements() { bool NumberDictionary::requires_slow_elements() {
Object* max_index_object = get(kMaxNumberKeyIndex); Object* max_index_object = get(kMaxNumberKeyIndex);
if (!max_index_object->IsSmi()) return false; if (!max_index_object->IsSmi()) return false;
return 0 != return 0 !=
(Smi::cast(max_index_object)->value() & kRequiresSlowElementsMask); (Smi::cast(max_index_object)->value() & kRequiresSlowElementsMask);
} }
uint32_t NumberDictionary::max_number_key() {
uint32_t Dictionary::max_number_key() {
ASSERT(!requires_slow_elements()); ASSERT(!requires_slow_elements());
Object* max_index_object = get(kMaxNumberKeyIndex); Object* max_index_object = get(kMaxNumberKeyIndex);
if (!max_index_object->IsSmi()) return 0; if (!max_index_object->IsSmi()) return 0;
...@@ -1386,8 +1385,7 @@ uint32_t Dictionary::max_number_key() { ...@@ -1386,8 +1385,7 @@ uint32_t Dictionary::max_number_key() {
return value >> kRequiresSlowElementsTagSize; return value >> kRequiresSlowElementsTagSize;
} }
void NumberDictionary::set_requires_slow_elements() {
void Dictionary::set_requires_slow_elements() {
set(kMaxNumberKeyIndex, set(kMaxNumberKeyIndex,
Smi::FromInt(kRequiresSlowElementsMask), Smi::FromInt(kRequiresSlowElementsMask),
SKIP_WRITE_BARRIER); SKIP_WRITE_BARRIER);
...@@ -1400,7 +1398,6 @@ void Dictionary::set_requires_slow_elements() { ...@@ -1400,7 +1398,6 @@ void Dictionary::set_requires_slow_elements() {
CAST_ACCESSOR(FixedArray) CAST_ACCESSOR(FixedArray)
CAST_ACCESSOR(DescriptorArray) CAST_ACCESSOR(DescriptorArray)
CAST_ACCESSOR(Dictionary)
CAST_ACCESSOR(SymbolTable) CAST_ACCESSOR(SymbolTable)
CAST_ACCESSOR(CompilationCacheTable) CAST_ACCESSOR(CompilationCacheTable)
CAST_ACCESSOR(MapCache) CAST_ACCESSOR(MapCache)
...@@ -1439,9 +1436,9 @@ CAST_ACCESSOR(Struct) ...@@ -1439,9 +1436,9 @@ CAST_ACCESSOR(Struct)
STRUCT_LIST(MAKE_STRUCT_CAST) STRUCT_LIST(MAKE_STRUCT_CAST)
#undef MAKE_STRUCT_CAST #undef MAKE_STRUCT_CAST
template <int prefix_size, int elem_size>
HashTable<prefix_size, elem_size>* HashTable<prefix_size, elem_size>::cast( template <typename Shape, typename Key>
Object* obj) { HashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) {
ASSERT(obj->IsHashTable()); ASSERT(obj->IsHashTable());
return reinterpret_cast<HashTable*>(obj); return reinterpret_cast<HashTable*>(obj);
} }
...@@ -2468,15 +2465,15 @@ bool JSObject::HasIndexedInterceptor() { ...@@ -2468,15 +2465,15 @@ bool JSObject::HasIndexedInterceptor() {
} }
Dictionary* JSObject::property_dictionary() { StringDictionary* JSObject::property_dictionary() {
ASSERT(!HasFastProperties()); ASSERT(!HasFastProperties());
return Dictionary::cast(properties()); return StringDictionary::cast(properties());
} }
Dictionary* JSObject::element_dictionary() { NumberDictionary* JSObject::element_dictionary() {
ASSERT(!HasFastElements()); ASSERT(!HasFastElements());
return Dictionary::cast(elements()); return NumberDictionary::cast(elements());
} }
...@@ -2640,16 +2637,17 @@ void AccessorInfo::set_property_attributes(PropertyAttributes attributes) { ...@@ -2640,16 +2637,17 @@ void AccessorInfo::set_property_attributes(PropertyAttributes attributes) {
set_flag(Smi::FromInt(rest_value | AttributesField::encode(attributes))); set_flag(Smi::FromInt(rest_value | AttributesField::encode(attributes)));
} }
void Dictionary::SetEntry(int entry, template<typename Shape, typename Key>
Object* key, void Dictionary<Shape, Key>::SetEntry(int entry,
Object* value, Object* key,
PropertyDetails details) { Object* value,
PropertyDetails details) {
ASSERT(!key->IsString() || details.index() > 0); ASSERT(!key->IsString() || details.index() > 0);
int index = EntryToIndex(entry); int index = HashTable<Shape, Key>::EntryToIndex(entry);
WriteBarrierMode mode = GetWriteBarrierMode(); WriteBarrierMode mode = FixedArray::GetWriteBarrierMode();
set(index, key, mode); FixedArray::set(index, key, mode);
set(index+1, value, mode); FixedArray::set(index+1, value, mode);
fast_set(this, index+2, details.AsSmi()); FixedArray::fast_set(this, index+2, details.AsSmi());
} }
......
This diff is collapsed.
This diff is collapsed.
...@@ -168,7 +168,7 @@ static Object* DeepCopyBoilerplate(JSObject* boilerplate) { ...@@ -168,7 +168,7 @@ static Object* DeepCopyBoilerplate(JSObject* boilerplate) {
} }
} }
} else { } else {
Dictionary* element_dictionary = copy->element_dictionary(); NumberDictionary* element_dictionary = copy->element_dictionary();
int capacity = element_dictionary->Capacity(); int capacity = element_dictionary->Capacity();
for (int i = 0; i < capacity; i++) { for (int i = 0; i < capacity; i++) {
Object* k = element_dictionary->KeyAt(i); Object* k = element_dictionary->KeyAt(i);
...@@ -2604,9 +2604,9 @@ static Object* Runtime_KeyedGetProperty(Arguments args) { ...@@ -2604,9 +2604,9 @@ static Object* Runtime_KeyedGetProperty(Arguments args) {
} }
} else { } else {
// Attempt dictionary lookup. // Attempt dictionary lookup.
Dictionary* dictionary = receiver->property_dictionary(); StringDictionary* dictionary = receiver->property_dictionary();
int entry = dictionary->FindStringEntry(key); int entry = dictionary->FindEntry(key);
if ((entry != Dictionary::kNotFound) && if ((entry != StringDictionary::kNotFound) &&
(dictionary->DetailsAt(entry).type() == NORMAL)) { (dictionary->DetailsAt(entry).type() == NORMAL)) {
Object* value = dictionary->ValueAt(entry); Object* value = dictionary->ValueAt(entry);
if (receiver->IsGlobalObject()) { if (receiver->IsGlobalObject()) {
...@@ -5130,8 +5130,8 @@ class ArrayConcatVisitor { ...@@ -5130,8 +5130,8 @@ class ArrayConcatVisitor {
storage_->set(index, *elm); storage_->set(index, *elm);
} else { } else {
Handle<Dictionary> dict = Handle<Dictionary>::cast(storage_); Handle<NumberDictionary> dict = Handle<NumberDictionary>::cast(storage_);
Handle<Dictionary> result = Handle<NumberDictionary> result =
Factory::DictionaryAtNumberPut(dict, index, elm); Factory::DictionaryAtNumberPut(dict, index, elm);
if (!result.is_identical_to(dict)) if (!result.is_identical_to(dict))
storage_ = result; storage_ = result;
...@@ -5179,7 +5179,7 @@ static uint32_t IterateElements(Handle<JSObject> receiver, ...@@ -5179,7 +5179,7 @@ static uint32_t IterateElements(Handle<JSObject> receiver,
} }
} else { } else {
Handle<Dictionary> dict(receiver->element_dictionary()); Handle<NumberDictionary> dict(receiver->element_dictionary());
uint32_t capacity = dict->Capacity(); uint32_t capacity = dict->Capacity();
for (uint32_t j = 0; j < capacity; j++) { for (uint32_t j = 0; j < capacity; j++) {
Handle<Object> k(dict->KeyAt(j)); Handle<Object> k(dict->KeyAt(j));
...@@ -5333,7 +5333,7 @@ static Object* Runtime_ArrayConcat(Arguments args) { ...@@ -5333,7 +5333,7 @@ static Object* Runtime_ArrayConcat(Arguments args) {
uint32_t at_least_space_for = estimate_nof_elements + uint32_t at_least_space_for = estimate_nof_elements +
(estimate_nof_elements >> 2); (estimate_nof_elements >> 2);
storage = Handle<FixedArray>::cast( storage = Handle<FixedArray>::cast(
Factory::NewDictionary(at_least_space_for)); Factory::NewNumberDictionary(at_least_space_for));
} }
Handle<Object> len = Factory::NewNumber(static_cast<double>(result_length)); Handle<Object> len = Factory::NewNumber(static_cast<double>(result_length));
...@@ -5396,7 +5396,7 @@ static Object* Runtime_EstimateNumberOfElements(Arguments args) { ...@@ -5396,7 +5396,7 @@ static Object* Runtime_EstimateNumberOfElements(Arguments args) {
CONVERT_CHECKED(JSArray, array, args[0]); CONVERT_CHECKED(JSArray, array, args[0]);
HeapObject* elements = array->elements(); HeapObject* elements = array->elements();
if (elements->IsDictionary()) { if (elements->IsDictionary()) {
return Smi::FromInt(Dictionary::cast(elements)->NumberOfElements()); return Smi::FromInt(NumberDictionary::cast(elements)->NumberOfElements());
} else { } else {
return array->length(); return array->length();
} }
......
...@@ -562,8 +562,8 @@ Object* StubCache::ComputeCallGlobal(int argc, ...@@ -562,8 +562,8 @@ Object* StubCache::ComputeCallGlobal(int argc,
static Object* GetProbeValue(Code::Flags flags) { static Object* GetProbeValue(Code::Flags flags) {
Dictionary* dictionary = Heap::non_monomorphic_cache(); NumberDictionary* dictionary = Heap::non_monomorphic_cache();
int entry = dictionary->FindNumberEntry(flags); int entry = dictionary->FindEntry(flags);
if (entry != -1) return dictionary->ValueAt(entry); if (entry != -1) return dictionary->ValueAt(entry);
return Heap::undefined_value(); return Heap::undefined_value();
} }
...@@ -579,7 +579,7 @@ static Object* ProbeCache(Code::Flags flags) { ...@@ -579,7 +579,7 @@ static Object* ProbeCache(Code::Flags flags) {
Heap::non_monomorphic_cache()->AtNumberPut(flags, Heap::non_monomorphic_cache()->AtNumberPut(flags,
Heap::undefined_value()); Heap::undefined_value());
if (result->IsFailure()) return result; if (result->IsFailure()) return result;
Heap::set_non_monomorphic_cache(Dictionary::cast(result)); Heap::set_non_monomorphic_cache(NumberDictionary::cast(result));
return probe; return probe;
} }
...@@ -587,7 +587,7 @@ static Object* ProbeCache(Code::Flags flags) { ...@@ -587,7 +587,7 @@ static Object* ProbeCache(Code::Flags flags) {
static Object* FillCache(Object* code) { static Object* FillCache(Object* code) {
if (code->IsCode()) { if (code->IsCode()) {
int entry = int entry =
Heap::non_monomorphic_cache()->FindNumberEntry( Heap::non_monomorphic_cache()->FindEntry(
Code::cast(code)->flags()); Code::cast(code)->flags());
// The entry must be present see comment in ProbeCache. // The entry must be present see comment in ProbeCache.
ASSERT(entry != -1); ASSERT(entry != -1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment