| OLD | NEW |
| 1 // Copyright 2012 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 |
| (...skipping 1147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1158 AddInstruction(new(zone) HLoadElements(object, mapcheck)); | 1158 AddInstruction(new(zone) HLoadElements(object, mapcheck)); |
| 1159 if (is_store && (fast_elements || fast_smi_only_elements) && | 1159 if (is_store && (fast_elements || fast_smi_only_elements) && |
| 1160 store_mode != STORE_NO_TRANSITION_HANDLE_COW) { | 1160 store_mode != STORE_NO_TRANSITION_HANDLE_COW) { |
| 1161 HCheckMaps* check_cow_map = new(zone) HCheckMaps( | 1161 HCheckMaps* check_cow_map = new(zone) HCheckMaps( |
| 1162 elements, isolate()->factory()->fixed_array_map(), zone); | 1162 elements, isolate()->factory()->fixed_array_map(), zone); |
| 1163 check_cow_map->ClearGVNFlag(kDependsOnElementsKind); | 1163 check_cow_map->ClearGVNFlag(kDependsOnElementsKind); |
| 1164 AddInstruction(check_cow_map); | 1164 AddInstruction(check_cow_map); |
| 1165 } | 1165 } |
| 1166 HInstruction* length = NULL; | 1166 HInstruction* length = NULL; |
| 1167 if (is_js_array) { | 1167 if (is_js_array) { |
| 1168 length = AddInstruction(new(zone) HJSArrayLength(object, mapcheck, | 1168 length = AddInstruction( |
| 1169 HType::Smi())); | 1169 HLoadNamedField::NewArrayLength(zone, object, mapcheck, HType::Smi())); |
| 1170 } else { | 1170 } else { |
| 1171 length = AddInstruction(new(zone) HFixedArrayBaseLength(elements)); | 1171 length = AddInstruction(new(zone) HFixedArrayBaseLength(elements)); |
| 1172 } | 1172 } |
| 1173 HValue* checked_key = NULL; | 1173 HValue* checked_key = NULL; |
| 1174 if (IsExternalArrayElementsKind(elements_kind)) { | 1174 if (IsExternalArrayElementsKind(elements_kind)) { |
| 1175 if (store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) { | 1175 if (store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) { |
| 1176 HLoadExternalArrayPointer* external_elements = | 1176 HLoadExternalArrayPointer* external_elements = |
| 1177 new(zone) HLoadExternalArrayPointer(elements); | 1177 new(zone) HLoadExternalArrayPointer(elements); |
| 1178 AddInstruction(external_elements); | 1178 AddInstruction(external_elements); |
| 1179 IfBuilder length_checker(this); | 1179 IfBuilder length_checker(this); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1228 AddInstruction(check_cow_map); | 1228 AddInstruction(check_cow_map); |
| 1229 } | 1229 } |
| 1230 } | 1230 } |
| 1231 } | 1231 } |
| 1232 return AddInstruction( | 1232 return AddInstruction( |
| 1233 BuildFastElementAccess(elements, checked_key, val, mapcheck, | 1233 BuildFastElementAccess(elements, checked_key, val, mapcheck, |
| 1234 elements_kind, is_store, store_mode)); | 1234 elements_kind, is_store, store_mode)); |
| 1235 } | 1235 } |
| 1236 | 1236 |
| 1237 | 1237 |
| 1238 HInstruction* HGraphBuilder::BuildFastArrayLengthLoad(HValue* object, | |
| 1239 HValue* typecheck) { | |
| 1240 Zone* zone = this->zone(); | |
| 1241 return new (zone) HJSArrayLength(object, typecheck, HType::Smi()); | |
| 1242 } | |
| 1243 | |
| 1244 | |
| 1245 HValue* HGraphBuilder::BuildAllocateElements(HValue* context, | 1238 HValue* HGraphBuilder::BuildAllocateElements(HValue* context, |
| 1246 ElementsKind kind, | 1239 ElementsKind kind, |
| 1247 HValue* capacity) { | 1240 HValue* capacity) { |
| 1248 BailoutId ast_id = current_block()->last_environment()->previous_ast_id(); | 1241 BailoutId ast_id = current_block()->last_environment()->previous_ast_id(); |
| 1249 Zone* zone = this->zone(); | 1242 Zone* zone = this->zone(); |
| 1250 | 1243 |
| 1251 int elements_size = IsFastDoubleElementsKind(kind) | 1244 int elements_size = IsFastDoubleElementsKind(kind) |
| 1252 ? kDoubleSize : kPointerSize; | 1245 ? kDoubleSize : kPointerSize; |
| 1253 HConstant* elements_size_value = | 1246 HConstant* elements_size_value = |
| 1254 new(zone) HConstant(elements_size, Representation::Integer32()); | 1247 new(zone) HConstant(elements_size, Representation::Integer32()); |
| (...skipping 5163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6418 Handle<String> name) { | 6411 Handle<String> name) { |
| 6419 if (!name->Equals(isolate()->heap()->length_string())) return false; | 6412 if (!name->Equals(isolate()->heap()->length_string())) return false; |
| 6420 | 6413 |
| 6421 for (int i = 0; i < types->length(); i++) { | 6414 for (int i = 0; i < types->length(); i++) { |
| 6422 if (types->at(i)->instance_type() != JS_ARRAY_TYPE) return false; | 6415 if (types->at(i)->instance_type() != JS_ARRAY_TYPE) return false; |
| 6423 } | 6416 } |
| 6424 | 6417 |
| 6425 AddInstruction(new(zone()) HCheckNonSmi(object)); | 6418 AddInstruction(new(zone()) HCheckNonSmi(object)); |
| 6426 HInstruction* typecheck = | 6419 HInstruction* typecheck = |
| 6427 AddInstruction(HCheckInstanceType::NewIsJSArray(object, zone())); | 6420 AddInstruction(HCheckInstanceType::NewIsJSArray(object, zone())); |
| 6428 HInstruction* instr = BuildFastArrayLengthLoad(object, typecheck); | 6421 HInstruction* instr = |
| 6422 HLoadNamedField::NewArrayLength(zone(), object, typecheck); |
| 6429 instr->set_position(expr->position()); | 6423 instr->set_position(expr->position()); |
| 6430 ast_context()->ReturnInstruction(instr, expr->id()); | 6424 ast_context()->ReturnInstruction(instr, expr->id()); |
| 6431 return true; | 6425 return true; |
| 6432 } | 6426 } |
| 6433 | 6427 |
| 6434 | 6428 |
| 6435 void HOptimizedGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr, | 6429 void HOptimizedGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr, |
| 6436 HValue* object, | 6430 HValue* object, |
| 6437 SmallMapList* types, | 6431 SmallMapList* types, |
| 6438 Handle<String> name) { | 6432 Handle<String> name) { |
| (...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7077 Handle<String> name, | 7071 Handle<String> name, |
| 7078 Property* expr, | 7072 Property* expr, |
| 7079 Handle<Map> map) { | 7073 Handle<Map> map) { |
| 7080 // Handle a load from a known field. | 7074 // Handle a load from a known field. |
| 7081 ASSERT(!map->is_dictionary_map()); | 7075 ASSERT(!map->is_dictionary_map()); |
| 7082 | 7076 |
| 7083 // Handle access to various length properties | 7077 // Handle access to various length properties |
| 7084 if (name->Equals(isolate()->heap()->length_string())) { | 7078 if (name->Equals(isolate()->heap()->length_string())) { |
| 7085 if (map->instance_type() == JS_ARRAY_TYPE) { | 7079 if (map->instance_type() == JS_ARRAY_TYPE) { |
| 7086 AddCheckMapsWithTransitions(object, map); | 7080 AddCheckMapsWithTransitions(object, map); |
| 7087 return BuildFastArrayLengthLoad(object, NULL); | 7081 return HLoadNamedField::NewArrayLength(zone(), object, object); |
| 7088 } | 7082 } |
| 7089 } | 7083 } |
| 7090 | 7084 |
| 7091 LookupResult lookup(isolate()); | 7085 LookupResult lookup(isolate()); |
| 7092 map->LookupDescriptor(NULL, *name, &lookup); | 7086 map->LookupDescriptor(NULL, *name, &lookup); |
| 7093 if (lookup.IsField()) { | 7087 if (lookup.IsField()) { |
| 7094 AddCheckMap(object, map); | 7088 AddCheckMap(object, map); |
| 7095 return BuildLoadNamedField(object, map, &lookup); | 7089 return BuildLoadNamedField(object, map, &lookup); |
| 7096 } | 7090 } |
| 7097 | 7091 |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7370 HBasicBlock* if_jsarray = graph()->CreateBasicBlock(); | 7364 HBasicBlock* if_jsarray = graph()->CreateBasicBlock(); |
| 7371 HBasicBlock* if_fastobject = graph()->CreateBasicBlock(); | 7365 HBasicBlock* if_fastobject = graph()->CreateBasicBlock(); |
| 7372 HHasInstanceTypeAndBranch* typecheck = | 7366 HHasInstanceTypeAndBranch* typecheck = |
| 7373 new(zone()) HHasInstanceTypeAndBranch(object, JS_ARRAY_TYPE); | 7367 new(zone()) HHasInstanceTypeAndBranch(object, JS_ARRAY_TYPE); |
| 7374 typecheck->SetSuccessorAt(0, if_jsarray); | 7368 typecheck->SetSuccessorAt(0, if_jsarray); |
| 7375 typecheck->SetSuccessorAt(1, if_fastobject); | 7369 typecheck->SetSuccessorAt(1, if_fastobject); |
| 7376 current_block()->Finish(typecheck); | 7370 current_block()->Finish(typecheck); |
| 7377 | 7371 |
| 7378 set_current_block(if_jsarray); | 7372 set_current_block(if_jsarray); |
| 7379 HInstruction* length; | 7373 HInstruction* length; |
| 7380 length = AddInstruction(new(zone()) HJSArrayLength(object, typecheck, | 7374 length = AddInstruction( |
| 7381 HType::Smi())); | 7375 HLoadNamedField::NewArrayLength(zone(), object, typecheck, |
| 7376 HType::Smi())); |
| 7382 checked_key = AddBoundsCheck(key, length, ALLOW_SMI_KEY); | 7377 checked_key = AddBoundsCheck(key, length, ALLOW_SMI_KEY); |
| 7383 access = AddInstruction(BuildFastElementAccess( | 7378 access = AddInstruction(BuildFastElementAccess( |
| 7384 elements, checked_key, val, elements_kind_branch, | 7379 elements, checked_key, val, elements_kind_branch, |
| 7385 elements_kind, is_store, STANDARD_STORE)); | 7380 elements_kind, is_store, STANDARD_STORE)); |
| 7386 if (!is_store) { | 7381 if (!is_store) { |
| 7387 Push(access); | 7382 Push(access); |
| 7388 } | 7383 } |
| 7389 | 7384 |
| 7390 *has_side_effects |= access->HasObservableSideEffects(); | 7385 *has_side_effects |= access->HasObservableSideEffects(); |
| 7391 if (position != -1) { | 7386 if (position != -1) { |
| (...skipping 3887 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11279 } | 11274 } |
| 11280 } | 11275 } |
| 11281 | 11276 |
| 11282 #ifdef DEBUG | 11277 #ifdef DEBUG |
| 11283 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 11278 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
| 11284 if (allocator_ != NULL) allocator_->Verify(); | 11279 if (allocator_ != NULL) allocator_->Verify(); |
| 11285 #endif | 11280 #endif |
| 11286 } | 11281 } |
| 11287 | 11282 |
| 11288 } } // namespace v8::internal | 11283 } } // namespace v8::internal |
| OLD | NEW |