| // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #include "vm/method_recognizer.h" |
| |
| #include "vm/object.h" |
| #include "vm/symbols.h" |
| |
| namespace dart { |
| |
| MethodRecognizer::Kind MethodRecognizer::RecognizeKind( |
| const Function& function) { |
| return function.recognized_kind(); |
| } |
| |
| |
| bool MethodRecognizer::AlwaysInline(const Function& function) { |
| return function.always_inline(); |
| } |
| |
| |
| bool MethodRecognizer::PolymorphicTarget(const Function& function) { |
| return function.is_polymorphic_target(); |
| } |
| |
| |
| #define KIND_TO_STRING(class_name, function_name, enum_name, fp) \ |
| #enum_name, |
| static const char* recognized_list_method_name[] = { |
| "Unknown", |
| RECOGNIZED_LIST(KIND_TO_STRING) |
| }; |
| #undef KIND_TO_STRING |
| |
| const char* MethodRecognizer::KindToCString(Kind kind) { |
| if (kind > kUnknown && kind < kNumRecognizedMethods) |
| return recognized_list_method_name[kind]; |
| return "?"; |
| } |
| |
| |
| #if defined(DART_NO_SNAPSHOT) |
| void MethodRecognizer::InitializeState() { |
| GrowableArray<Library*> libs(3); |
| libs.Add(&Library::ZoneHandle(Library::CoreLibrary())); |
| libs.Add(&Library::ZoneHandle(Library::CollectionLibrary())); |
| libs.Add(&Library::ZoneHandle(Library::MathLibrary())); |
| libs.Add(&Library::ZoneHandle(Library::TypedDataLibrary())); |
| libs.Add(&Library::ZoneHandle(Library::InternalLibrary())); |
| libs.Add(&Library::ZoneHandle(Library::DeveloperLibrary())); |
| Function& func = Function::Handle(); |
| |
| #define SET_RECOGNIZED_KIND(class_name, function_name, enum_name, fp) \ |
| func = Library::GetFunction(libs, #class_name, #function_name); \ |
| if (func.IsNull()) { \ |
| OS::PrintErr("Missing %s::%s\n", #class_name, #function_name); \ |
| UNREACHABLE(); \ |
| } \ |
| CHECK_FINGERPRINT3(func, class_name, function_name, enum_name, fp); \ |
| func.set_recognized_kind(k##enum_name); |
| |
| RECOGNIZED_LIST(SET_RECOGNIZED_KIND); |
| |
| #define SET_FUNCTION_BIT(class_name, function_name, dest, fp, setter, value) \ |
| func = Library::GetFunction(libs, #class_name, #function_name); \ |
| if (func.IsNull()) { \ |
| OS::PrintErr("Missing %s::%s\n", #class_name, #function_name); \ |
| UNREACHABLE(); \ |
| } \ |
| CHECK_FINGERPRINT3(func, class_name, function_name, dest, fp); \ |
| func.setter(value); |
| |
| #define SET_IS_ALWAYS_INLINE(class_name, function_name, dest, fp) \ |
| SET_FUNCTION_BIT(class_name, function_name, dest, fp, set_always_inline, true) |
| |
| #define SET_IS_NEVER_INLINE(class_name, function_name, dest, fp) \ |
| SET_FUNCTION_BIT(class_name, function_name, dest, fp, set_is_inlinable, false) |
| |
| #define SET_IS_POLYMORPHIC_TARGET(class_name, function_name, dest, fp) \ |
| SET_FUNCTION_BIT(class_name, function_name, dest, fp, \ |
| set_is_polymorphic_target, true) |
| |
| INLINE_WHITE_LIST(SET_IS_ALWAYS_INLINE); |
| INLINE_BLACK_LIST(SET_IS_NEVER_INLINE); |
| POLYMORPHIC_TARGET_LIST(SET_IS_POLYMORPHIC_TARGET); |
| |
| #undef SET_RECOGNIZED_KIND |
| #undef SET_IS_ALWAYS_INLINE |
| #undef SET_IS_POLYMORPHIC_TARGET |
| #undef SET_FUNCTION_BIT |
| } |
| #endif // defined(DART_NO_SNAPSHOT). |
| |
| } // namespace dart |