| Index: runtime/vm/parser.cc
|
| diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
|
| index b4e3ac90af693b1137aa2faa1fd1b18be23d2a80..5e2c911041b0448e20fc5ed08e8104372fea7998 100644
|
| --- a/runtime/vm/parser.cc
|
| +++ b/runtime/vm/parser.cc
|
| @@ -51,6 +51,7 @@ DEFINE_FLAG(bool, await_is_keyword, false,
|
| "await and yield are treated as proper keywords in synchronous code.");
|
|
|
| DECLARE_FLAG(bool, profile_vm);
|
| +DECLARE_FLAG(bool, trace_service);
|
|
|
| // Quick access to the current thread, isolate and zone.
|
| #define T (thread())
|
| @@ -2956,6 +2957,22 @@ SequenceNode* Parser::MakeImplicitConstructor(const Function& func) {
|
| }
|
|
|
|
|
| +// Returns a zone allocated string.
|
| +static char* DumpPendingFunctions(
|
| + Zone* zone,
|
| + const GrowableObjectArray& pending_functions) {
|
| + ASSERT(zone != NULL);
|
| + char* result = OS::SCreate(zone, "Pending Functions:\n");
|
| + for (intptr_t i = 0; i < pending_functions.Length(); i++) {
|
| + const Function& func =
|
| + Function::Handle(zone, Function::RawCast(pending_functions.At(i)));
|
| + const String& fname = String::Handle(zone, func.UserVisibleName());
|
| + result = OS::SCreate(zone, "%s%" Pd ": %s\n", result, i, fname.ToCString());
|
| + }
|
| + return result;
|
| +}
|
| +
|
| +
|
| void Parser::CheckRecursiveInvocation() {
|
| const GrowableObjectArray& pending_functions =
|
| GrowableObjectArray::Handle(Z, T->pending_functions());
|
| @@ -2964,7 +2981,16 @@ void Parser::CheckRecursiveInvocation() {
|
| if (pending_functions.At(i) == current_function().raw()) {
|
| const String& fname =
|
| String::Handle(Z, current_function().UserVisibleName());
|
| - ReportError("circular dependency for function %s", fname.ToCString());
|
| + if (FLAG_trace_service) {
|
| + const char* pending_function_dump =
|
| + DumpPendingFunctions(Z, pending_functions);
|
| + ASSERT(pending_function_dump != NULL);
|
| + ReportError("circular dependency for function %s\n%s",
|
| + fname.ToCString(),
|
| + pending_function_dump);
|
| + } else {
|
| + ReportError("circular dependency for function %s", fname.ToCString());
|
| + }
|
| }
|
| }
|
| ASSERT(!unregister_pending_function_);
|
|
|