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

Side by Side Diff: src/compiler/access-info.cc

Issue 2198833002: [turbofan] Remove unnecessary prototype checks for element access. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: REBASE Created 4 years, 4 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
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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 <ostream> 5 #include <ostream>
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/compilation-dependencies.h" 8 #include "src/compilation-dependencies.h"
9 #include "src/compiler/access-info.h" 9 #include "src/compiler/access-info.h"
10 #include "src/field-index-inl.h" 10 #include "src/field-index-inl.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 case AccessMode::kStore: 54 case AccessMode::kStore:
55 return os << "Store"; 55 return os << "Store";
56 } 56 }
57 UNREACHABLE(); 57 UNREACHABLE();
58 return os; 58 return os;
59 } 59 }
60 60
61 ElementAccessInfo::ElementAccessInfo() {} 61 ElementAccessInfo::ElementAccessInfo() {}
62 62
63 ElementAccessInfo::ElementAccessInfo(MapList const& receiver_maps, 63 ElementAccessInfo::ElementAccessInfo(MapList const& receiver_maps,
64 ElementsKind elements_kind, 64 ElementsKind elements_kind)
65 MaybeHandle<JSObject> holder) 65 : elements_kind_(elements_kind), receiver_maps_(receiver_maps) {}
66 : elements_kind_(elements_kind),
67 holder_(holder),
68 receiver_maps_(receiver_maps) {}
69 66
70 // static 67 // static
71 PropertyAccessInfo PropertyAccessInfo::NotFound(MapList const& receiver_maps, 68 PropertyAccessInfo PropertyAccessInfo::NotFound(MapList const& receiver_maps,
72 MaybeHandle<JSObject> holder) { 69 MaybeHandle<JSObject> holder) {
73 return PropertyAccessInfo(holder, receiver_maps); 70 return PropertyAccessInfo(holder, receiver_maps);
74 } 71 }
75 72
76 // static 73 // static
77 PropertyAccessInfo PropertyAccessInfo::DataConstant( 74 PropertyAccessInfo PropertyAccessInfo::DataConstant(
78 MapList const& receiver_maps, Handle<Object> constant, 75 MapList const& receiver_maps, Handle<Object> constant,
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 type_cache_(TypeCache::Get()), 172 type_cache_(TypeCache::Get()),
176 zone_(zone) { 173 zone_(zone) {
177 DCHECK(native_context->IsNativeContext()); 174 DCHECK(native_context->IsNativeContext());
178 } 175 }
179 176
180 177
181 bool AccessInfoFactory::ComputeElementAccessInfo( 178 bool AccessInfoFactory::ComputeElementAccessInfo(
182 Handle<Map> map, AccessMode access_mode, ElementAccessInfo* access_info) { 179 Handle<Map> map, AccessMode access_mode, ElementAccessInfo* access_info) {
183 // Check if it is safe to inline element access for the {map}. 180 // Check if it is safe to inline element access for the {map}.
184 if (!CanInlineElementAccess(map)) return false; 181 if (!CanInlineElementAccess(map)) return false;
185
186 ElementsKind const elements_kind = map->elements_kind(); 182 ElementsKind const elements_kind = map->elements_kind();
187 183 *access_info = ElementAccessInfo(MapList{map}, elements_kind);
188 // Certain (monomorphic) stores need a prototype chain check because shape
189 // changes could allow callbacks on elements in the chain that are not
190 // compatible with monomorphic keyed stores.
191 MaybeHandle<JSObject> holder;
192 if (access_mode == AccessMode::kStore && map->prototype()->IsJSObject()) {
193 for (PrototypeIterator i(map); !i.IsAtEnd(); i.Advance()) {
194 Handle<JSReceiver> prototype =
195 PrototypeIterator::GetCurrent<JSReceiver>(i);
196 if (!prototype->IsJSObject()) return false;
197 // TODO(bmeurer): We do not currently support unstable prototypes.
198 // We might want to revisit the way we handle certain keyed stores
199 // because this whole prototype chain check is essential a hack,
200 // and I'm not sure that it is correct at all with dictionaries in
201 // the prototype chain.
202 if (!prototype->map()->is_stable()) return false;
203 holder = Handle<JSObject>::cast(prototype);
204 }
205 }
206
207 *access_info = ElementAccessInfo(MapList{map}, elements_kind, holder);
208 return true; 184 return true;
209 } 185 }
210 186
211 187
212 bool AccessInfoFactory::ComputeElementAccessInfos( 188 bool AccessInfoFactory::ComputeElementAccessInfos(
213 MapHandleList const& maps, AccessMode access_mode, 189 MapHandleList const& maps, AccessMode access_mode,
214 ZoneVector<ElementAccessInfo>* access_infos) { 190 ZoneVector<ElementAccessInfo>* access_infos) {
215 // Collect possible transition targets. 191 // Collect possible transition targets.
216 MapHandleList possible_transition_targets(maps.length()); 192 MapHandleList possible_transition_targets(maps.length());
217 for (Handle<Map> map : maps) { 193 for (Handle<Map> map : maps) {
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 } 499 }
524 return false; 500 return false;
525 } 501 }
526 502
527 503
528 Factory* AccessInfoFactory::factory() const { return isolate()->factory(); } 504 Factory* AccessInfoFactory::factory() const { return isolate()->factory(); }
529 505
530 } // namespace compiler 506 } // namespace compiler
531 } // namespace internal 507 } // namespace internal
532 } // namespace v8 508 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698