OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/code-stubs.h" | 5 #include "src/code-stubs.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 2588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2599 void FastNewClosureStub::GenerateAssembly( | 2599 void FastNewClosureStub::GenerateAssembly( |
2600 compiler::CodeAssemblerState* state) const { | 2600 compiler::CodeAssemblerState* state) const { |
2601 typedef compiler::Node Node; | 2601 typedef compiler::Node Node; |
2602 CodeStubAssembler assembler(state); | 2602 CodeStubAssembler assembler(state); |
2603 Node* shared = assembler.Parameter(Descriptor::kSharedFunctionInfo); | 2603 Node* shared = assembler.Parameter(Descriptor::kSharedFunctionInfo); |
2604 Node* context = assembler.Parameter(Descriptor::kContext); | 2604 Node* context = assembler.Parameter(Descriptor::kContext); |
2605 assembler.Return(Generate(&assembler, shared, context)); | 2605 assembler.Return(Generate(&assembler, shared, context)); |
2606 } | 2606 } |
2607 | 2607 |
2608 // static | 2608 // static |
| 2609 int FastNewFunctionContextStub::MaximumSlots() { |
| 2610 return FLAG_test_small_max_function_context_stub_size ? kSmallMaximumSlots |
| 2611 : kMaximumSlots; |
| 2612 } |
| 2613 |
| 2614 // static |
2609 compiler::Node* FastNewFunctionContextStub::Generate( | 2615 compiler::Node* FastNewFunctionContextStub::Generate( |
2610 CodeStubAssembler* assembler, compiler::Node* function, | 2616 CodeStubAssembler* assembler, compiler::Node* function, |
2611 compiler::Node* slots, compiler::Node* context) { | 2617 compiler::Node* slots, compiler::Node* context, ScopeType scope_type) { |
2612 typedef compiler::Node Node; | 2618 typedef compiler::Node Node; |
2613 | 2619 |
2614 slots = assembler->ChangeUint32ToWord(slots); | 2620 slots = assembler->ChangeUint32ToWord(slots); |
2615 | 2621 |
2616 // TODO(ishell): Use CSA::OptimalParameterMode() here. | 2622 // TODO(ishell): Use CSA::OptimalParameterMode() here. |
2617 CodeStubAssembler::ParameterMode mode = CodeStubAssembler::INTPTR_PARAMETERS; | 2623 CodeStubAssembler::ParameterMode mode = CodeStubAssembler::INTPTR_PARAMETERS; |
2618 Node* min_context_slots = | 2624 Node* min_context_slots = |
2619 assembler->IntPtrConstant(Context::MIN_CONTEXT_SLOTS); | 2625 assembler->IntPtrConstant(Context::MIN_CONTEXT_SLOTS); |
2620 Node* length = assembler->IntPtrAdd(slots, min_context_slots); | 2626 Node* length = assembler->IntPtrAdd(slots, min_context_slots); |
2621 Node* size = | 2627 Node* size = |
2622 assembler->GetFixedArrayAllocationSize(length, FAST_ELEMENTS, mode); | 2628 assembler->GetFixedArrayAllocationSize(length, FAST_ELEMENTS, mode); |
2623 | 2629 |
2624 // Create a new closure from the given function info in new space | 2630 // Create a new closure from the given function info in new space |
2625 Node* function_context = assembler->Allocate(size); | 2631 Node* function_context = assembler->Allocate(size); |
2626 | 2632 |
2627 assembler->StoreMapNoWriteBarrier(function_context, | 2633 Heap::RootListIndex context_type; |
2628 Heap::kFunctionContextMapRootIndex); | 2634 switch (scope_type) { |
| 2635 case EVAL_SCOPE: |
| 2636 context_type = Heap::kEvalContextMapRootIndex; |
| 2637 break; |
| 2638 case FUNCTION_SCOPE: |
| 2639 context_type = Heap::kFunctionContextMapRootIndex; |
| 2640 break; |
| 2641 default: |
| 2642 UNREACHABLE(); |
| 2643 } |
| 2644 assembler->StoreMapNoWriteBarrier(function_context, context_type); |
2629 assembler->StoreObjectFieldNoWriteBarrier( | 2645 assembler->StoreObjectFieldNoWriteBarrier( |
2630 function_context, Context::kLengthOffset, assembler->SmiTag(length)); | 2646 function_context, Context::kLengthOffset, assembler->SmiTag(length)); |
2631 | 2647 |
2632 // Set up the fixed slots. | 2648 // Set up the fixed slots. |
2633 assembler->StoreFixedArrayElement(function_context, Context::CLOSURE_INDEX, | 2649 assembler->StoreFixedArrayElement(function_context, Context::CLOSURE_INDEX, |
2634 function, SKIP_WRITE_BARRIER); | 2650 function, SKIP_WRITE_BARRIER); |
2635 assembler->StoreFixedArrayElement(function_context, Context::PREVIOUS_INDEX, | 2651 assembler->StoreFixedArrayElement(function_context, Context::PREVIOUS_INDEX, |
2636 context, SKIP_WRITE_BARRIER); | 2652 context, SKIP_WRITE_BARRIER); |
2637 assembler->StoreFixedArrayElement(function_context, Context::EXTENSION_INDEX, | 2653 assembler->StoreFixedArrayElement(function_context, Context::EXTENSION_INDEX, |
2638 assembler->TheHoleConstant(), | 2654 assembler->TheHoleConstant(), |
(...skipping 19 matching lines...) Expand all Loading... |
2658 } | 2674 } |
2659 | 2675 |
2660 void FastNewFunctionContextStub::GenerateAssembly( | 2676 void FastNewFunctionContextStub::GenerateAssembly( |
2661 compiler::CodeAssemblerState* state) const { | 2677 compiler::CodeAssemblerState* state) const { |
2662 typedef compiler::Node Node; | 2678 typedef compiler::Node Node; |
2663 CodeStubAssembler assembler(state); | 2679 CodeStubAssembler assembler(state); |
2664 Node* function = assembler.Parameter(Descriptor::kFunction); | 2680 Node* function = assembler.Parameter(Descriptor::kFunction); |
2665 Node* slots = assembler.Parameter(Descriptor::kSlots); | 2681 Node* slots = assembler.Parameter(Descriptor::kSlots); |
2666 Node* context = assembler.Parameter(Descriptor::kContext); | 2682 Node* context = assembler.Parameter(Descriptor::kContext); |
2667 | 2683 |
2668 assembler.Return(Generate(&assembler, function, slots, context)); | 2684 assembler.Return( |
| 2685 Generate(&assembler, function, slots, context, scope_type())); |
2669 } | 2686 } |
2670 | 2687 |
2671 // static | 2688 // static |
2672 compiler::Node* FastCloneRegExpStub::Generate(CodeStubAssembler* assembler, | 2689 compiler::Node* FastCloneRegExpStub::Generate(CodeStubAssembler* assembler, |
2673 compiler::Node* closure, | 2690 compiler::Node* closure, |
2674 compiler::Node* literal_index, | 2691 compiler::Node* literal_index, |
2675 compiler::Node* pattern, | 2692 compiler::Node* pattern, |
2676 compiler::Node* flags, | 2693 compiler::Node* flags, |
2677 compiler::Node* context) { | 2694 compiler::Node* context) { |
2678 typedef CodeStubAssembler::Label Label; | 2695 typedef CodeStubAssembler::Label Label; |
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3220 } | 3237 } |
3221 | 3238 |
3222 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) | 3239 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) |
3223 : PlatformCodeStub(isolate) {} | 3240 : PlatformCodeStub(isolate) {} |
3224 | 3241 |
3225 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) | 3242 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) |
3226 : PlatformCodeStub(isolate) {} | 3243 : PlatformCodeStub(isolate) {} |
3227 | 3244 |
3228 } // namespace internal | 3245 } // namespace internal |
3229 } // namespace v8 | 3246 } // namespace v8 |
OLD | NEW |