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

Side by Side Diff: src/hydrogen.cc

Issue 9015020: Make sure transitioned arrays efficiently call builtin Array functions (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: merge with latest Created 8 years, 11 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 | « src/arm/stub-cache-arm.cc ('k') | src/hydrogen-instructions.h » ('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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution. 11 // with the distribution.
(...skipping 3553 matching lines...) Expand 10 before | Expand all | Expand 10 after
3565 3565
3566 3566
3567 HInstruction* HGraphBuilder::BuildStoreNamedField(HValue* object, 3567 HInstruction* HGraphBuilder::BuildStoreNamedField(HValue* object,
3568 Handle<String> name, 3568 Handle<String> name,
3569 HValue* value, 3569 HValue* value,
3570 Handle<Map> type, 3570 Handle<Map> type,
3571 LookupResult* lookup, 3571 LookupResult* lookup,
3572 bool smi_and_map_check) { 3572 bool smi_and_map_check) {
3573 if (smi_and_map_check) { 3573 if (smi_and_map_check) {
3574 AddInstruction(new(zone()) HCheckNonSmi(object)); 3574 AddInstruction(new(zone()) HCheckNonSmi(object));
3575 AddInstruction(new(zone()) HCheckMap(object, type)); 3575 AddInstruction(new(zone()) HCheckMap(object, type, NULL,
3576 ALLOW_ELEMENT_TRANSITION_MAPS));
3576 } 3577 }
3577 3578
3578 int index = ComputeStoredFieldIndex(type, name, lookup); 3579 int index = ComputeStoredFieldIndex(type, name, lookup);
3579 bool is_in_object = index < 0; 3580 bool is_in_object = index < 0;
3580 int offset = index * kPointerSize; 3581 int offset = index * kPointerSize;
3581 if (index < 0) { 3582 if (index < 0) {
3582 // Negative property indices are in-object properties, indexed 3583 // Negative property indices are in-object properties, indexed
3583 // from the end of the fixed part of the object. 3584 // from the end of the fixed part of the object.
3584 offset += type->instance_size(); 3585 offset += type->instance_size();
3585 } else { 3586 } else {
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
4110 } 4111 }
4111 4112
4112 4113
4113 HLoadNamedField* HGraphBuilder::BuildLoadNamedField(HValue* object, 4114 HLoadNamedField* HGraphBuilder::BuildLoadNamedField(HValue* object,
4114 Property* expr, 4115 Property* expr,
4115 Handle<Map> type, 4116 Handle<Map> type,
4116 LookupResult* lookup, 4117 LookupResult* lookup,
4117 bool smi_and_map_check) { 4118 bool smi_and_map_check) {
4118 if (smi_and_map_check) { 4119 if (smi_and_map_check) {
4119 AddInstruction(new(zone()) HCheckNonSmi(object)); 4120 AddInstruction(new(zone()) HCheckNonSmi(object));
4120 AddInstruction(new(zone()) HCheckMap(object, type)); 4121 AddInstruction(new(zone()) HCheckMap(object, type, NULL,
4122 ALLOW_ELEMENT_TRANSITION_MAPS));
4121 } 4123 }
4122 4124
4123 int index = lookup->GetLocalFieldIndexFromMap(*type); 4125 int index = lookup->GetLocalFieldIndexFromMap(*type);
4124 if (index < 0) { 4126 if (index < 0) {
4125 // Negative property indices are in-object properties, indexed 4127 // Negative property indices are in-object properties, indexed
4126 // from the end of the fixed part of the object. 4128 // from the end of the fixed part of the object.
4127 int offset = (index * kPointerSize) + type->instance_size(); 4129 int offset = (index * kPointerSize) + type->instance_size();
4128 return new(zone()) HLoadNamedField(object, true, offset); 4130 return new(zone()) HLoadNamedField(object, true, offset);
4129 } else { 4131 } else {
4130 // Non-negative property indices are in the properties array. 4132 // Non-negative property indices are in the properties array.
(...skipping 19 matching lines...) Expand all
4150 LookupResult lookup(isolate()); 4152 LookupResult lookup(isolate());
4151 map->LookupInDescriptors(NULL, *name, &lookup); 4153 map->LookupInDescriptors(NULL, *name, &lookup);
4152 if (lookup.IsProperty() && lookup.type() == FIELD) { 4154 if (lookup.IsProperty() && lookup.type() == FIELD) {
4153 return BuildLoadNamedField(obj, 4155 return BuildLoadNamedField(obj,
4154 expr, 4156 expr,
4155 map, 4157 map,
4156 &lookup, 4158 &lookup,
4157 true); 4159 true);
4158 } else if (lookup.IsProperty() && lookup.type() == CONSTANT_FUNCTION) { 4160 } else if (lookup.IsProperty() && lookup.type() == CONSTANT_FUNCTION) {
4159 AddInstruction(new(zone()) HCheckNonSmi(obj)); 4161 AddInstruction(new(zone()) HCheckNonSmi(obj));
4160 AddInstruction(new(zone()) HCheckMap(obj, map)); 4162 AddInstruction(new(zone()) HCheckMap(obj, map, NULL,
4163 ALLOW_ELEMENT_TRANSITION_MAPS));
4161 Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*map)); 4164 Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*map));
4162 return new(zone()) HConstant(function, Representation::Tagged()); 4165 return new(zone()) HConstant(function, Representation::Tagged());
4163 } else { 4166 } else {
4164 return BuildLoadNamedGeneric(obj, expr); 4167 return BuildLoadNamedGeneric(obj, expr);
4165 } 4168 }
4166 } 4169 }
4167 4170
4168 4171
4169 HInstruction* HGraphBuilder::BuildLoadKeyedGeneric(HValue* object, 4172 HInstruction* HGraphBuilder::BuildLoadKeyedGeneric(HValue* object,
4170 HValue* key) { 4173 HValue* key) {
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after
4645 4648
4646 void HGraphBuilder::AddCheckConstantFunction(Call* expr, 4649 void HGraphBuilder::AddCheckConstantFunction(Call* expr,
4647 HValue* receiver, 4650 HValue* receiver,
4648 Handle<Map> receiver_map, 4651 Handle<Map> receiver_map,
4649 bool smi_and_map_check) { 4652 bool smi_and_map_check) {
4650 // Constant functions have the nice property that the map will change if they 4653 // Constant functions have the nice property that the map will change if they
4651 // are overwritten. Therefore it is enough to check the map of the holder and 4654 // are overwritten. Therefore it is enough to check the map of the holder and
4652 // its prototypes. 4655 // its prototypes.
4653 if (smi_and_map_check) { 4656 if (smi_and_map_check) {
4654 AddInstruction(new(zone()) HCheckNonSmi(receiver)); 4657 AddInstruction(new(zone()) HCheckNonSmi(receiver));
4655 AddInstruction(new(zone()) HCheckMap(receiver, receiver_map)); 4658 AddInstruction(new(zone()) HCheckMap(receiver, receiver_map, NULL,
4659 ALLOW_ELEMENT_TRANSITION_MAPS));
4656 } 4660 }
4657 if (!expr->holder().is_null()) { 4661 if (!expr->holder().is_null()) {
4658 AddInstruction(new(zone()) HCheckPrototypeMaps( 4662 AddInstruction(new(zone()) HCheckPrototypeMaps(
4659 Handle<JSObject>(JSObject::cast(receiver_map->prototype())), 4663 Handle<JSObject>(JSObject::cast(receiver_map->prototype())),
4660 expr->holder())); 4664 expr->holder()));
4661 } 4665 }
4662 } 4666 }
4663 4667
4664 4668
4665 void HGraphBuilder::HandlePolymorphicCallNamed(Call* expr, 4669 void HGraphBuilder::HandlePolymorphicCallNamed(Call* expr,
(...skipping 1522 matching lines...) Expand 10 before | Expand all | Expand 10 after
6188 result->set_position(expr->position()); 6192 result->set_position(expr->position());
6189 return ast_context()->ReturnInstruction(result, expr->id()); 6193 return ast_context()->ReturnInstruction(result, expr->id());
6190 } else if (type_info.IsNonPrimitive()) { 6194 } else if (type_info.IsNonPrimitive()) {
6191 switch (op) { 6195 switch (op) {
6192 case Token::EQ: 6196 case Token::EQ:
6193 case Token::EQ_STRICT: { 6197 case Token::EQ_STRICT: {
6194 // Can we get away with map check and not instance type check? 6198 // Can we get away with map check and not instance type check?
6195 Handle<Map> map = oracle()->GetCompareMap(expr); 6199 Handle<Map> map = oracle()->GetCompareMap(expr);
6196 if (!map.is_null()) { 6200 if (!map.is_null()) {
6197 AddInstruction(new(zone()) HCheckNonSmi(left)); 6201 AddInstruction(new(zone()) HCheckNonSmi(left));
6198 AddInstruction(new(zone()) HCheckMap(left, map)); 6202 AddInstruction(new(zone()) HCheckMap(left, map, NULL,
6203 ALLOW_ELEMENT_TRANSITION_MAPS));
6199 AddInstruction(new(zone()) HCheckNonSmi(right)); 6204 AddInstruction(new(zone()) HCheckNonSmi(right));
6200 AddInstruction(new(zone()) HCheckMap(right, map)); 6205 AddInstruction(new(zone()) HCheckMap(right, map, NULL,
6206 ALLOW_ELEMENT_TRANSITION_MAPS));
6201 HCompareObjectEqAndBranch* result = 6207 HCompareObjectEqAndBranch* result =
6202 new(zone()) HCompareObjectEqAndBranch(left, right); 6208 new(zone()) HCompareObjectEqAndBranch(left, right);
6203 result->set_position(expr->position()); 6209 result->set_position(expr->position());
6204 return ast_context()->ReturnControl(result, expr->id()); 6210 return ast_context()->ReturnControl(result, expr->id());
6205 } else { 6211 } else {
6206 AddInstruction(new(zone()) HCheckNonSmi(left)); 6212 AddInstruction(new(zone()) HCheckNonSmi(left));
6207 AddInstruction(HCheckInstanceType::NewIsSpecObject(left)); 6213 AddInstruction(HCheckInstanceType::NewIsSpecObject(left));
6208 AddInstruction(new(zone()) HCheckNonSmi(right)); 6214 AddInstruction(new(zone()) HCheckNonSmi(right));
6209 AddInstruction(HCheckInstanceType::NewIsSpecObject(right)); 6215 AddInstruction(HCheckInstanceType::NewIsSpecObject(right));
6210 HCompareObjectEqAndBranch* result = 6216 HCompareObjectEqAndBranch* result =
(...skipping 1100 matching lines...) Expand 10 before | Expand all | Expand 10 after
7311 } 7317 }
7312 } 7318 }
7313 7319
7314 #ifdef DEBUG 7320 #ifdef DEBUG
7315 if (graph_ != NULL) graph_->Verify(false); // No full verify. 7321 if (graph_ != NULL) graph_->Verify(false); // No full verify.
7316 if (allocator_ != NULL) allocator_->Verify(); 7322 if (allocator_ != NULL) allocator_->Verify();
7317 #endif 7323 #endif
7318 } 7324 }
7319 7325
7320 } } // namespace v8::internal 7326 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm/stub-cache-arm.cc ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698