Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 3495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3506 | 3506 |
| 3507 elements = new(zone()) HLoadElements(literal); | 3507 elements = new(zone()) HLoadElements(literal); |
| 3508 AddInstruction(elements); | 3508 AddInstruction(elements); |
| 3509 | 3509 |
| 3510 HValue* key = AddInstruction( | 3510 HValue* key = AddInstruction( |
| 3511 new(zone()) HConstant(Handle<Object>(Smi::FromInt(i)), | 3511 new(zone()) HConstant(Handle<Object>(Smi::FromInt(i)), |
| 3512 Representation::Integer32())); | 3512 Representation::Integer32())); |
| 3513 | 3513 |
| 3514 switch (boilerplate_elements_kind) { | 3514 switch (boilerplate_elements_kind) { |
| 3515 case FAST_SMI_ONLY_ELEMENTS: | 3515 case FAST_SMI_ONLY_ELEMENTS: |
| 3516 // Smi-only arrays need a smi check. | |
| 3517 AddInstruction(new(zone()) HCheckSmi(value)); | |
| 3518 // Fall through. | |
| 3516 case FAST_ELEMENTS: | 3519 case FAST_ELEMENTS: |
| 3517 AddInstruction(new(zone()) HStoreKeyedFastElement( | 3520 AddInstruction(new(zone()) HStoreKeyedFastElement( |
| 3518 elements, | 3521 elements, |
| 3519 key, | 3522 key, |
| 3520 value, | 3523 value, |
| 3521 boilerplate_elements_kind)); | 3524 boilerplate_elements_kind)); |
| 3522 break; | 3525 break; |
| 3523 case FAST_DOUBLE_ELEMENTS: | 3526 case FAST_DOUBLE_ELEMENTS: |
| 3524 AddInstruction(new(zone()) HStoreKeyedFastDoubleElement(elements, | 3527 AddInstruction(new(zone()) HStoreKeyedFastDoubleElement(elements, |
| 3525 key, | 3528 key, |
| (...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4216 } | 4219 } |
| 4217 | 4220 |
| 4218 | 4221 |
| 4219 HInstruction* HGraphBuilder::BuildFastElementAccess(HValue* elements, | 4222 HInstruction* HGraphBuilder::BuildFastElementAccess(HValue* elements, |
| 4220 HValue* checked_key, | 4223 HValue* checked_key, |
| 4221 HValue* val, | 4224 HValue* val, |
| 4222 ElementsKind elements_kind, | 4225 ElementsKind elements_kind, |
| 4223 bool is_store) { | 4226 bool is_store) { |
| 4224 if (is_store) { | 4227 if (is_store) { |
| 4225 ASSERT(val != NULL); | 4228 ASSERT(val != NULL); |
| 4226 if (elements_kind == FAST_DOUBLE_ELEMENTS) { | 4229 switch (elements_kind) { |
| 4227 return new(zone()) HStoreKeyedFastDoubleElement( | 4230 case FAST_DOUBLE_ELEMENTS: |
| 4228 elements, checked_key, val); | 4231 return new(zone()) HStoreKeyedFastDoubleElement( |
| 4229 } else { // FAST_ELEMENTS or FAST_SMI_ONLY_ELEMENTS. | 4232 elements, checked_key, val); |
| 4230 return new(zone()) HStoreKeyedFastElement( | 4233 case FAST_SMI_ONLY_ELEMENTS: |
| 4231 elements, checked_key, val, elements_kind); | 4234 // Smi-only arrays need a smi check. |
| 4235 AddInstruction(new(zone()) HCheckSmi(val)); | |
| 4236 // Fall through. | |
| 4237 case FAST_ELEMENTS: | |
| 4238 return new(zone()) HStoreKeyedFastElement( | |
| 4239 elements, checked_key, val, elements_kind); | |
| 4240 default: | |
| 4241 UNREACHABLE(); | |
| 4242 return NULL; | |
| 4232 } | 4243 } |
| 4233 } | 4244 } |
| 4234 // It's an element load (!is_store). | 4245 // It's an element load (!is_store). |
| 4235 if (elements_kind == FAST_DOUBLE_ELEMENTS) { | 4246 if (elements_kind == FAST_DOUBLE_ELEMENTS) { |
| 4236 return new(zone()) HLoadKeyedFastDoubleElement(elements, checked_key); | 4247 return new(zone()) HLoadKeyedFastDoubleElement(elements, checked_key); |
| 4237 } else { // FAST_ELEMENTS or FAST_SMI_ONLY_ELEMENTS. | 4248 } else { // FAST_ELEMENTS or FAST_SMI_ONLY_ELEMENTS. |
| 4238 return new(zone()) HLoadKeyedFastElement(elements, checked_key); | 4249 return new(zone()) HLoadKeyedFastElement(elements, checked_key); |
| 4239 } | 4250 } |
| 4240 } | 4251 } |
| 4241 | 4252 |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4392 elements_kind_instr, elements_kind, Token::EQ_STRICT); | 4403 elements_kind_instr, elements_kind, Token::EQ_STRICT); |
| 4393 elements_kind_branch->SetSuccessorAt(0, if_true); | 4404 elements_kind_branch->SetSuccessorAt(0, if_true); |
| 4394 elements_kind_branch->SetSuccessorAt(1, if_false); | 4405 elements_kind_branch->SetSuccessorAt(1, if_false); |
| 4395 current_block()->Finish(elements_kind_branch); | 4406 current_block()->Finish(elements_kind_branch); |
| 4396 | 4407 |
| 4397 set_current_block(if_true); | 4408 set_current_block(if_true); |
| 4398 HInstruction* access; | 4409 HInstruction* access; |
| 4399 if (elements_kind == FAST_SMI_ONLY_ELEMENTS || | 4410 if (elements_kind == FAST_SMI_ONLY_ELEMENTS || |
| 4400 elements_kind == FAST_ELEMENTS || | 4411 elements_kind == FAST_ELEMENTS || |
| 4401 elements_kind == FAST_DOUBLE_ELEMENTS) { | 4412 elements_kind == FAST_DOUBLE_ELEMENTS) { |
| 4402 if (is_store && elements_kind == FAST_SMI_ONLY_ELEMENTS) { | |
| 4403 AddInstruction(new(zone()) HCheckSmi(val)); | |
|
fschneider
2011/12/22 16:00:03
This check becomes redundant because there is now
| |
| 4404 } | |
| 4405 if (is_store && elements_kind != FAST_DOUBLE_ELEMENTS) { | 4413 if (is_store && elements_kind != FAST_DOUBLE_ELEMENTS) { |
| 4406 AddInstruction(new(zone()) HCheckMap( | 4414 AddInstruction(new(zone()) HCheckMap( |
| 4407 elements, isolate()->factory()->fixed_array_map(), | 4415 elements, isolate()->factory()->fixed_array_map(), |
| 4408 elements_kind_branch)); | 4416 elements_kind_branch)); |
| 4409 } | 4417 } |
| 4410 // TODO(jkummerow): The need for these two blocks could be avoided | 4418 // TODO(jkummerow): The need for these two blocks could be avoided |
| 4411 // in one of two ways: | 4419 // in one of two ways: |
| 4412 // (1) Introduce ElementsKinds for JSArrays that are distinct from | 4420 // (1) Introduce ElementsKinds for JSArrays that are distinct from |
| 4413 // those for fast objects. | 4421 // those for fast objects. |
| 4414 // (2) Put the common instructions into a third "join" block. This | 4422 // (2) Put the common instructions into a third "join" block. This |
| (...skipping 2888 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7303 } | 7311 } |
| 7304 } | 7312 } |
| 7305 | 7313 |
| 7306 #ifdef DEBUG | 7314 #ifdef DEBUG |
| 7307 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 7315 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
| 7308 if (allocator_ != NULL) allocator_->Verify(); | 7316 if (allocator_ != NULL) allocator_->Verify(); |
| 7309 #endif | 7317 #endif |
| 7310 } | 7318 } |
| 7311 | 7319 |
| 7312 } } // namespace v8::internal | 7320 } } // namespace v8::internal |
| OLD | NEW |