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 5161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5172 | 5172 |
5173 void FastNewClosureStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 5173 void FastNewClosureStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
5174 assembler->Return( | 5174 assembler->Return( |
5175 Generate(assembler, assembler->Parameter(0), assembler->Parameter(1))); | 5175 Generate(assembler, assembler->Parameter(0), assembler->Parameter(1))); |
5176 } | 5176 } |
5177 | 5177 |
5178 // static | 5178 // static |
5179 compiler::Node* FastNewFunctionContextStub::Generate( | 5179 compiler::Node* FastNewFunctionContextStub::Generate( |
5180 CodeStubAssembler* assembler, compiler::Node* function, | 5180 CodeStubAssembler* assembler, compiler::Node* function, |
5181 compiler::Node* slots, compiler::Node* context) { | 5181 compiler::Node* slots, compiler::Node* context) { |
5182 typedef CodeStubAssembler::Label Label; | |
5183 typedef compiler::Node Node; | 5182 typedef compiler::Node Node; |
5184 typedef CodeStubAssembler::Variable Variable; | |
5185 | 5183 |
5186 Node* min_context_slots = | 5184 Node* min_context_slots = |
5187 assembler->Int32Constant(Context::MIN_CONTEXT_SLOTS); | 5185 assembler->Int32Constant(Context::MIN_CONTEXT_SLOTS); |
5188 Node* length = assembler->Int32Add(slots, min_context_slots); | 5186 Node* length = assembler->Int32Add(slots, min_context_slots); |
5189 Node* size = assembler->Int32Add( | 5187 Node* size = assembler->Int32Add( |
5190 assembler->Word32Shl(length, assembler->Int32Constant(kPointerSizeLog2)), | 5188 assembler->Word32Shl(length, assembler->Int32Constant(kPointerSizeLog2)), |
5191 assembler->Int32Constant(FixedArray::kHeaderSize)); | 5189 assembler->Int32Constant(FixedArray::kHeaderSize)); |
5192 | 5190 |
5193 // Create a new closure from the given function info in new space | 5191 // Create a new closure from the given function info in new space |
5194 Node* function_context = assembler->Allocate(size); | 5192 Node* function_context = assembler->Allocate(size); |
(...skipping 18 matching lines...) Expand all Loading... |
5213 assembler->TheHoleConstant(), SKIP_WRITE_BARRIER); | 5211 assembler->TheHoleConstant(), SKIP_WRITE_BARRIER); |
5214 | 5212 |
5215 // Copy the native context from the previous context. | 5213 // Copy the native context from the previous context. |
5216 Node* native_context = assembler->LoadNativeContext(context); | 5214 Node* native_context = assembler->LoadNativeContext(context); |
5217 assembler->StoreFixedArrayElement( | 5215 assembler->StoreFixedArrayElement( |
5218 function_context, assembler->Int32Constant(Context::NATIVE_CONTEXT_INDEX), | 5216 function_context, assembler->Int32Constant(Context::NATIVE_CONTEXT_INDEX), |
5219 native_context, SKIP_WRITE_BARRIER); | 5217 native_context, SKIP_WRITE_BARRIER); |
5220 | 5218 |
5221 // Initialize the rest of the slots to undefined. | 5219 // Initialize the rest of the slots to undefined. |
5222 Node* undefined = assembler->UndefinedConstant(); | 5220 Node* undefined = assembler->UndefinedConstant(); |
5223 Variable var_slot_index(assembler, MachineRepresentation::kWord32); | 5221 assembler->BuildFastFixedArrayForEach( |
5224 var_slot_index.Bind(min_context_slots); | 5222 function_context, FAST_ELEMENTS, min_context_slots, length, |
5225 Label loop(assembler, &var_slot_index), after_loop(assembler); | 5223 [undefined](CodeStubAssembler* assembler, Node* context, Node* offset) { |
5226 assembler->Goto(&loop); | 5224 assembler->StoreNoWriteBarrier(MachineType::PointerRepresentation(), |
5227 | 5225 context, offset, undefined); |
5228 assembler->Bind(&loop); | 5226 }); |
5229 { | |
5230 Node* slot_index = var_slot_index.value(); | |
5231 assembler->GotoUnless(assembler->Int32LessThan(slot_index, length), | |
5232 &after_loop); | |
5233 assembler->StoreFixedArrayElement(function_context, slot_index, undefined, | |
5234 SKIP_WRITE_BARRIER); | |
5235 Node* one = assembler->Int32Constant(1); | |
5236 Node* next_index = assembler->Int32Add(slot_index, one); | |
5237 var_slot_index.Bind(next_index); | |
5238 assembler->Goto(&loop); | |
5239 } | |
5240 assembler->Bind(&after_loop); | |
5241 | 5227 |
5242 return function_context; | 5228 return function_context; |
5243 } | 5229 } |
5244 | 5230 |
5245 void FastNewFunctionContextStub::GenerateAssembly( | 5231 void FastNewFunctionContextStub::GenerateAssembly( |
5246 CodeStubAssembler* assembler) const { | 5232 CodeStubAssembler* assembler) const { |
5247 typedef compiler::Node Node; | 5233 typedef compiler::Node Node; |
5248 Node* function = assembler->Parameter(Descriptor::kFunction); | 5234 Node* function = assembler->Parameter(Descriptor::kFunction); |
5249 Node* slots = assembler->Parameter(FastNewFunctionContextDescriptor::kSlots); | 5235 Node* slots = assembler->Parameter(FastNewFunctionContextDescriptor::kSlots); |
5250 Node* context = assembler->Parameter(Descriptor::kContext); | 5236 Node* context = assembler->Parameter(Descriptor::kContext); |
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5872 | 5858 |
5873 if (type == MachineType::Pointer()) { | 5859 if (type == MachineType::Pointer()) { |
5874 return Representation::External(); | 5860 return Representation::External(); |
5875 } | 5861 } |
5876 | 5862 |
5877 return Representation::Tagged(); | 5863 return Representation::Tagged(); |
5878 } | 5864 } |
5879 | 5865 |
5880 } // namespace internal | 5866 } // namespace internal |
5881 } // namespace v8 | 5867 } // namespace v8 |
OLD | NEW |