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

Side by Side Diff: src/hydrogen.cc

Issue 552333002: Don't inline Array functions if receiver map is not extensible. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-crbug-412319.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 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 <algorithm> 7 #include <algorithm>
8 8
9 #include "src/v8.h" 9 #include "src/v8.h"
10 10
(...skipping 8209 matching lines...) Expand 10 before | Expand all | Expand 10 after
8220 ast_context()->ReturnInstruction(result, expr->id()); 8220 ast_context()->ReturnInstruction(result, expr->id());
8221 return true; 8221 return true;
8222 } 8222 }
8223 break; 8223 break;
8224 case kArrayPop: { 8224 case kArrayPop: {
8225 if (receiver_map.is_null()) return false; 8225 if (receiver_map.is_null()) return false;
8226 if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false; 8226 if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false;
8227 ElementsKind elements_kind = receiver_map->elements_kind(); 8227 ElementsKind elements_kind = receiver_map->elements_kind();
8228 if (!IsFastElementsKind(elements_kind)) return false; 8228 if (!IsFastElementsKind(elements_kind)) return false;
8229 if (receiver_map->is_observed()) return false; 8229 if (receiver_map->is_observed()) return false;
8230 DCHECK(receiver_map->is_extensible()); 8230 if (!receiver_map->is_extensible()) return false;
8231 8231
8232 Drop(expr->arguments()->length()); 8232 Drop(expr->arguments()->length());
8233 HValue* result; 8233 HValue* result;
8234 HValue* reduced_length; 8234 HValue* reduced_length;
8235 HValue* receiver = Pop(); 8235 HValue* receiver = Pop();
8236 8236
8237 HValue* checked_object = AddCheckMap(receiver, receiver_map); 8237 HValue* checked_object = AddCheckMap(receiver, receiver_map);
8238 HValue* length = Add<HLoadNamedField>( 8238 HValue* length = Add<HLoadNamedField>(
8239 checked_object, static_cast<HValue*>(NULL), 8239 checked_object, static_cast<HValue*>(NULL),
8240 HObjectAccess::ForArrayLength(elements_kind)); 8240 HObjectAccess::ForArrayLength(elements_kind));
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
8285 ast_context()->ReturnValue(result); 8285 ast_context()->ReturnValue(result);
8286 return true; 8286 return true;
8287 } 8287 }
8288 case kArrayPush: { 8288 case kArrayPush: {
8289 if (receiver_map.is_null()) return false; 8289 if (receiver_map.is_null()) return false;
8290 if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false; 8290 if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false;
8291 ElementsKind elements_kind = receiver_map->elements_kind(); 8291 ElementsKind elements_kind = receiver_map->elements_kind();
8292 if (!IsFastElementsKind(elements_kind)) return false; 8292 if (!IsFastElementsKind(elements_kind)) return false;
8293 if (receiver_map->is_observed()) return false; 8293 if (receiver_map->is_observed()) return false;
8294 if (JSArray::IsReadOnlyLengthDescriptor(receiver_map)) return false; 8294 if (JSArray::IsReadOnlyLengthDescriptor(receiver_map)) return false;
8295 DCHECK(receiver_map->is_extensible()); 8295 if (!receiver_map->is_extensible()) return false;
8296 8296
8297 // If there may be elements accessors in the prototype chain, the fast 8297 // If there may be elements accessors in the prototype chain, the fast
8298 // inlined version can't be used. 8298 // inlined version can't be used.
8299 if (receiver_map->DictionaryElementsInPrototypeChainOnly()) return false; 8299 if (receiver_map->DictionaryElementsInPrototypeChainOnly()) return false;
8300 // If there currently can be no elements accessors on the prototype chain, 8300 // If there currently can be no elements accessors on the prototype chain,
8301 // it doesn't mean that there won't be any later. Install a full prototype 8301 // it doesn't mean that there won't be any later. Install a full prototype
8302 // chain check to trap element accessors being installed on the prototype 8302 // chain check to trap element accessors being installed on the prototype
8303 // chain, which would cause elements to go to dictionary mode and result 8303 // chain, which would cause elements to go to dictionary mode and result
8304 // in a map change. 8304 // in a map change.
8305 Handle<JSObject> prototype(JSObject::cast(receiver_map->prototype())); 8305 Handle<JSObject> prototype(JSObject::cast(receiver_map->prototype()));
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
8452 return true; 8452 return true;
8453 } 8453 }
8454 case kArrayIndexOf: 8454 case kArrayIndexOf:
8455 case kArrayLastIndexOf: { 8455 case kArrayLastIndexOf: {
8456 if (receiver_map.is_null()) return false; 8456 if (receiver_map.is_null()) return false;
8457 if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false; 8457 if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false;
8458 ElementsKind kind = receiver_map->elements_kind(); 8458 ElementsKind kind = receiver_map->elements_kind();
8459 if (!IsFastElementsKind(kind)) return false; 8459 if (!IsFastElementsKind(kind)) return false;
8460 if (receiver_map->is_observed()) return false; 8460 if (receiver_map->is_observed()) return false;
8461 if (argument_count != 2) return false; 8461 if (argument_count != 2) return false;
8462 DCHECK(receiver_map->is_extensible()); 8462 if (!receiver_map->is_extensible()) return false;
8463 8463
8464 // If there may be elements accessors in the prototype chain, the fast 8464 // If there may be elements accessors in the prototype chain, the fast
8465 // inlined version can't be used. 8465 // inlined version can't be used.
8466 if (receiver_map->DictionaryElementsInPrototypeChainOnly()) return false; 8466 if (receiver_map->DictionaryElementsInPrototypeChainOnly()) return false;
8467 8467
8468 // If there currently can be no elements accessors on the prototype chain, 8468 // If there currently can be no elements accessors on the prototype chain,
8469 // it doesn't mean that there won't be any later. Install a full prototype 8469 // it doesn't mean that there won't be any later. Install a full prototype
8470 // chain check to trap element accessors being installed on the prototype 8470 // chain check to trap element accessors being installed on the prototype
8471 // chain, which would cause elements to go to dictionary mode and result 8471 // chain, which would cause elements to go to dictionary mode and result
8472 // in a map change. 8472 // in a map change.
(...skipping 4020 matching lines...) Expand 10 before | Expand all | Expand 10 after
12493 if (ShouldProduceTraceOutput()) { 12493 if (ShouldProduceTraceOutput()) {
12494 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 12494 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
12495 } 12495 }
12496 12496
12497 #ifdef DEBUG 12497 #ifdef DEBUG
12498 graph_->Verify(false); // No full verify. 12498 graph_->Verify(false); // No full verify.
12499 #endif 12499 #endif
12500 } 12500 }
12501 12501
12502 } } // namespace v8::internal 12502 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-crbug-412319.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698