Reviewers: Kevin Millikin,
Description:
Use a separate marker value to allocate the arguments object on
deoptimzation.
Before we used the hole value for this purpose, but this does not work once
we
start using the hole value for other purposes in the optimizing compiler.
Please review this at http://codereview.chromium.org/6116001/
SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/
Affected files:
M src/accessors.cc
M src/deoptimizer.cc
M src/heap.h
M src/heap.cc
M src/runtime.cc
Index: src/accessors.cc
===================================================================
--- src/accessors.cc (revision 6194)
+++ src/accessors.cc (working copy)
@@ -775,7 +775,7 @@
if (index >= 0) {
Handle<Object> arguments =
Handle<Object>(frame->GetExpression(index));
- if (!arguments->IsTheHole()) return *arguments;
+ if (*arguments != Heap::arguments_marker()) return *arguments;
}
// If there isn't an arguments variable in the stack, we need to
Index: src/deoptimizer.cc
===================================================================
--- src/deoptimizer.cc (revision 6194)
+++ src/deoptimizer.cc (working copy)
@@ -618,17 +618,17 @@
}
case Translation::ARGUMENTS_OBJECT: {
- // Use the hole value as a sentinel and fill in the arguments object
- // after the deoptimized frame is built.
+ // Use the arguments marker value as a sentinel and fill in the
arguments
+ // object after the deoptimized frame is built.
ASSERT(frame_index == 0); // Only supported for first frame.
if (FLAG_trace_deopt) {
PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- ",
output_[frame_index]->GetTop() + output_offset,
output_offset);
- Heap::the_hole_value()->ShortPrint();
+ Heap::arguments_marker()->ShortPrint();
PrintF(" ; arguments object\n");
}
- intptr_t value = reinterpret_cast<intptr_t>(Heap::the_hole_value());
+ intptr_t value =
reinterpret_cast<intptr_t>(Heap::arguments_marker());
output_[frame_index]->SetFrameSlot(output_offset, value);
return;
}
Index: src/heap.cc
===================================================================
--- src/heap.cc (revision 6194)
+++ src/heap.cc (working copy)
@@ -2011,6 +2011,11 @@
}
set_the_hole_value(obj);
+ { MaybeObject* maybe_obj = AllocateFixedArray(1);
+ if (!maybe_obj->ToObject(&obj)) return false;
+ }
+ set_arguments_marker(obj);
+
{ MaybeObject* maybe_obj =
CreateOddball("no_interceptor_result_sentinel", Smi::FromInt(-2));
if (!maybe_obj->ToObject(&obj)) return false;
Index: src/heap.h
===================================================================
--- src/heap.h (revision 6194)
+++ src/heap.h (working copy)
@@ -116,6 +116,7 @@
V(Script, empty_script,
EmptyScript) \
V(Smi, real_stack_limit,
RealStackLimit) \
V(StringDictionary, intrinsic_function_names,
IntrinsicFunctionNames) \
+ V(Object, arguments_marker, ArgumentsMarker)
#if V8_TARGET_ARCH_ARM && !V8_INTERPRETED_REGEXP
#define
STRONG_ROOT_LIST(V) \
Index: src/runtime.cc
===================================================================
--- src/runtime.cc (revision 6194)
+++ src/runtime.cc (working copy)
@@ -6742,7 +6742,7 @@
Handle<JSFunction> function(JSFunction::cast(frame->function()));
Handle<Object> arguments;
for (int i = frame->ComputeExpressionsCount() - 1; i >= 0; --i) {
- if (frame->GetExpression(i) == Heap::the_hole_value()) {
+ if (frame->GetExpression(i) == Heap::arguments_marker()) {
if (arguments.is_null()) {
// FunctionGetArguments can't throw an exception, so cast away the
// doubt with an assert.
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev