| Index: runtime/vm/object.cc
|
| ===================================================================
|
| --- runtime/vm/object.cc (revision 11621)
|
| +++ runtime/vm/object.cc (working copy)
|
| @@ -3909,7 +3909,8 @@
|
|
|
| bool Function::is_optimizable() const {
|
| return OptimizableBit::decode(raw_ptr()->kind_tag_) &&
|
| - (script() != Script::null());
|
| + (script() != Script::null()) &&
|
| + !is_native();
|
| }
|
|
|
|
|
| @@ -6654,13 +6655,14 @@
|
|
|
| const char* PcDescriptors::KindAsStr(intptr_t index) const {
|
| switch (DescriptorKind(index)) {
|
| - case PcDescriptors::kDeopt: return "deopt ";
|
| - case PcDescriptors::kDeoptIndex: return "deopt-ix";
|
| - case PcDescriptors::kPatchCode: return "patch ";
|
| - case PcDescriptors::kIcCall: return "ic-call ";
|
| - case PcDescriptors::kFuncCall: return "fn-call ";
|
| - case PcDescriptors::kReturn: return "return ";
|
| - case PcDescriptors::kOther: return "other ";
|
| + case PcDescriptors::kDeoptBefore: return "deopt-before ";
|
| + case PcDescriptors::kDeoptAfter: return "deopt-after ";
|
| + case PcDescriptors::kDeoptIndex: return "deopt-ix ";
|
| + case PcDescriptors::kPatchCode: return "patch ";
|
| + case PcDescriptors::kIcCall: return "ic-call ";
|
| + case PcDescriptors::kFuncCall: return "fn-call ";
|
| + case PcDescriptors::kReturn: return "return ";
|
| + case PcDescriptors::kOther: return "other ";
|
| }
|
| UNREACHABLE();
|
| return "";
|
| @@ -6742,7 +6744,7 @@
|
| // 'deopt_id' is set for kDeopt and kIcCall and must be unique for one kind.
|
| intptr_t deopt_id = Isolate::kNoDeoptId;
|
| if (check_ids) {
|
| - if ((DescriptorKind(i) == PcDescriptors::kDeopt) ||
|
| + if ((DescriptorKind(i) == PcDescriptors::kDeoptBefore) ||
|
| (DescriptorKind(i) == PcDescriptors::kIcCall)) {
|
| deopt_id = DeoptId(i);
|
| }
|
| @@ -7289,18 +7291,32 @@
|
| }
|
|
|
|
|
| -uword Code::GetDeoptPcAtDeoptId(intptr_t deopt_id) const {
|
| +uword Code::GetPcForDeoptId(intptr_t deopt_id, PcDescriptors::Kind kind) const {
|
| const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
|
| for (intptr_t i = 0; i < descriptors.Length(); i++) {
|
| if ((descriptors.DeoptId(i) == deopt_id) &&
|
| - (descriptors.DescriptorKind(i) == PcDescriptors::kDeopt)) {
|
| - return descriptors.PC(i);
|
| + (descriptors.DescriptorKind(i) == kind)) {
|
| + uword pc = descriptors.PC(i);
|
| + ASSERT((EntryPoint() < pc) && (pc < (EntryPoint() + Size())));
|
| + return pc;
|
| }
|
| }
|
| return 0;
|
| }
|
|
|
|
|
| +uword Code::GetDeoptBeforePcAtDeoptId(intptr_t deopt_id) const {
|
| + ASSERT(!is_optimized());
|
| + return GetPcForDeoptId(deopt_id, PcDescriptors::kDeoptBefore);
|
| +}
|
| +
|
| +
|
| +uword Code::GetDeoptAfterPcAtDeoptId(intptr_t deopt_id) const {
|
| + ASSERT(!is_optimized());
|
| + return GetPcForDeoptId(deopt_id, PcDescriptors::kDeoptAfter);
|
| +}
|
| +
|
| +
|
| const char* Code::ToCString() const {
|
| const char* kFormat = "Code entry:0x%d";
|
| intptr_t len = OS::SNPrint(NULL, 0, kFormat, EntryPoint()) + 1;
|
|
|