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 4760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4771 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 4771 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
4772 ASSERT(!CompileTimeValue::IsCompileTimeValue(value)); | 4772 ASSERT(!CompileTimeValue::IsCompileTimeValue(value)); |
4773 // Fall through. | 4773 // Fall through. |
4774 case ObjectLiteral::Property::COMPUTED: | 4774 case ObjectLiteral::Property::COMPUTED: |
4775 if (key->handle()->IsSymbol()) { | 4775 if (key->handle()->IsSymbol()) { |
4776 if (property->emit_store()) { | 4776 if (property->emit_store()) { |
4777 property->RecordTypeFeedback(oracle()); | 4777 property->RecordTypeFeedback(oracle()); |
4778 CHECK_ALIVE(VisitForValue(value)); | 4778 CHECK_ALIVE(VisitForValue(value)); |
4779 HValue* value = Pop(); | 4779 HValue* value = Pop(); |
4780 HInstruction* store; | 4780 HInstruction* store; |
4781 CHECK_ALIVE(store = BuildStoreNamed(literal, value, property)); | 4781 CHECK_ALIVE(store = BuildStoreNamed(literal, |
| 4782 value, |
| 4783 property->GetReceiverType(), |
| 4784 property->key())); |
4782 AddInstruction(store); | 4785 AddInstruction(store); |
4783 if (store->HasObservableSideEffects()) AddSimulate(key->id()); | 4786 if (store->HasObservableSideEffects()) AddSimulate(key->id()); |
4784 } else { | 4787 } else { |
4785 CHECK_ALIVE(VisitForEffect(value)); | 4788 CHECK_ALIVE(VisitForEffect(value)); |
4786 } | 4789 } |
4787 break; | 4790 break; |
4788 } | 4791 } |
4789 // Fall through. | 4792 // Fall through. |
4790 case ObjectLiteral::Property::PROTOTYPE: | 4793 case ObjectLiteral::Property::PROTOTYPE: |
4791 case ObjectLiteral::Property::SETTER: | 4794 case ObjectLiteral::Property::SETTER: |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5009 context, | 5012 context, |
5010 object, | 5013 object, |
5011 name, | 5014 name, |
5012 value, | 5015 value, |
5013 function_strict_mode_flag()); | 5016 function_strict_mode_flag()); |
5014 } | 5017 } |
5015 | 5018 |
5016 | 5019 |
5017 HInstruction* HGraphBuilder::BuildStoreNamed(HValue* object, | 5020 HInstruction* HGraphBuilder::BuildStoreNamed(HValue* object, |
5018 HValue* value, | 5021 HValue* value, |
5019 ObjectLiteral::Property* prop) { | 5022 Handle<Map> type, |
5020 Literal* key = prop->key()->AsLiteral(); | 5023 Expression* key) { |
5021 Handle<String> name = Handle<String>::cast(key->handle()); | 5024 Handle<String> name = Handle<String>::cast(key->AsLiteral()->handle()); |
5022 ASSERT(!name.is_null()); | 5025 ASSERT(!name.is_null()); |
5023 | 5026 |
5024 LookupResult lookup(isolate()); | 5027 LookupResult lookup(isolate()); |
5025 Handle<Map> type = prop->GetReceiverType(); | 5028 bool is_monomorphic = !type.is_null() && |
5026 bool is_monomorphic = prop->IsMonomorphic() && | |
5027 ComputeLoadStoreField(type, name, &lookup, true); | 5029 ComputeLoadStoreField(type, name, &lookup, true); |
5028 | 5030 |
5029 return is_monomorphic | 5031 return is_monomorphic |
5030 ? BuildStoreNamedField(object, name, value, type, &lookup, | 5032 ? BuildStoreNamedField(object, name, value, type, &lookup, |
5031 true) // Needs smi and map check. | 5033 true) // Needs smi and map check. |
5032 : BuildStoreNamedGeneric(object, name, value); | 5034 : BuildStoreNamedGeneric(object, name, value); |
5033 } | 5035 } |
5034 | 5036 |
5035 | 5037 |
5036 HInstruction* HGraphBuilder::BuildStoreNamed(HValue* object, | |
5037 HValue* value, | |
5038 Expression* expr) { | |
5039 Property* prop = (expr->AsProperty() != NULL) | |
5040 ? expr->AsProperty() | |
5041 : expr->AsAssignment()->target()->AsProperty(); | |
5042 Literal* key = prop->key()->AsLiteral(); | |
5043 Handle<String> name = Handle<String>::cast(key->handle()); | |
5044 ASSERT(!name.is_null()); | |
5045 | |
5046 LookupResult lookup(isolate()); | |
5047 SmallMapList* types = expr->GetReceiverTypes(); | |
5048 bool is_monomorphic = expr->IsMonomorphic() && | |
5049 ComputeLoadStoreField(types->first(), name, &lookup, true); | |
5050 | |
5051 return is_monomorphic | |
5052 ? BuildStoreNamedField(object, name, value, types->first(), &lookup, | |
5053 true) // Needs smi and map check. | |
5054 : BuildStoreNamedGeneric(object, name, value); | |
5055 } | |
5056 | |
5057 | |
5058 void HGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr, | 5038 void HGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr, |
5059 HValue* object, | 5039 HValue* object, |
5060 SmallMapList* types, | 5040 SmallMapList* types, |
5061 Handle<String> name) { | 5041 Handle<String> name) { |
5062 int count = 0; | 5042 int count = 0; |
5063 int previous_field_offset = 0; | 5043 int previous_field_offset = 0; |
5064 bool previous_field_is_in_object = false; | 5044 bool previous_field_is_in_object = false; |
5065 bool is_monomorphic_field = true; | 5045 bool is_monomorphic_field = true; |
5066 Handle<Map> map; | 5046 Handle<Map> map; |
5067 LookupResult lookup(isolate()); | 5047 LookupResult lookup(isolate()); |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5199 CHECK_ALIVE(VisitForValue(expr->value())); | 5179 CHECK_ALIVE(VisitForValue(expr->value())); |
5200 value = Pop(); | 5180 value = Pop(); |
5201 HValue* object = Pop(); | 5181 HValue* object = Pop(); |
5202 | 5182 |
5203 Literal* key = prop->key()->AsLiteral(); | 5183 Literal* key = prop->key()->AsLiteral(); |
5204 Handle<String> name = Handle<String>::cast(key->handle()); | 5184 Handle<String> name = Handle<String>::cast(key->handle()); |
5205 ASSERT(!name.is_null()); | 5185 ASSERT(!name.is_null()); |
5206 | 5186 |
5207 SmallMapList* types = expr->GetReceiverTypes(); | 5187 SmallMapList* types = expr->GetReceiverTypes(); |
5208 if (expr->IsMonomorphic()) { | 5188 if (expr->IsMonomorphic()) { |
5209 CHECK_ALIVE(instr = BuildStoreNamed(object, value, expr)); | 5189 CHECK(expr->AsProperty() == NULL); |
| 5190 Property* prop = expr->AsAssignment()->target()->AsProperty(); |
| 5191 CHECK_ALIVE(instr = BuildStoreNamed(object, |
| 5192 value, |
| 5193 prop->GetReceiverType(), |
| 5194 prop->key())); |
5210 | 5195 |
5211 } else if (types != NULL && types->length() > 1) { | 5196 } else if (types != NULL && types->length() > 1) { |
5212 HandlePolymorphicStoreNamedField(expr, object, value, types, name); | 5197 HandlePolymorphicStoreNamedField(expr, object, value, types, name); |
5213 return; | 5198 return; |
5214 | 5199 |
5215 } else { | 5200 } else { |
5216 instr = BuildStoreNamedGeneric(object, name, value); | 5201 instr = BuildStoreNamedGeneric(object, name, value); |
5217 } | 5202 } |
5218 | 5203 |
5219 } else { | 5204 } else { |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5379 | 5364 |
5380 CHECK_ALIVE(VisitForValue(expr->value())); | 5365 CHECK_ALIVE(VisitForValue(expr->value())); |
5381 HValue* right = Pop(); | 5366 HValue* right = Pop(); |
5382 HValue* left = Pop(); | 5367 HValue* left = Pop(); |
5383 | 5368 |
5384 HInstruction* instr = BuildBinaryOperation(operation, left, right); | 5369 HInstruction* instr = BuildBinaryOperation(operation, left, right); |
5385 PushAndAdd(instr); | 5370 PushAndAdd(instr); |
5386 if (instr->HasObservableSideEffects()) AddSimulate(operation->id()); | 5371 if (instr->HasObservableSideEffects()) AddSimulate(operation->id()); |
5387 | 5372 |
5388 HInstruction* store; | 5373 HInstruction* store; |
5389 CHECK_ALIVE(store = BuildStoreNamed(obj, instr, prop)); | 5374 CHECK_ALIVE(store = BuildStoreNamed(obj, |
| 5375 instr, |
| 5376 prop->GetReceiverType(), |
| 5377 prop->key())); |
5390 AddInstruction(store); | 5378 AddInstruction(store); |
5391 // Drop the simulated receiver and value. Return the value. | 5379 // Drop the simulated receiver and value. Return the value. |
5392 Drop(2); | 5380 Drop(2); |
5393 Push(instr); | 5381 Push(instr); |
5394 if (store->HasObservableSideEffects()) AddSimulate(expr->AssignmentId()); | 5382 if (store->HasObservableSideEffects()) AddSimulate(expr->AssignmentId()); |
5395 return ast_context()->ReturnValue(Pop()); | 5383 return ast_context()->ReturnValue(Pop()); |
5396 | 5384 |
5397 } else { | 5385 } else { |
5398 // Keyed property. | 5386 // Keyed property. |
5399 CHECK_ALIVE(VisitForValue(prop->obj())); | 5387 CHECK_ALIVE(VisitForValue(prop->obj())); |
(...skipping 2380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7780 } else { | 7768 } else { |
7781 load = BuildLoadNamedGeneric(obj, prop); | 7769 load = BuildLoadNamedGeneric(obj, prop); |
7782 } | 7770 } |
7783 PushAndAdd(load); | 7771 PushAndAdd(load); |
7784 if (load->HasObservableSideEffects()) AddSimulate(expr->CountId()); | 7772 if (load->HasObservableSideEffects()) AddSimulate(expr->CountId()); |
7785 | 7773 |
7786 after = BuildIncrement(returns_original_input, expr); | 7774 after = BuildIncrement(returns_original_input, expr); |
7787 input = Pop(); | 7775 input = Pop(); |
7788 | 7776 |
7789 HInstruction* store; | 7777 HInstruction* store; |
7790 CHECK_ALIVE(store = BuildStoreNamed(obj, after, prop)); | 7778 CHECK_ALIVE(store = BuildStoreNamed(obj, |
| 7779 after, |
| 7780 prop->GetReceiverType(), |
| 7781 prop->key())); |
7791 AddInstruction(store); | 7782 AddInstruction(store); |
7792 | 7783 |
7793 // Overwrite the receiver in the bailout environment with the result | 7784 // Overwrite the receiver in the bailout environment with the result |
7794 // of the operation, and the placeholder with the original value if | 7785 // of the operation, and the placeholder with the original value if |
7795 // necessary. | 7786 // necessary. |
7796 environment()->SetExpressionStackAt(0, after); | 7787 environment()->SetExpressionStackAt(0, after); |
7797 if (returns_original_input) environment()->SetExpressionStackAt(1, input); | 7788 if (returns_original_input) environment()->SetExpressionStackAt(1, input); |
7798 if (store->HasObservableSideEffects()) AddSimulate(expr->AssignmentId()); | 7789 if (store->HasObservableSideEffects()) AddSimulate(expr->AssignmentId()); |
7799 | 7790 |
7800 } else { | 7791 } else { |
(...skipping 1755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9556 } | 9547 } |
9557 } | 9548 } |
9558 | 9549 |
9559 #ifdef DEBUG | 9550 #ifdef DEBUG |
9560 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 9551 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
9561 if (allocator_ != NULL) allocator_->Verify(); | 9552 if (allocator_ != NULL) allocator_->Verify(); |
9562 #endif | 9553 #endif |
9563 } | 9554 } |
9564 | 9555 |
9565 } } // namespace v8::internal | 9556 } } // namespace v8::internal |
OLD | NEW |