Commit 53a5b079 authored by sgjesse@chromium.org's avatar sgjesse@chromium.org

Add inspection of function for optimized frames

R=svenpanne@chromium.org

BUG=none
TEST=test/mjsunit/debug-evaluate-locals-optimized.js,test/mjsunit/debug-evaluate-locals-optimized-doubles.js

Review URL: http://codereview.chromium.org//7227006

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8556 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 29801d4e
......@@ -1415,6 +1415,7 @@ void SlotRef::ComputeSlotMappingForArguments(JavaScriptFrame* frame,
DeoptimizedFrameInfo::DeoptimizedFrameInfo(
Deoptimizer* deoptimizer, int frame_index) {
FrameDescription* output_frame = deoptimizer->output_[frame_index];
SetFunction(output_frame->GetFunction());
expression_count_ = output_frame->GetExpressionCount(deoptimizer);
expression_stack_ = new Object*[expression_count_];
for (int i = 0; i < expression_count_; i++) {
......@@ -1428,6 +1429,7 @@ DeoptimizedFrameInfo::~DeoptimizedFrameInfo() {
}
void DeoptimizedFrameInfo::Iterate(ObjectVisitor* v) {
v->VisitPointer(reinterpret_cast<Object**>(&function_));
v->VisitPointers(expression_stack_, expression_stack_ + expression_count_);
}
......
......@@ -665,6 +665,11 @@ class DeoptimizedFrameInfo : public Malloced {
// Return the height of the expression stack.
int expression_count() { return expression_count_; }
// Get the frame function.
JSFunction* GetFunction() {
return function_;
}
// Get an expression from the expression stack.
Object* GetExpression(int index) {
ASSERT(0 <= index && index < expression_count());
......@@ -672,12 +677,18 @@ class DeoptimizedFrameInfo : public Malloced {
}
private:
// Set the frame function.
void SetFunction(JSFunction* function) {
function_ = function;
}
// Set an expression on the expression stack.
void SetExpression(int index, Object* obj) {
ASSERT(0 <= index && index < expression_count());
expression_stack_[index] = obj;
}
JSFunction* function_;
int expression_count_;
Object** expression_stack_;
......
......@@ -10165,7 +10165,13 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFrameDetails) {
details->set(kFrameDetailsFrameIdIndex, *frame_id);
// Add the function (same as in function frame).
details->set(kFrameDetailsFunctionIndex, it.frame()->function());
if (it.frame()->is_optimized()) {
// Get the function from the deoptimized frame.
details->set(kFrameDetailsFunctionIndex, deoptimized_frame->GetFunction());
} else {
// Get the function from the stack.
details->set(kFrameDetailsFunctionIndex, it.frame()->function());
}
// Add the arguments count.
details->set(kFrameDetailsArgumentCountIndex, Smi::FromInt(argument_count));
......
......@@ -51,6 +51,17 @@ function listener(event, exec_state, event_data, data) {
frame.localValue(1).value());
}
// Check the frame function.
switch (i) {
case 0: assertEquals(h, frame.func().value()); break;
case 1: assertEquals(g3, frame.func().value()); break;
case 2: assertEquals(g2, frame.func().value()); break;
case 3: assertEquals(g1, frame.func().value()); break;
case 4: assertEquals(f, frame.func().value()); break;
case 5: break;
default: assertUnreachable();
}
// When function f is optimized (2 means YES, see runtime.cc) we
// expect an optimized frame for f with g1, g2 and g3 inlined.
if (%GetOptimizationStatus(f) == 2) {
......
......@@ -49,6 +49,17 @@ function listener(event, exec_state, event_data, data) {
assertEquals(i * 2 + 2, frame.localValue(1).value());
}
// Check the frame function.
switch (i) {
case 0: assertEquals(h, frame.func().value()); break;
case 1: assertEquals(g3, frame.func().value()); break;
case 2: assertEquals(g2, frame.func().value()); break;
case 3: assertEquals(g1, frame.func().value()); break;
case 4: assertEquals(f, frame.func().value()); break;
case 5: break;
default: assertUnreachable();
}
// When function f is optimized (2 means YES, see runtime.cc) we
// expect an optimized frame for f with g1, g2 and g3 inlined.
if (%GetOptimizationStatus(f) == 2) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment