Chromium Code Reviews| 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 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 167 // It's essential to bind this value to the environment in case of deopt. | 167 // It's essential to bind this value to the environment in case of deopt. |
| 168 AddInstruction(stack_parameter_count); | 168 AddInstruction(stack_parameter_count); |
| 169 start_environment->Bind(param_count, stack_parameter_count); | 169 start_environment->Bind(param_count, stack_parameter_count); |
| 170 arguments_length_ = stack_parameter_count; | 170 arguments_length_ = stack_parameter_count; |
| 171 } else { | 171 } else { |
| 172 ASSERT(descriptor_->environment_length() == param_count); | 172 ASSERT(descriptor_->environment_length() == param_count); |
| 173 stack_parameter_count = graph()->GetConstantMinus1(); | 173 stack_parameter_count = graph()->GetConstantMinus1(); |
| 174 arguments_length_ = graph()->GetConstant0(); | 174 arguments_length_ = graph()->GetConstant0(); |
| 175 } | 175 } |
| 176 | 176 |
| 177 context_ = New<HContext>(); | 177 context_ = Add<HContext>(); |
| 178 AddInstruction(context_); | |
| 179 start_environment->BindContext(context_); | 178 start_environment->BindContext(context_); |
| 180 | 179 |
| 181 Add<HSimulate>(BailoutId::StubEntry()); | 180 Add<HSimulate>(BailoutId::StubEntry()); |
| 182 | 181 |
| 183 NoObservableSideEffectsScope no_effects(this); | 182 NoObservableSideEffectsScope no_effects(this); |
| 184 | 183 |
| 185 HValue* return_value = BuildCodeStub(); | 184 HValue* return_value = BuildCodeStub(); |
| 186 | 185 |
| 187 // We might have extra expressions to pop from the stack in addition to the | 186 // We might have extra expressions to pop from the stack in addition to the |
| 188 // arguments above. | 187 // arguments above. |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 560 return DoGenerateCode(isolate, this); | 559 return DoGenerateCode(isolate, this); |
| 561 } | 560 } |
| 562 | 561 |
| 563 | 562 |
| 564 template<> | 563 template<> |
| 565 HValue* CodeStubGraphBuilder<LoadFieldStub>::BuildCodeStub() { | 564 HValue* CodeStubGraphBuilder<LoadFieldStub>::BuildCodeStub() { |
| 566 Representation rep = casted_stub()->representation(); | 565 Representation rep = casted_stub()->representation(); |
| 567 HObjectAccess access = casted_stub()->is_inobject() ? | 566 HObjectAccess access = casted_stub()->is_inobject() ? |
| 568 HObjectAccess::ForJSObjectOffset(casted_stub()->offset(), rep) : | 567 HObjectAccess::ForJSObjectOffset(casted_stub()->offset(), rep) : |
| 569 HObjectAccess::ForBackingStoreOffset(casted_stub()->offset(), rep); | 568 HObjectAccess::ForBackingStoreOffset(casted_stub()->offset(), rep); |
| 570 return AddInstruction(BuildLoadNamedField(GetParameter(0), access)); | 569 return AddLoadNamedField(GetParameter(0), access); |
| 571 } | 570 } |
| 572 | 571 |
| 573 | 572 |
| 574 Handle<Code> LoadFieldStub::GenerateCode(Isolate* isolate) { | 573 Handle<Code> LoadFieldStub::GenerateCode(Isolate* isolate) { |
| 575 return DoGenerateCode(isolate, this); | 574 return DoGenerateCode(isolate, this); |
| 576 } | 575 } |
| 577 | 576 |
| 578 | 577 |
| 579 template<> | 578 template<> |
| 580 HValue* CodeStubGraphBuilder<KeyedLoadFieldStub>::BuildCodeStub() { | 579 HValue* CodeStubGraphBuilder<KeyedLoadFieldStub>::BuildCodeStub() { |
| 581 Representation rep = casted_stub()->representation(); | 580 Representation rep = casted_stub()->representation(); |
| 582 HObjectAccess access = casted_stub()->is_inobject() ? | 581 HObjectAccess access = casted_stub()->is_inobject() ? |
| 583 HObjectAccess::ForJSObjectOffset(casted_stub()->offset(), rep) : | 582 HObjectAccess::ForJSObjectOffset(casted_stub()->offset(), rep) : |
| 584 HObjectAccess::ForBackingStoreOffset(casted_stub()->offset(), rep); | 583 HObjectAccess::ForBackingStoreOffset(casted_stub()->offset(), rep); |
| 585 return AddInstruction(BuildLoadNamedField(GetParameter(0), access)); | 584 return AddLoadNamedField(GetParameter(0), access); |
| 586 } | 585 } |
| 587 | 586 |
| 588 | 587 |
| 589 Handle<Code> KeyedLoadFieldStub::GenerateCode(Isolate* isolate) { | 588 Handle<Code> KeyedLoadFieldStub::GenerateCode(Isolate* isolate) { |
| 590 return DoGenerateCode(isolate, this); | 589 return DoGenerateCode(isolate, this); |
| 591 } | 590 } |
| 592 | 591 |
| 593 | 592 |
| 594 template <> | 593 template <> |
| 595 HValue* CodeStubGraphBuilder<KeyedStoreFastElementStub>::BuildCodeStub() { | 594 HValue* CodeStubGraphBuilder<KeyedStoreFastElementStub>::BuildCodeStub() { |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 681 } | 680 } |
| 682 | 681 |
| 683 | 682 |
| 684 HValue* CodeStubGraphBuilderBase::BuildArraySingleArgumentConstructor( | 683 HValue* CodeStubGraphBuilderBase::BuildArraySingleArgumentConstructor( |
| 685 JSArrayBuilder* array_builder) { | 684 JSArrayBuilder* array_builder) { |
| 686 // Smi check and range check on the input arg. | 685 // Smi check and range check on the input arg. |
| 687 HValue* constant_one = graph()->GetConstant1(); | 686 HValue* constant_one = graph()->GetConstant1(); |
| 688 HValue* constant_zero = graph()->GetConstant0(); | 687 HValue* constant_zero = graph()->GetConstant0(); |
| 689 | 688 |
| 690 HInstruction* elements = Add<HArgumentsElements>(false); | 689 HInstruction* elements = Add<HArgumentsElements>(false); |
| 691 HInstruction* argument = AddInstruction( | 690 HInstruction* argument = Add<HAccessArgumentsAt>(elements, constant_one, |
|
Benedikt Meurer
2013/10/22 08:38:57
Fix indentation to have all arguments on next line
Igor Sheludko
2013/10/22 10:49:17
Done.
| |
| 692 new(zone()) HAccessArgumentsAt(elements, constant_one, constant_zero)); | 691 constant_zero); |
| 693 | 692 |
| 694 HConstant* max_alloc_length = | 693 HConstant* max_alloc_length = |
| 695 Add<HConstant>(JSObject::kInitialMaxFastElementArray); | 694 Add<HConstant>(JSObject::kInitialMaxFastElementArray); |
| 696 const int initial_capacity = JSArray::kPreallocatedArrayElements; | 695 const int initial_capacity = JSArray::kPreallocatedArrayElements; |
| 697 HConstant* initial_capacity_node = New<HConstant>(initial_capacity); | 696 HConstant* initial_capacity_node = Add<HConstant>(initial_capacity); |
| 698 AddInstruction(initial_capacity_node); | |
| 699 | 697 |
| 700 HInstruction* checked_arg = Add<HBoundsCheck>(argument, max_alloc_length); | 698 HInstruction* checked_arg = Add<HBoundsCheck>(argument, max_alloc_length); |
| 701 IfBuilder if_builder(this); | 699 IfBuilder if_builder(this); |
| 702 if_builder.If<HCompareNumericAndBranch>(checked_arg, constant_zero, | 700 if_builder.If<HCompareNumericAndBranch>(checked_arg, constant_zero, |
| 703 Token::EQ); | 701 Token::EQ); |
| 704 if_builder.Then(); | 702 if_builder.Then(); |
| 705 Push(initial_capacity_node); // capacity | 703 Push(initial_capacity_node); // capacity |
| 706 Push(constant_zero); // length | 704 Push(constant_zero); // length |
| 707 if_builder.Else(); | 705 if_builder.Else(); |
| 708 Push(checked_arg); // capacity | 706 Push(checked_arg); // capacity |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 731 HValue* elements = array_builder->GetElementsLocation(); | 729 HValue* elements = array_builder->GetElementsLocation(); |
| 732 ASSERT(elements != NULL); | 730 ASSERT(elements != NULL); |
| 733 | 731 |
| 734 // Now populate the elements correctly. | 732 // Now populate the elements correctly. |
| 735 LoopBuilder builder(this, | 733 LoopBuilder builder(this, |
| 736 context(), | 734 context(), |
| 737 LoopBuilder::kPostIncrement); | 735 LoopBuilder::kPostIncrement); |
| 738 HValue* start = graph()->GetConstant0(); | 736 HValue* start = graph()->GetConstant0(); |
| 739 HValue* key = builder.BeginBody(start, length, Token::LT); | 737 HValue* key = builder.BeginBody(start, length, Token::LT); |
| 740 HInstruction* argument_elements = Add<HArgumentsElements>(false); | 738 HInstruction* argument_elements = Add<HArgumentsElements>(false); |
| 741 HInstruction* argument = AddInstruction(new(zone()) HAccessArgumentsAt( | 739 HInstruction* argument = Add<HAccessArgumentsAt>(argument_elements, |
|
Benedikt Meurer
2013/10/22 08:38:57
Funky indentation, put all arguments on next line.
Igor Sheludko
2013/10/22 10:49:17
Done.
| |
| 742 argument_elements, length, key)); | 740 length, key); |
| 743 | 741 |
| 744 Add<HStoreKeyed>(elements, key, argument, kind); | 742 Add<HStoreKeyed>(elements, key, argument, kind); |
| 745 builder.EndBody(); | 743 builder.EndBody(); |
| 746 return new_object; | 744 return new_object; |
| 747 } | 745 } |
| 748 | 746 |
| 749 | 747 |
| 750 template <> | 748 template <> |
| 751 HValue* CodeStubGraphBuilder<ArrayNoArgumentConstructorStub>::BuildCodeStub() { | 749 HValue* CodeStubGraphBuilder<ArrayNoArgumentConstructorStub>::BuildCodeStub() { |
| 752 ElementsKind kind = casted_stub()->elements_kind(); | 750 ElementsKind kind = casted_stub()->elements_kind(); |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1161 restore_check.If<HCompareNumericAndBranch>(key, second_entry_index, | 1159 restore_check.If<HCompareNumericAndBranch>(key, second_entry_index, |
| 1162 Token::EQ); | 1160 Token::EQ); |
| 1163 restore_check.Then(); | 1161 restore_check.Then(); |
| 1164 { | 1162 { |
| 1165 // Store the unoptimized code | 1163 // Store the unoptimized code |
| 1166 BuildInstallCode(js_function, shared_info); | 1164 BuildInstallCode(js_function, shared_info); |
| 1167 loop_builder.Break(); | 1165 loop_builder.Break(); |
| 1168 } | 1166 } |
| 1169 restore_check.Else(); | 1167 restore_check.Else(); |
| 1170 { | 1168 { |
| 1171 HValue* keyed_minus = AddInstruction(HSub::New(zone(), context(), key, | 1169 HValue* keyed_minus = AddUncasted<HSub>(key, |
|
Benedikt Meurer
2013/10/22 08:38:57
Funky indentation again.
Igor Sheludko
2013/10/22 10:49:17
Done.
| |
| 1172 shared_function_entry_length)); | 1170 shared_function_entry_length); |
| 1173 HInstruction* keyed_lookup = Add<HLoadKeyed>(optimized_map, | 1171 HInstruction* keyed_lookup = Add<HLoadKeyed>(optimized_map, |
| 1174 keyed_minus, static_cast<HValue*>(NULL), FAST_ELEMENTS); | 1172 keyed_minus, static_cast<HValue*>(NULL), FAST_ELEMENTS); |
| 1175 IfBuilder done_check(this); | 1173 IfBuilder done_check(this); |
| 1176 done_check.If<HCompareObjectEqAndBranch>(native_context, | 1174 done_check.If<HCompareObjectEqAndBranch>(native_context, |
| 1177 keyed_lookup); | 1175 keyed_lookup); |
| 1178 done_check.Then(); | 1176 done_check.Then(); |
| 1179 { | 1177 { |
| 1180 // Hit: fetch the optimized code. | 1178 // Hit: fetch the optimized code. |
| 1181 HValue* keyed_plus = AddInstruction(HAdd::New(zone(), context(), | 1179 HValue* keyed_plus = AddUncasted<HAdd>(keyed_minus, |
|
Benedikt Meurer
2013/10/22 08:38:57
Funky indentation again.
Igor Sheludko
2013/10/22 10:49:17
Done.
| |
| 1182 keyed_minus, graph()->GetConstant1())); | 1180 graph()->GetConstant1()); |
| 1183 HValue* code_object = Add<HLoadKeyed>(optimized_map, | 1181 HValue* code_object = Add<HLoadKeyed>(optimized_map, |
| 1184 keyed_plus, static_cast<HValue*>(NULL), FAST_ELEMENTS); | 1182 keyed_plus, static_cast<HValue*>(NULL), FAST_ELEMENTS); |
| 1185 BuildInstallOptimizedCode(js_function, native_context, code_object); | 1183 BuildInstallOptimizedCode(js_function, native_context, code_object); |
| 1186 | 1184 |
| 1187 // Fall out of the loop | 1185 // Fall out of the loop |
| 1188 loop_builder.Break(); | 1186 loop_builder.Break(); |
| 1189 } | 1187 } |
| 1190 done_check.Else(); | 1188 done_check.Else(); |
| 1191 done_check.End(); | 1189 done_check.End(); |
| 1192 } | 1190 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1254 return js_function; | 1252 return js_function; |
| 1255 } | 1253 } |
| 1256 | 1254 |
| 1257 | 1255 |
| 1258 Handle<Code> FastNewClosureStub::GenerateCode(Isolate* isolate) { | 1256 Handle<Code> FastNewClosureStub::GenerateCode(Isolate* isolate) { |
| 1259 return DoGenerateCode(isolate, this); | 1257 return DoGenerateCode(isolate, this); |
| 1260 } | 1258 } |
| 1261 | 1259 |
| 1262 | 1260 |
| 1263 } } // namespace v8::internal | 1261 } } // namespace v8::internal |
| OLD | NEW |