| Index: vm/code_generator.cc
|
| ===================================================================
|
| --- vm/code_generator.cc (revision 6972)
|
| +++ vm/code_generator.cc (working copy)
|
| @@ -33,23 +33,6 @@
|
| DECLARE_FLAG(int, deoptimization_counter_threshold);
|
|
|
|
|
| -static StackFrame* GetTopDartFrame(
|
| - StackFrameIterator* iterator, bool has_stub_frame) {
|
| - // When runtime calls are made from dart code we assume that we will
|
| - // always have an exit frame and an optional stub frame before we hit
|
| - // the first dart frame.
|
| - StackFrame* exit_frame = iterator->NextFrame();
|
| - ASSERT(exit_frame != NULL && exit_frame->IsExitFrame());
|
| - if (has_stub_frame) {
|
| - StackFrame* stub_frame = iterator->NextFrame();
|
| - ASSERT(stub_frame != NULL && stub_frame->IsStubFrame());
|
| - }
|
| - StackFrame* caller_frame = iterator->NextFrame();
|
| - ASSERT(caller_frame != NULL && caller_frame->IsDartFrame());
|
| - return caller_frame;
|
| -}
|
| -
|
| -
|
| bool CodeGenerator::CanOptimize() {
|
| return
|
| !FLAG_report_usage_count &&
|
| @@ -360,8 +343,8 @@
|
| String::Handle(instantiated_type.Name()).ToCString(),
|
| String::Handle(type.Name()).ToCString());
|
| }
|
| - StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
|
| - StackFrame* caller_frame = GetTopDartFrame(&iterator, false);
|
| + DartFrameIterator iterator;
|
| + StackFrame* caller_frame = iterator.NextFrame();
|
| const Function& function = Function::Handle(
|
| caller_frame->LookupDartFunction());
|
| OS::Print(" -> Function %s\n", function.ToFullyQualifiedCString());
|
| @@ -378,8 +361,8 @@
|
| // Update cache: add class of instance and result.
|
| if (type.IsInstantiated() &&
|
| !Class::Handle(type.type_class()).HasTypeArguments()) {
|
| - StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
|
| - StackFrame* caller_frame = GetTopDartFrame(&iterator, false);
|
| + DartFrameIterator iterator;
|
| + StackFrame* caller_frame = iterator.NextFrame();
|
| const Code& code = Code::Handle(caller_frame->LookupDartCode());
|
| ASSERT(!code.IsNull());
|
| uword loc = code.GetTypeTestAtNodeId(node_id);
|
| @@ -471,8 +454,8 @@
|
| dst_name.ToCString(),
|
| String::Handle(dst_type.Name()).ToCString());
|
| }
|
| - StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
|
| - StackFrame* caller_frame = GetTopDartFrame(&iterator, false);
|
| + DartFrameIterator iterator;
|
| + StackFrame* caller_frame = iterator.NextFrame();
|
| const Function& function = Function::Handle(
|
| caller_frame->LookupDartFunction());
|
| OS::Print(" -> Function %s\n", function.ToFullyQualifiedCString());
|
| @@ -500,8 +483,8 @@
|
| // Update cache: add class of instance and result.
|
| if (dst_type.IsInstantiated() &&
|
| !Class::Handle(dst_type.type_class()).HasTypeArguments()) {
|
| - StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
|
| - StackFrame* caller_frame = GetTopDartFrame(&iterator, false);
|
| + DartFrameIterator iterator;
|
| + StackFrame* caller_frame = iterator.NextFrame();
|
| const Code& code = Code::Handle(caller_frame->LookupDartCode());
|
| ASSERT(!code.IsNull());
|
| uword loc = code.GetTypeTestAtNodeId(node_id);
|
| @@ -660,8 +643,8 @@
|
| // This function is called after successful resolving and compilation of
|
| // the target method.
|
| ASSERT(arguments.Count() == kPatchStaticCallRuntimeEntry.argument_count());
|
| - StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
|
| - StackFrame* caller_frame = GetTopDartFrame(&iterator, true);
|
| + DartFrameIterator iterator;
|
| + StackFrame* caller_frame = iterator.NextFrame();
|
| uword target = 0;
|
| Function& target_function = Function::Handle();
|
| CodePatcher::GetStaticCallAt(caller_frame->pc(), &target_function, &target);
|
| @@ -688,8 +671,8 @@
|
| int num_named_arguments = -1;
|
| uword target = 0;
|
| String& function_name = String::Handle();
|
| - StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
|
| - StackFrame* caller_frame = GetTopDartFrame(&iterator, true);
|
| + DartFrameIterator iterator;
|
| + StackFrame* caller_frame = iterator.NextFrame();
|
| CodePatcher::GetInstanceCallAt(caller_frame->pc(),
|
| &function_name,
|
| &num_arguments,
|
| @@ -827,8 +810,8 @@
|
| }
|
| return target_function.raw();
|
| }
|
| - StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
|
| - StackFrame* caller_frame = GetTopDartFrame(&iterator, true);
|
| + DartFrameIterator iterator;
|
| + StackFrame* caller_frame = iterator.NextFrame();
|
| ICData& ic_data = ICData::Handle(
|
| CodePatcher::GetInstanceCallIcDataAt(caller_frame->pc()));
|
| #if defined(DEBUG)
|
| @@ -1262,11 +1245,12 @@
|
|
|
| StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
|
| StackFrame* frame = iterator.NextFrame();
|
| - while (frame != NULL && !frame->IsDartFrame() && !frame->IsEntryFrame()) {
|
| + while (frame != NULL && (frame->IsStubFrame() || frame->IsExitFrame())) {
|
| frame = iterator.NextFrame();
|
| }
|
| ASSERT(frame != NULL);
|
| - if (frame->IsDartFrame()) {
|
| + if (!frame->IsEntryFrame()) {
|
| + ASSERT(frame->IsDartFrame());
|
| uword target = 0;
|
| Function& target_function = Function::Handle();
|
| CodePatcher::GetStaticCallAt(frame->pc(), &target_function, &target);
|
| @@ -1294,8 +1278,8 @@
|
| DEFINE_RUNTIME_ENTRY(Deoptimize, 1) {
|
| ASSERT(arguments.Count() == kDeoptimizeRuntimeEntry.argument_count());
|
| const Smi& deoptimization_reason_id = Smi::CheckedHandle(arguments.At(0));
|
| - StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
|
| - StackFrame* caller_frame = GetTopDartFrame(&iterator, true);
|
| + DartFrameIterator iterator;
|
| + StackFrame* caller_frame = iterator.NextFrame();
|
| const Code& optimized_code = Code::Handle(caller_frame->LookupDartCode());
|
| const Function& function = Function::Handle(optimized_code.function());
|
| ASSERT(!function.IsNull());
|
|
|