Clean up JSConstructStub
- fix truthfulness of comments - use InitializeFieldsWithFiller more consistently - use unsigned comparisons for pointers No change in functionality intended. Bonus: improve JavaScriptFrame::Print() for an enhanced debugging experience: - print PC of each frame - print the function's source also for optimized frames Review URL: https://codereview.chromium.org/1186823003 Cr-Commit-Position: refs/heads/master@{#29082}
This commit is contained in:
parent
25e687965f
commit
882055ff6a
@ -446,7 +446,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
||||
// initial map and properties and elements are set to empty fixed array.
|
||||
// r1: constructor function
|
||||
// r2: initial map
|
||||
// r3: object size (not including memento if create_memento)
|
||||
// r3: object size (including memento if create_memento)
|
||||
// r4: JSObject (not tagged)
|
||||
__ LoadRoot(r6, Heap::kEmptyFixedArrayRootIndex);
|
||||
__ mov(r5, r4);
|
||||
@ -520,7 +520,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
||||
__ add(r4, r4, Operand(kHeapObjectTag));
|
||||
|
||||
// Check if a non-empty properties array is needed. Continue with
|
||||
// allocated object if not fall through to runtime call if it is.
|
||||
// allocated object if not; allocate and initialize a FixedArray if yes.
|
||||
// r1: constructor function
|
||||
// r4: JSObject
|
||||
// r5: start of next object (not tagged)
|
||||
@ -575,15 +575,8 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
||||
// r5: FixedArray (not tagged)
|
||||
__ add(r6, r2, Operand(r3, LSL, kPointerSizeLog2)); // End of object.
|
||||
DCHECK_EQ(2 * kPointerSize, FixedArray::kHeaderSize);
|
||||
{ Label loop, entry;
|
||||
__ LoadRoot(r0, Heap::kUndefinedValueRootIndex);
|
||||
__ b(&entry);
|
||||
__ bind(&loop);
|
||||
__ str(r0, MemOperand(r2, kPointerSize, PostIndex));
|
||||
__ bind(&entry);
|
||||
__ cmp(r2, r6);
|
||||
__ b(lt, &loop);
|
||||
}
|
||||
__ LoadRoot(r0, Heap::kUndefinedValueRootIndex);
|
||||
__ InitializeFieldsWithFiller(r2, r6, r0);
|
||||
|
||||
// Store the initialized FixedArray into the properties field of
|
||||
// the JSObject
|
||||
|
@ -3174,7 +3174,7 @@ void MacroAssembler::InitializeFieldsWithFiller(Register start_offset,
|
||||
str(filler, MemOperand(start_offset, kPointerSize, PostIndex));
|
||||
bind(&entry);
|
||||
cmp(start_offset, end_offset);
|
||||
b(lt, &loop);
|
||||
b(lo, &loop);
|
||||
}
|
||||
|
||||
|
||||
@ -3402,7 +3402,7 @@ void MacroAssembler::CallCFunctionHelper(Register function,
|
||||
if (ActivationFrameAlignment() > kPointerSize) {
|
||||
ldr(sp, MemOperand(sp, stack_passed_arguments * kPointerSize));
|
||||
} else {
|
||||
add(sp, sp, Operand(stack_passed_arguments * sizeof(kPointerSize)));
|
||||
add(sp, sp, Operand(stack_passed_arguments * kPointerSize));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -522,7 +522,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
||||
__ Add(new_obj, new_obj, kHeapObjectTag);
|
||||
|
||||
// Check if a non-empty properties array is needed. Continue with
|
||||
// allocated object if not, or fall through to runtime call if it is.
|
||||
// allocated object if not; allocate and initialize a FixedArray if yes.
|
||||
Register element_count = x3;
|
||||
__ Ldrb(element_count,
|
||||
FieldMemOperand(init_map, Map::kUnusedPropertyFieldsOffset));
|
||||
|
@ -1120,6 +1120,24 @@ void StackFrame::PrintIndex(StringStream* accumulator,
|
||||
}
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
|
||||
void PrintFunctionSource(StringStream* accumulator, SharedFunctionInfo* shared,
|
||||
Code* code) {
|
||||
if (FLAG_max_stack_trace_source_length != 0 && code != NULL) {
|
||||
std::ostringstream os;
|
||||
os << "--------- s o u r c e c o d e ---------\n"
|
||||
<< SourceCodeOf(shared, FLAG_max_stack_trace_source_length)
|
||||
<< "\n-----------------------------------------\n";
|
||||
accumulator->Add(os.str().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace
|
||||
|
||||
|
||||
void JavaScriptFrame::Print(StringStream* accumulator,
|
||||
PrintMode mode,
|
||||
int index) const {
|
||||
@ -1157,7 +1175,7 @@ void JavaScriptFrame::Print(StringStream* accumulator,
|
||||
accumulator->Add(":~%d", line);
|
||||
}
|
||||
|
||||
accumulator->Add("] ");
|
||||
accumulator->Add("] [pc=%p] ", pc);
|
||||
}
|
||||
|
||||
accumulator->Add("(this=%o", receiver);
|
||||
@ -1182,7 +1200,9 @@ void JavaScriptFrame::Print(StringStream* accumulator,
|
||||
return;
|
||||
}
|
||||
if (is_optimized()) {
|
||||
accumulator->Add(" {\n// optimized frame\n}\n");
|
||||
accumulator->Add(" {\n// optimized frame\n");
|
||||
PrintFunctionSource(accumulator, shared, code);
|
||||
accumulator->Add("}\n");
|
||||
return;
|
||||
}
|
||||
accumulator->Add(" {\n");
|
||||
@ -1249,15 +1269,7 @@ void JavaScriptFrame::Print(StringStream* accumulator,
|
||||
accumulator->Add(" [%02d] : %o\n", i, GetExpression(i));
|
||||
}
|
||||
|
||||
// Print details about the function.
|
||||
if (FLAG_max_stack_trace_source_length != 0 && code != NULL) {
|
||||
std::ostringstream os;
|
||||
SharedFunctionInfo* shared = function->shared();
|
||||
os << "--------- s o u r c e c o d e ---------\n"
|
||||
<< SourceCodeOf(shared, FLAG_max_stack_trace_source_length)
|
||||
<< "\n-----------------------------------------\n";
|
||||
accumulator->Add(os.str().c_str());
|
||||
}
|
||||
PrintFunctionSource(accumulator, shared, code);
|
||||
|
||||
accumulator->Add("}\n\n");
|
||||
}
|
||||
|
@ -358,17 +358,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
||||
// ebx: JSObject
|
||||
// edi: FixedArray
|
||||
// ecx: start of next object
|
||||
{ Label loop, entry;
|
||||
__ mov(edx, factory->undefined_value());
|
||||
__ lea(eax, Operand(edi, FixedArray::kHeaderSize));
|
||||
__ jmp(&entry);
|
||||
__ bind(&loop);
|
||||
__ mov(Operand(eax, 0), edx);
|
||||
__ add(eax, Immediate(kPointerSize));
|
||||
__ bind(&entry);
|
||||
__ cmp(eax, ecx);
|
||||
__ j(below, &loop);
|
||||
}
|
||||
__ mov(edx, factory->undefined_value());
|
||||
__ lea(eax, Operand(edi, FixedArray::kHeaderSize));
|
||||
__ InitializeFieldsWithFiller(eax, ecx, edx);
|
||||
|
||||
// Store the initialized FixedArray into the properties field of
|
||||
// the JSObject
|
||||
|
@ -1751,7 +1751,7 @@ void MacroAssembler::InitializeFieldsWithFiller(Register start_offset,
|
||||
add(start_offset, Immediate(kPointerSize));
|
||||
bind(&entry);
|
||||
cmp(start_offset, end_offset);
|
||||
j(less, &loop);
|
||||
j(below, &loop);
|
||||
}
|
||||
|
||||
|
||||
|
@ -452,7 +452,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
||||
// initial map and properties and elements are set to empty fixed array.
|
||||
// a1: constructor function
|
||||
// a2: initial map
|
||||
// a3: object size (not including memento if create_memento)
|
||||
// a3: object size (including memento if create_memento)
|
||||
// t4: JSObject (not tagged)
|
||||
__ LoadRoot(t6, Heap::kEmptyFixedArrayRootIndex);
|
||||
__ mov(t5, t4);
|
||||
@ -532,7 +532,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
||||
__ Addu(t4, t4, Operand(kHeapObjectTag));
|
||||
|
||||
// Check if a non-empty properties array is needed. Continue with
|
||||
// allocated object if not fall through to runtime call if it is.
|
||||
// allocated object if not; allocate and initialize a FixedArray if yes.
|
||||
// a1: constructor function
|
||||
// t4: JSObject
|
||||
// t5: start of next object (not tagged)
|
||||
@ -568,7 +568,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
||||
// a1: constructor
|
||||
// a3: number of elements in properties array (untagged)
|
||||
// t4: JSObject
|
||||
// t5: start of next object
|
||||
// t5: start of FixedArray (untagged)
|
||||
__ LoadRoot(t6, Heap::kFixedArrayMapRootIndex);
|
||||
__ mov(a2, t5);
|
||||
__ sw(t6, MemOperand(a2, JSObject::kMapOffset));
|
||||
@ -588,20 +588,13 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
||||
__ sll(t3, a3, kPointerSizeLog2);
|
||||
__ addu(t6, a2, t3); // End of object.
|
||||
DCHECK_EQ(2 * kPointerSize, FixedArray::kHeaderSize);
|
||||
{ Label loop, entry;
|
||||
if (!is_api_function || create_memento) {
|
||||
__ LoadRoot(t7, Heap::kUndefinedValueRootIndex);
|
||||
} else if (FLAG_debug_code) {
|
||||
__ LoadRoot(t2, Heap::kUndefinedValueRootIndex);
|
||||
__ Assert(eq, kUndefinedValueNotLoaded, t7, Operand(t2));
|
||||
}
|
||||
__ jmp(&entry);
|
||||
__ bind(&loop);
|
||||
__ sw(t7, MemOperand(a2));
|
||||
__ addiu(a2, a2, kPointerSize);
|
||||
__ bind(&entry);
|
||||
__ Branch(&loop, less, a2, Operand(t6));
|
||||
if (!is_api_function || create_memento) {
|
||||
__ LoadRoot(t7, Heap::kUndefinedValueRootIndex);
|
||||
} else if (FLAG_debug_code) {
|
||||
__ LoadRoot(t2, Heap::kUndefinedValueRootIndex);
|
||||
__ Assert(eq, kUndefinedValueNotLoaded, t7, Operand(t2));
|
||||
}
|
||||
__ InitializeFieldsWithFiller(a2, t6, t7);
|
||||
|
||||
// Store the initialized FixedArray into the properties field of
|
||||
// the JSObject.
|
||||
|
@ -3804,7 +3804,7 @@ void MacroAssembler::InitializeFieldsWithFiller(Register start_offset,
|
||||
sw(filler, MemOperand(start_offset));
|
||||
Addu(start_offset, start_offset, kPointerSize);
|
||||
bind(&entry);
|
||||
Branch(&loop, lt, start_offset, Operand(end_offset));
|
||||
Branch(&loop, ult, start_offset, Operand(end_offset));
|
||||
}
|
||||
|
||||
|
||||
@ -5567,7 +5567,7 @@ void MacroAssembler::CallCFunctionHelper(Register function,
|
||||
if (base::OS::ActivationFrameAlignment() > kPointerSize) {
|
||||
lw(sp, MemOperand(sp, stack_passed_arguments * kPointerSize));
|
||||
} else {
|
||||
Addu(sp, sp, Operand(stack_passed_arguments * sizeof(kPointerSize)));
|
||||
Addu(sp, sp, Operand(stack_passed_arguments * kPointerSize));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -453,7 +453,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
||||
// initial map and properties and elements are set to empty fixed array.
|
||||
// a1: constructor function
|
||||
// a2: initial map
|
||||
// a3: object size (not including memento if create_memento)
|
||||
// a3: object size (including memento if create_memento)
|
||||
// t0: JSObject (not tagged)
|
||||
__ LoadRoot(t2, Heap::kEmptyFixedArrayRootIndex);
|
||||
__ mov(t1, t0);
|
||||
@ -535,7 +535,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
||||
__ Daddu(t0, t0, Operand(kHeapObjectTag));
|
||||
|
||||
// Check if a non-empty properties array is needed. Continue with
|
||||
// allocated object if not fall through to runtime call if it is.
|
||||
// allocated object if not; allocate and initialize a FixedArray if yes.
|
||||
// a1: constructor function
|
||||
// t0: JSObject
|
||||
// t1: start of next object (not tagged)
|
||||
@ -574,7 +574,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
||||
// a1: constructor
|
||||
// a3: number of elements in properties array (untagged)
|
||||
// t0: JSObject
|
||||
// t1: start of next object
|
||||
// t1: start of FixedArray (untagged)
|
||||
__ LoadRoot(t2, Heap::kFixedArrayMapRootIndex);
|
||||
__ mov(a2, t1);
|
||||
__ sd(t2, MemOperand(a2, JSObject::kMapOffset));
|
||||
@ -595,20 +595,13 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
||||
__ dsll(a7, a3, kPointerSizeLog2);
|
||||
__ daddu(t2, a2, a7); // End of object.
|
||||
DCHECK_EQ(2 * kPointerSize, FixedArray::kHeaderSize);
|
||||
{ Label loop, entry;
|
||||
if (!is_api_function || create_memento) {
|
||||
__ LoadRoot(t3, Heap::kUndefinedValueRootIndex);
|
||||
} else if (FLAG_debug_code) {
|
||||
__ LoadRoot(a6, Heap::kUndefinedValueRootIndex);
|
||||
__ Assert(eq, kUndefinedValueNotLoaded, t3, Operand(a6));
|
||||
}
|
||||
__ jmp(&entry);
|
||||
__ bind(&loop);
|
||||
__ sd(t3, MemOperand(a2));
|
||||
__ daddiu(a2, a2, kPointerSize);
|
||||
__ bind(&entry);
|
||||
__ Branch(&loop, less, a2, Operand(t2));
|
||||
if (!is_api_function || create_memento) {
|
||||
__ LoadRoot(t3, Heap::kUndefinedValueRootIndex);
|
||||
} else if (FLAG_debug_code) {
|
||||
__ LoadRoot(a6, Heap::kUndefinedValueRootIndex);
|
||||
__ Assert(eq, kUndefinedValueNotLoaded, t3, Operand(a6));
|
||||
}
|
||||
__ InitializeFieldsWithFiller(a2, t2, t3);
|
||||
|
||||
// Store the initialized FixedArray into the properties field of
|
||||
// the JSObject.
|
||||
|
@ -3857,7 +3857,7 @@ void MacroAssembler::InitializeFieldsWithFiller(Register start_offset,
|
||||
sd(filler, MemOperand(start_offset));
|
||||
Daddu(start_offset, start_offset, kPointerSize);
|
||||
bind(&entry);
|
||||
Branch(&loop, lt, start_offset, Operand(end_offset));
|
||||
Branch(&loop, ult, start_offset, Operand(end_offset));
|
||||
}
|
||||
|
||||
|
||||
|
@ -353,17 +353,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
||||
// rdi: FixedArray
|
||||
// rax: start of next object
|
||||
// rdx: number of elements
|
||||
{ Label loop, entry;
|
||||
__ LoadRoot(rdx, Heap::kUndefinedValueRootIndex);
|
||||
__ leap(rcx, Operand(rdi, FixedArray::kHeaderSize));
|
||||
__ jmp(&entry);
|
||||
__ bind(&loop);
|
||||
__ movp(Operand(rcx, 0), rdx);
|
||||
__ addp(rcx, Immediate(kPointerSize));
|
||||
__ bind(&entry);
|
||||
__ cmpp(rcx, rax);
|
||||
__ j(below, &loop);
|
||||
}
|
||||
__ LoadRoot(rdx, Heap::kUndefinedValueRootIndex);
|
||||
__ leap(rcx, Operand(rdi, FixedArray::kHeaderSize));
|
||||
__ InitializeFieldsWithFiller(rcx, rax, rdx);
|
||||
|
||||
// Store the initialized FixedArray into the properties field of
|
||||
// the JSObject
|
||||
|
@ -4570,7 +4570,7 @@ void MacroAssembler::InitializeFieldsWithFiller(Register start_offset,
|
||||
addp(start_offset, Immediate(kPointerSize));
|
||||
bind(&entry);
|
||||
cmpp(start_offset, end_offset);
|
||||
j(less, &loop);
|
||||
j(below, &loop);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1717,7 +1717,7 @@ void MacroAssembler::InitializeFieldsWithFiller(Register start_offset,
|
||||
add(start_offset, Immediate(kPointerSize));
|
||||
bind(&entry);
|
||||
cmp(start_offset, end_offset);
|
||||
j(less, &loop);
|
||||
j(below, &loop);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user