// 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. #ifndef RUNTIME_VM_COMPILER_METHOD_RECOGNIZER_H_ #define RUNTIME_VM_COMPILER_METHOD_RECOGNIZER_H_ #include "vm/allocation.h" #include "vm/compiler/recognized_methods_list.h" #include "vm/growable_array.h" #include "vm/token.h" namespace dart { // Forward declarations. class Function; class Library; class Object; class String; class Zone; // Class that recognizes the name and owner of a function and returns the // corresponding enum. See RECOGNIZED_LIST above for list of recognizable // functions. class MethodRecognizer : public AllStatic { public: enum Kind { kUnknown, #define DEFINE_ENUM_LIST(library, class, function, enum_name, fp) k##enum_name, RECOGNIZED_LIST(DEFINE_ENUM_LIST) #undef DEFINE_ENUM_LIST kNumRecognizedMethods }; static constexpr int kKindBitSize = Utils::BitLength(kNumRecognizedMethods - 1); static intptr_t NumArgsCheckedForStaticCall(const Function& function); // Try to find an annotation of the form // @pragma("vm:exact-result-type", int) // @pragma("vm:exact-result-type", "dart:core#_Smi") // and return the exact cid if found or kDynamicCid otherwise. // // See [result_type_pragma.md]. static intptr_t ResultCidFromPragma(const Object& function_or_field); static intptr_t MethodKindToReceiverCid(Kind kind); static const char* KindToCString(Kind kind); static const char* KindToFunctionNameCString(Kind kind); static bool IsMarkedAsRecognized(const Function& function, const char* kind = nullptr); static void InitializeState(); }; // Recognizes token corresponding to a method name. class MethodTokenRecognizer : public AllStatic { public: static Token::Kind RecognizeTokenKind(const String& name); }; // Class that recognizes factories and returns corresponding result cid. class FactoryRecognizer : public AllStatic { public: // Return result cid of 'factory' if it is recognized. // Return kDynamicCid if factory is not recognized. static intptr_t ResultCid(const Function& factory); // Return result cid of 'function' called with 'argument_count' arguments, // if function is a recognized list factory constructor. // Return kDynamicCid if function is not recognized. static intptr_t GetResultCidOfListFactory(Zone* zone, const Function& function, intptr_t argument_count); }; } // namespace dart #endif // RUNTIME_VM_COMPILER_METHOD_RECOGNIZER_H_