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

Side by Side Diff: src/elements.cc

Issue 2332503002: [elements] Handlify SloppyArguments IndexOfValueImpl (Closed)
Patch Set: use bool instead of nullptr Created 4 years, 3 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
« no previous file with comments | « no previous file | test/mjsunit/array-indexing-receiver.js » ('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/elements.h" 5 #include "src/elements.h"
6 6
7 #include "src/arguments.h" 7 #include "src/arguments.h"
8 #include "src/conversions.h" 8 #include "src/conversions.h"
9 #include "src/factory.h" 9 #include "src/factory.h"
10 #include "src/isolate-inl.h" 10 #include "src/isolate-inl.h"
(...skipping 2928 matching lines...) Expand 10 before | Expand all | Expand 10 after
2939 if (!HasEntryImpl(elements, entry)) continue; 2939 if (!HasEntryImpl(elements, entry)) continue;
2940 Handle<Object> value = GetImpl(elements, entry); 2940 Handle<Object> value = GetImpl(elements, entry);
2941 accumulator->AddKey(value, convert); 2941 accumulator->AddKey(value, convert);
2942 } 2942 }
2943 } 2943 }
2944 2944
2945 static bool HasEntryImpl(FixedArrayBase* parameters, uint32_t entry) { 2945 static bool HasEntryImpl(FixedArrayBase* parameters, uint32_t entry) {
2946 FixedArray* parameter_map = FixedArray::cast(parameters); 2946 FixedArray* parameter_map = FixedArray::cast(parameters);
2947 uint32_t length = parameter_map->length() - 2; 2947 uint32_t length = parameter_map->length() - 2;
2948 if (entry < length) { 2948 if (entry < length) {
2949 return !GetParameterMapArg(parameter_map, entry) 2949 return HasParameterMapArg(parameter_map, entry);
2950 ->IsTheHole(parameter_map->GetIsolate());
2951 } 2950 }
2952 2951
2953 FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1)); 2952 FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1));
2954 return ArgumentsAccessor::HasEntryImpl(arguments, entry - length); 2953 return ArgumentsAccessor::HasEntryImpl(arguments, entry - length);
2955 } 2954 }
2956 2955
2957 static bool HasAccessorsImpl(JSObject* holder, 2956 static bool HasAccessorsImpl(JSObject* holder,
2958 FixedArrayBase* backing_store) { 2957 FixedArrayBase* backing_store) {
2959 FixedArray* parameter_map = FixedArray::cast(backing_store); 2958 FixedArray* parameter_map = FixedArray::cast(backing_store);
2960 FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1)); 2959 FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1));
2961 return ArgumentsAccessor::HasAccessorsImpl(holder, arguments); 2960 return ArgumentsAccessor::HasAccessorsImpl(holder, arguments);
2962 } 2961 }
2963 2962
2964 static uint32_t GetIndexForEntryImpl(FixedArrayBase* parameters, 2963 static uint32_t GetIndexForEntryImpl(FixedArrayBase* parameters,
2965 uint32_t entry) { 2964 uint32_t entry) {
2966 FixedArray* parameter_map = FixedArray::cast(parameters); 2965 FixedArray* parameter_map = FixedArray::cast(parameters);
2967 uint32_t length = parameter_map->length() - 2; 2966 uint32_t length = parameter_map->length() - 2;
2968 if (entry < length) return entry; 2967 if (entry < length) return entry;
2969 2968
2970 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); 2969 FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
2971 return ArgumentsAccessor::GetIndexForEntryImpl(arguments, entry - length); 2970 return ArgumentsAccessor::GetIndexForEntryImpl(arguments, entry - length);
2972 } 2971 }
2973 2972
2974 static uint32_t GetEntryForIndexImpl(JSObject* holder, 2973 static uint32_t GetEntryForIndexImpl(JSObject* holder,
2975 FixedArrayBase* parameters, 2974 FixedArrayBase* parameters,
2976 uint32_t index, PropertyFilter filter) { 2975 uint32_t index, PropertyFilter filter) {
2977 FixedArray* parameter_map = FixedArray::cast(parameters); 2976 FixedArray* parameter_map = FixedArray::cast(parameters);
2978 Object* probe = GetParameterMapArg(parameter_map, index); 2977 if (HasParameterMapArg(parameter_map, index)) return index;
2979 if (!probe->IsTheHole(holder->GetIsolate())) return index;
2980 2978
2981 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); 2979 FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
2982 uint32_t entry = ArgumentsAccessor::GetEntryForIndexImpl(holder, arguments, 2980 uint32_t entry = ArgumentsAccessor::GetEntryForIndexImpl(holder, arguments,
2983 index, filter); 2981 index, filter);
2984 if (entry == kMaxUInt32) return kMaxUInt32; 2982 if (entry == kMaxUInt32) return kMaxUInt32;
2985 return (parameter_map->length() - 2) + entry; 2983 return (parameter_map->length() - 2) + entry;
2986 } 2984 }
2987 2985
2988 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { 2986 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) {
2989 FixedArray* parameter_map = FixedArray::cast(holder->elements()); 2987 FixedArray* parameter_map = FixedArray::cast(holder->elements());
2990 uint32_t length = parameter_map->length() - 2; 2988 uint32_t length = parameter_map->length() - 2;
2991 if (entry < length) { 2989 if (entry < length) {
2992 return PropertyDetails(NONE, DATA, 0, PropertyCellType::kNoCell); 2990 return PropertyDetails(NONE, DATA, 0, PropertyCellType::kNoCell);
2993 } 2991 }
2994 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); 2992 FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
2995 return ArgumentsAccessor::GetDetailsImpl(arguments, entry - length); 2993 return ArgumentsAccessor::GetDetailsImpl(arguments, entry - length);
2996 } 2994 }
2997 2995
2998 static Object* GetParameterMapArg(FixedArray* parameter_map, uint32_t index) { 2996 static bool HasParameterMapArg(FixedArray* parameter_map, uint32_t index) {
2999 uint32_t length = parameter_map->length() - 2; 2997 uint32_t length = parameter_map->length() - 2;
3000 return index < length 2998 if (index >= length) return false;
3001 ? parameter_map->get(index + 2) 2999 return !parameter_map->get(index + 2)->IsTheHole(
3002 : Object::cast(parameter_map->GetHeap()->the_hole_value()); 3000 parameter_map->GetIsolate());
3003 } 3001 }
3004 3002
3005 static void DeleteImpl(Handle<JSObject> obj, uint32_t entry) { 3003 static void DeleteImpl(Handle<JSObject> obj, uint32_t entry) {
3006 FixedArray* parameter_map = FixedArray::cast(obj->elements()); 3004 FixedArray* parameter_map = FixedArray::cast(obj->elements());
3007 uint32_t length = static_cast<uint32_t>(parameter_map->length()) - 2; 3005 uint32_t length = static_cast<uint32_t>(parameter_map->length()) - 2;
3008 if (entry < length) { 3006 if (entry < length) {
3009 // TODO(kmillikin): We could check if this was the last aliased 3007 // TODO(kmillikin): We could check if this was the last aliased
3010 // parameter, and revert to normal elements in that case. That 3008 // parameter, and revert to normal elements in that case. That
3011 // would enable GC of the context. 3009 // would enable GC of the context.
3012 parameter_map->set_the_hole(entry + 2); 3010 parameter_map->set_the_hole(entry + 2);
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
3095 } 3093 }
3096 return Just(false); 3094 return Just(false);
3097 } 3095 }
3098 3096
3099 static Maybe<int64_t> IndexOfValueImpl(Isolate* isolate, 3097 static Maybe<int64_t> IndexOfValueImpl(Isolate* isolate,
3100 Handle<JSObject> object, 3098 Handle<JSObject> object,
3101 Handle<Object> value, 3099 Handle<Object> value,
3102 uint32_t start_from, uint32_t length) { 3100 uint32_t start_from, uint32_t length) {
3103 DCHECK(JSObject::PrototypeHasNoElements(isolate, *object)); 3101 DCHECK(JSObject::PrototypeHasNoElements(isolate, *object));
3104 Handle<Map> original_map = handle(object->map(), isolate); 3102 Handle<Map> original_map = handle(object->map(), isolate);
3105 FixedArray* parameter_map = FixedArray::cast(object->elements()); 3103 Handle<FixedArray> parameter_map(FixedArray::cast(object->elements()),
3104 isolate);
3106 3105
3107 for (uint32_t k = start_from; k < length; ++k) { 3106 for (uint32_t k = start_from; k < length; ++k) {
3108 uint32_t entry = 3107 uint32_t entry =
3109 GetEntryForIndexImpl(*object, parameter_map, k, ALL_PROPERTIES); 3108 GetEntryForIndexImpl(*object, *parameter_map, k, ALL_PROPERTIES);
3110 if (entry == kMaxUInt32) { 3109 if (entry == kMaxUInt32) {
3111 continue; 3110 continue;
3112 } 3111 }
3113 3112
3114 Handle<Object> element_k = GetImpl(parameter_map, entry); 3113 Handle<Object> element_k = GetImpl(*parameter_map, entry);
3115 3114
3116 if (element_k->IsAccessorPair()) { 3115 if (element_k->IsAccessorPair()) {
3117 LookupIterator it(isolate, object, k, LookupIterator::OWN); 3116 LookupIterator it(isolate, object, k, LookupIterator::OWN);
3118 DCHECK(it.IsFound()); 3117 DCHECK(it.IsFound());
3119 DCHECK_EQ(it.state(), LookupIterator::ACCESSOR); 3118 DCHECK_EQ(it.state(), LookupIterator::ACCESSOR);
3120 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, element_k, 3119 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, element_k,
3121 Object::GetPropertyWithAccessor(&it), 3120 Object::GetPropertyWithAccessor(&it),
3122 Nothing<int64_t>()); 3121 Nothing<int64_t>());
3123 3122
3124 if (value->StrictEquals(*element_k)) { 3123 if (value->StrictEquals(*element_k)) {
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after
3735 insertion_index += len; 3734 insertion_index += len;
3736 } 3735 }
3737 3736
3738 DCHECK_EQ(insertion_index, result_len); 3737 DCHECK_EQ(insertion_index, result_len);
3739 return result_array; 3738 return result_array;
3740 } 3739 }
3741 3740
3742 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; 3741 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL;
3743 } // namespace internal 3742 } // namespace internal
3744 } // namespace v8 3743 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/array-indexing-receiver.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698