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 7243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7254 previous_representation)) { | 7254 previous_representation)) { |
7255 break; | 7255 break; |
7256 } | 7256 } |
7257 } | 7257 } |
7258 | 7258 |
7259 if (types->length() == count) { | 7259 if (types->length() == count) { |
7260 AddInstruction(new(zone()) HCheckNonSmi(object)); | 7260 AddInstruction(new(zone()) HCheckNonSmi(object)); |
7261 AddInstruction(HCheckMaps::New(object, types, zone())); | 7261 AddInstruction(HCheckMaps::New(object, types, zone())); |
7262 HInstruction* instr = BuildStoreNamedField( | 7262 HInstruction* instr = BuildStoreNamedField( |
7263 object, name, value, map, &lookup); | 7263 object, name, value, map, &lookup); |
| 7264 AddInstruction(instr); |
7264 instr->set_position(expr->position()); | 7265 instr->set_position(expr->position()); |
7265 return ast_context()->ReturnInstruction(instr, expr->id()); | 7266 // The HSimulate for the store should not see the stored value in |
| 7267 // effect contexts (it is not materialized at expr->id() in the |
| 7268 // unoptimized code). |
| 7269 if (instr->HasObservableSideEffects()) { |
| 7270 if (ast_context()->IsEffect()) { |
| 7271 AddSimulate(expr->id(), REMOVABLE_SIMULATE); |
| 7272 } else { |
| 7273 Push(value); |
| 7274 AddSimulate(expr->id(), REMOVABLE_SIMULATE); |
| 7275 Drop(1); |
| 7276 } |
| 7277 } |
| 7278 return ast_context()->ReturnValue(value); |
7266 } | 7279 } |
7267 } | 7280 } |
7268 | 7281 |
7269 // TODO(ager): We should recognize when the prototype chains for different | 7282 // TODO(ager): We should recognize when the prototype chains for different |
7270 // maps are identical. In that case we can avoid repeatedly generating the | 7283 // maps are identical. In that case we can avoid repeatedly generating the |
7271 // same prototype map checks. | 7284 // same prototype map checks. |
7272 int count = 0; | 7285 int count = 0; |
7273 HBasicBlock* join = NULL; | 7286 HBasicBlock* join = NULL; |
7274 for (int i = 0; i < types->length() && count < kMaxStorePolymorphism; ++i) { | 7287 for (int i = 0; i < types->length() && count < kMaxStorePolymorphism; ++i) { |
7275 Handle<Map> map = types->at(i); | 7288 Handle<Map> map = types->at(i); |
(...skipping 5076 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12352 } | 12365 } |
12353 } | 12366 } |
12354 | 12367 |
12355 #ifdef DEBUG | 12368 #ifdef DEBUG |
12356 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 12369 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
12357 if (allocator_ != NULL) allocator_->Verify(); | 12370 if (allocator_ != NULL) allocator_->Verify(); |
12358 #endif | 12371 #endif |
12359 } | 12372 } |
12360 | 12373 |
12361 } } // namespace v8::internal | 12374 } } // namespace v8::internal |
OLD | NEW |