| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/parser.h" | 5 #include "vm/parser.h" |
| 6 #include "vm/flags.h" | 6 #include "vm/flags.h" |
| 7 | 7 |
| 8 #ifndef DART_PRECOMPILED_RUNTIME | 8 #ifndef DART_PRECOMPILED_RUNTIME |
| 9 | 9 |
| 10 #include "lib/invocation_mirror.h" | 10 #include "lib/invocation_mirror.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 DEFINE_FLAG(bool, trace_parser, false, "Trace parser operations."); | 44 DEFINE_FLAG(bool, trace_parser, false, "Trace parser operations."); |
| 45 DEFINE_FLAG(bool, warn_mixin_typedef, true, "Warning on legacy mixin typedef."); | 45 DEFINE_FLAG(bool, warn_mixin_typedef, true, "Warning on legacy mixin typedef."); |
| 46 DEFINE_FLAG(bool, conditional_directives, false, | 46 DEFINE_FLAG(bool, conditional_directives, false, |
| 47 "Enable conditional directives"); | 47 "Enable conditional directives"); |
| 48 DEFINE_FLAG(bool, warn_super, false, | 48 DEFINE_FLAG(bool, warn_super, false, |
| 49 "Warning if super initializer not last in initializer list."); | 49 "Warning if super initializer not last in initializer list."); |
| 50 DEFINE_FLAG(bool, await_is_keyword, false, | 50 DEFINE_FLAG(bool, await_is_keyword, false, |
| 51 "await and yield are treated as proper keywords in synchronous code."); | 51 "await and yield are treated as proper keywords in synchronous code."); |
| 52 | 52 |
| 53 DECLARE_FLAG(bool, profile_vm); | 53 DECLARE_FLAG(bool, profile_vm); |
| 54 DECLARE_FLAG(bool, trace_service); |
| 54 | 55 |
| 55 // Quick access to the current thread, isolate and zone. | 56 // Quick access to the current thread, isolate and zone. |
| 56 #define T (thread()) | 57 #define T (thread()) |
| 57 #define I (isolate()) | 58 #define I (isolate()) |
| 58 #define Z (zone()) | 59 #define Z (zone()) |
| 59 | 60 |
| 60 // Quick synthetic token position. | 61 // Quick synthetic token position. |
| 61 #define ST(token_pos) ((token_pos).ToSynthetic()) | 62 #define ST(token_pos) ((token_pos).ToSynthetic()) |
| 62 | 63 |
| 63 #if defined(DEBUG) | 64 #if defined(DEBUG) |
| (...skipping 2885 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2949 } | 2950 } |
| 2950 CheckFieldsInitialized(current_class()); | 2951 CheckFieldsInitialized(current_class()); |
| 2951 | 2952 |
| 2952 // Empty constructor body. | 2953 // Empty constructor body. |
| 2953 current_block_->statements->Add(new ReturnNode(ST(ctor_pos))); | 2954 current_block_->statements->Add(new ReturnNode(ST(ctor_pos))); |
| 2954 SequenceNode* statements = CloseBlock(); | 2955 SequenceNode* statements = CloseBlock(); |
| 2955 return statements; | 2956 return statements; |
| 2956 } | 2957 } |
| 2957 | 2958 |
| 2958 | 2959 |
| 2960 // Returns a zone allocated string. |
| 2961 static char* DumpPendingFunctions( |
| 2962 Zone* zone, |
| 2963 const GrowableObjectArray& pending_functions) { |
| 2964 ASSERT(zone != NULL); |
| 2965 char* result = OS::SCreate(zone, "Pending Functions:\n"); |
| 2966 for (intptr_t i = 0; i < pending_functions.Length(); i++) { |
| 2967 const Function& func = |
| 2968 Function::Handle(zone, Function::RawCast(pending_functions.At(i))); |
| 2969 const String& fname = String::Handle(zone, func.UserVisibleName()); |
| 2970 result = OS::SCreate(zone, "%s%" Pd ": %s\n", result, i, fname.ToCString()); |
| 2971 } |
| 2972 return result; |
| 2973 } |
| 2974 |
| 2975 |
| 2959 void Parser::CheckRecursiveInvocation() { | 2976 void Parser::CheckRecursiveInvocation() { |
| 2960 const GrowableObjectArray& pending_functions = | 2977 const GrowableObjectArray& pending_functions = |
| 2961 GrowableObjectArray::Handle(Z, T->pending_functions()); | 2978 GrowableObjectArray::Handle(Z, T->pending_functions()); |
| 2962 ASSERT(!pending_functions.IsNull()); | 2979 ASSERT(!pending_functions.IsNull()); |
| 2963 for (int i = 0; i < pending_functions.Length(); i++) { | 2980 for (int i = 0; i < pending_functions.Length(); i++) { |
| 2964 if (pending_functions.At(i) == current_function().raw()) { | 2981 if (pending_functions.At(i) == current_function().raw()) { |
| 2965 const String& fname = | 2982 const String& fname = |
| 2966 String::Handle(Z, current_function().UserVisibleName()); | 2983 String::Handle(Z, current_function().UserVisibleName()); |
| 2967 ReportError("circular dependency for function %s", fname.ToCString()); | 2984 if (FLAG_trace_service) { |
| 2985 const char* pending_function_dump = |
| 2986 DumpPendingFunctions(Z, pending_functions); |
| 2987 ASSERT(pending_function_dump != NULL); |
| 2988 ReportError("circular dependency for function %s\n%s", |
| 2989 fname.ToCString(), |
| 2990 pending_function_dump); |
| 2991 } else { |
| 2992 ReportError("circular dependency for function %s", fname.ToCString()); |
| 2993 } |
| 2968 } | 2994 } |
| 2969 } | 2995 } |
| 2970 ASSERT(!unregister_pending_function_); | 2996 ASSERT(!unregister_pending_function_); |
| 2971 pending_functions.Add(current_function(), Heap::kOld); | 2997 pending_functions.Add(current_function(), Heap::kOld); |
| 2972 unregister_pending_function_ = true; | 2998 unregister_pending_function_ = true; |
| 2973 } | 2999 } |
| 2974 | 3000 |
| 2975 | 3001 |
| 2976 // Parser is at the opening parenthesis of the formal parameter declaration | 3002 // Parser is at the opening parenthesis of the formal parameter declaration |
| 2977 // of function. Parse the formal parameters, initializers and code. | 3003 // of function. Parse the formal parameters, initializers and code. |
| (...skipping 11436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14414 const ArgumentListNode& function_args, | 14440 const ArgumentListNode& function_args, |
| 14415 const LocalVariable* temp_for_last_arg, | 14441 const LocalVariable* temp_for_last_arg, |
| 14416 bool is_super_invocation) { | 14442 bool is_super_invocation) { |
| 14417 UNREACHABLE(); | 14443 UNREACHABLE(); |
| 14418 return NULL; | 14444 return NULL; |
| 14419 } | 14445 } |
| 14420 | 14446 |
| 14421 } // namespace dart | 14447 } // namespace dart |
| 14422 | 14448 |
| 14423 #endif // DART_PRECOMPILED_RUNTIME | 14449 #endif // DART_PRECOMPILED_RUNTIME |
| OLD | NEW |