| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/hydrogen.h" | 5 #include "src/hydrogen.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/allocation-site-scopes.h" | 9 #include "src/allocation-site-scopes.h" |
| 10 #include "src/ast-numbering.h" | 10 #include "src/ast-numbering.h" |
| (...skipping 7333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7344 KeyedAccessStoreMode store_mode) { | 7344 KeyedAccessStoreMode store_mode) { |
| 7345 HCheckMaps* checked_object = Add<HCheckMaps>(object, map, dependency); | 7345 HCheckMaps* checked_object = Add<HCheckMaps>(object, map, dependency); |
| 7346 | 7346 |
| 7347 if (access_type == STORE && map->prototype()->IsJSObject()) { | 7347 if (access_type == STORE && map->prototype()->IsJSObject()) { |
| 7348 // monomorphic stores need a prototype chain check because shape | 7348 // monomorphic stores need a prototype chain check because shape |
| 7349 // changes could allow callbacks on elements in the chain that | 7349 // changes could allow callbacks on elements in the chain that |
| 7350 // aren't compatible with monomorphic keyed stores. | 7350 // aren't compatible with monomorphic keyed stores. |
| 7351 PrototypeIterator iter(map); | 7351 PrototypeIterator iter(map); |
| 7352 JSObject* holder = NULL; | 7352 JSObject* holder = NULL; |
| 7353 while (!iter.IsAtEnd()) { | 7353 while (!iter.IsAtEnd()) { |
| 7354 holder = JSObject::cast(*PrototypeIterator::GetCurrent(iter)); | 7354 holder = *PrototypeIterator::GetCurrent<JSObject>(iter); |
| 7355 iter.Advance(); | 7355 iter.Advance(); |
| 7356 } | 7356 } |
| 7357 DCHECK(holder && holder->IsJSObject()); | 7357 DCHECK(holder && holder->IsJSObject()); |
| 7358 | 7358 |
| 7359 BuildCheckPrototypeMaps(handle(JSObject::cast(map->prototype())), | 7359 BuildCheckPrototypeMaps(handle(JSObject::cast(map->prototype())), |
| 7360 Handle<JSObject>(holder)); | 7360 Handle<JSObject>(holder)); |
| 7361 } | 7361 } |
| 7362 | 7362 |
| 7363 LoadKeyedHoleMode load_mode = BuildKeyedHoleMode(map); | 7363 LoadKeyedHoleMode load_mode = BuildKeyedHoleMode(map); |
| 7364 return BuildUncheckedMonomorphicElementAccess( | 7364 return BuildUncheckedMonomorphicElementAccess( |
| (...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7908 return check; | 7908 return check; |
| 7909 } | 7909 } |
| 7910 | 7910 |
| 7911 | 7911 |
| 7912 HInstruction* HGraphBuilder::BuildCheckPrototypeMaps(Handle<JSObject> prototype, | 7912 HInstruction* HGraphBuilder::BuildCheckPrototypeMaps(Handle<JSObject> prototype, |
| 7913 Handle<JSObject> holder) { | 7913 Handle<JSObject> holder) { |
| 7914 PrototypeIterator iter(isolate(), prototype, | 7914 PrototypeIterator iter(isolate(), prototype, |
| 7915 PrototypeIterator::START_AT_RECEIVER); | 7915 PrototypeIterator::START_AT_RECEIVER); |
| 7916 while (holder.is_null() || | 7916 while (holder.is_null() || |
| 7917 !PrototypeIterator::GetCurrent(iter).is_identical_to(holder)) { | 7917 !PrototypeIterator::GetCurrent(iter).is_identical_to(holder)) { |
| 7918 BuildConstantMapCheck( | 7918 BuildConstantMapCheck(PrototypeIterator::GetCurrent<JSObject>(iter)); |
| 7919 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter))); | |
| 7920 iter.Advance(); | 7919 iter.Advance(); |
| 7921 if (iter.IsAtEnd()) { | 7920 if (iter.IsAtEnd()) { |
| 7922 return NULL; | 7921 return NULL; |
| 7923 } | 7922 } |
| 7924 } | 7923 } |
| 7925 return BuildConstantMapCheck( | 7924 return BuildConstantMapCheck(PrototypeIterator::GetCurrent<JSObject>(iter)); |
| 7926 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter))); | |
| 7927 } | 7925 } |
| 7928 | 7926 |
| 7929 | 7927 |
| 7930 void HOptimizedGraphBuilder::AddCheckPrototypeMaps(Handle<JSObject> holder, | 7928 void HOptimizedGraphBuilder::AddCheckPrototypeMaps(Handle<JSObject> holder, |
| 7931 Handle<Map> receiver_map) { | 7929 Handle<Map> receiver_map) { |
| 7932 if (!holder.is_null()) { | 7930 if (!holder.is_null()) { |
| 7933 Handle<JSObject> prototype(JSObject::cast(receiver_map->prototype())); | 7931 Handle<JSObject> prototype(JSObject::cast(receiver_map->prototype())); |
| 7934 BuildCheckPrototypeMaps(prototype, holder); | 7932 BuildCheckPrototypeMaps(prototype, holder); |
| 7935 } | 7933 } |
| 7936 } | 7934 } |
| (...skipping 5559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13496 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13494 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 13497 } | 13495 } |
| 13498 | 13496 |
| 13499 #ifdef DEBUG | 13497 #ifdef DEBUG |
| 13500 graph_->Verify(false); // No full verify. | 13498 graph_->Verify(false); // No full verify. |
| 13501 #endif | 13499 #endif |
| 13502 } | 13500 } |
| 13503 | 13501 |
| 13504 } // namespace internal | 13502 } // namespace internal |
| 13505 } // namespace v8 | 13503 } // namespace v8 |
| OLD | NEW |