| Index: runtime/vm/deopt_instructions.cc
 | 
| diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
 | 
| index a926fdf7458427dd7a7c0510c4b130a6d45c249b..1aa11b76da285ad8748dd321e5cf62d2f6e00718 100644
 | 
| --- a/runtime/vm/deopt_instructions.cc
 | 
| +++ b/runtime/vm/deopt_instructions.cc
 | 
| @@ -143,18 +143,21 @@ DeoptContext::~DeoptContext() {
 | 
|      TimelineStream* compiler_stream = isolate->GetCompilerStream();
 | 
|      ASSERT(compiler_stream != NULL);
 | 
|      if (compiler_stream->Enabled()) {
 | 
| +      // Allocate all Dart objects needed before calling StartEvent,
 | 
| +      // which blocks safe points until Complete is called.
 | 
|        const Code& code = Code::Handle(zone(), code_);
 | 
|        const Function& function = Function::Handle(zone(), code.function());
 | 
| -      const char* function_name = function.QualifiedUserVisibleNameCString();
 | 
| +      const String& function_name =
 | 
| +          String::Handle(zone(), function.QualifiedScrubbedName());
 | 
|        const char* reason = DeoptReasonToCString(deopt_reason());
 | 
| -      int counter = function.deoptimization_counter();
 | 
| +      const int counter = function.deoptimization_counter();
 | 
|        TimelineEvent* timeline_event = compiler_stream->StartEvent();
 | 
|        if (timeline_event != NULL) {
 | 
|          timeline_event->Duration("Deoptimize",
 | 
|                                   deopt_start_micros_,
 | 
|                                   OS::GetCurrentMonotonicMicros());
 | 
|          timeline_event->SetNumArguments(3);
 | 
| -        timeline_event->CopyArgument(0, "function", function_name);
 | 
| +        timeline_event->CopyArgument(0, "function", function_name.ToCString());
 | 
|          timeline_event->CopyArgument(1, "reason", reason);
 | 
|          timeline_event->FormatArgument(2, "deoptimizationCount", "%d", counter);
 | 
|          timeline_event->Complete();
 | 
| 
 |