Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Unified Diff: src/code-stubs.cc

Issue 2177273002: Make FastNewFunctionContextStub take slots parameter (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebased Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/code-stubs.h ('k') | src/compiler/js-generic-lowering.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/code-stubs.cc
diff --git a/src/code-stubs.cc b/src/code-stubs.cc
index 9a8e4f91912d24c35ac5795055ac24a6335575e6..71b1b8f6d7f4a9d52f4f2e6f0488c1ce1c587a15 100644
--- a/src/code-stubs.cc
+++ b/src/code-stubs.cc
@@ -4514,24 +4514,30 @@ void FastNewClosureStub::GenerateAssembly(CodeStubAssembler* assembler) const {
void FastNewFunctionContextStub::GenerateAssembly(
CodeStubAssembler* assembler) const {
+ typedef CodeStubAssembler::Label Label;
typedef compiler::Node Node;
+ typedef CodeStubAssembler::Variable Variable;
- int length = slots() + Context::MIN_CONTEXT_SLOTS;
- int size = length * kPointerSize + FixedArray::kHeaderSize;
-
- // Get the function
Node* function = assembler->Parameter(Descriptor::kFunction);
+ Node* slots = assembler->Parameter(FastNewFunctionContextDescriptor::kSlots);
Node* context = assembler->Parameter(Descriptor::kContext);
+ Node* min_context_slots =
+ assembler->Int32Constant(Context::MIN_CONTEXT_SLOTS);
+ Node* length = assembler->Int32Add(slots, min_context_slots);
+ Node* size = assembler->Int32Add(
+ assembler->Word32Shl(length, assembler->Int32Constant(kPointerSizeLog2)),
+ assembler->Int32Constant(FixedArray::kHeaderSize));
+
// Create a new closure from the given function info in new space
Node* function_context = assembler->Allocate(size);
assembler->StoreMapNoWriteBarrier(
function_context,
assembler->HeapConstant(isolate()->factory()->function_context_map()));
- assembler->StoreObjectFieldNoWriteBarrier(
- function_context, Context::kLengthOffset,
- assembler->SmiConstant(Smi::FromInt(length)));
+ assembler->StoreObjectFieldNoWriteBarrier(function_context,
+ Context::kLengthOffset,
+ assembler->SmiFromWord32(length));
// Set up the fixed slots.
assembler->StoreFixedArrayElement(
@@ -4553,11 +4559,24 @@ void FastNewFunctionContextStub::GenerateAssembly(
// Initialize the rest of the slots to undefined.
Node* undefined = assembler->UndefinedConstant();
- for (int i = Context::MIN_CONTEXT_SLOTS; i < length; ++i) {
- assembler->StoreFixedArrayElement(function_context,
- assembler->Int32Constant(i), undefined,
+ Variable var_slot_index(assembler, MachineRepresentation::kWord32);
+ var_slot_index.Bind(min_context_slots);
+ Label loop(assembler, &var_slot_index), after_loop(assembler);
+ assembler->Goto(&loop);
+
+ assembler->Bind(&loop);
+ {
+ Node* slot_index = var_slot_index.value();
+ // check for < length later, there are at least Context::MIN_CONTEXT_SLOTS
+ assembler->StoreFixedArrayElement(function_context, slot_index, undefined,
SKIP_WRITE_BARRIER);
+ Node* one = assembler->Int32Constant(1);
+ Node* next_index = assembler->Int32Add(slot_index, one);
+ var_slot_index.Bind(next_index);
+ assembler->Branch(assembler->Int32LessThan(next_index, length), &loop,
+ &after_loop);
}
+ assembler->Bind(&after_loop);
assembler->Return(function_context);
}
« no previous file with comments | « src/code-stubs.h ('k') | src/compiler/js-generic-lowering.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698