16 switch (
function.recognized_kind()) {
17 case MethodRecognizer::kDoubleFromInteger:
18 case MethodRecognizer::kMathMin:
19 case MethodRecognizer::kMathMax:
27 const Object& function_or_field) {
32 Symbols::vm_exact_result_type(),
34 if (option.IsType()) {
35 return Type::Cast(option).type_class_id();
36 }
else if (option.IsString()) {
37 auto& str = String::Cast(option);
40 bool parse_failure =
false;
41 intptr_t library_end = -1;
42 for (intptr_t i = 0; i < str.Length(); ++i) {
43 if (str.CharAt(i) ==
'#') {
44 if (library_end != -1) {
52 if (!parse_failure && library_end > 0) {
56 if (!library.IsNull()) {
61 if (!klass.IsNull()) {
66 }
else if (option.IsArray()) {
67 const Array& array = Array::Cast(option);
71 return Type::Cast(
type).type_class_id();
81 const Object& function_or_field) {
86 Symbols::vm_non_nullable_result_type(),
97 case kObjectArrayGetIndexed:
98 case kObjectArraySetIndexed:
99 case kObjectArraySetIndexedUnchecked:
102 case kGrowableArrayGetIndexed:
103 case kGrowableArraySetIndexed:
104 case kGrowableArraySetIndexedUnchecked:
105 return kGrowableObjectArrayCid;
107#define TYPED_DATA_GET_SET_INDEXED_CASES(clazz) \
108 case k##clazz##ArrayGetIndexed: \
109 case k##clazz##ArraySetIndexed: \
110 return kTypedData##clazz##ArrayCid; \
111 case kExternal##clazz##ArrayGetIndexed: \
112 return kExternalTypedData##clazz##ArrayCid; \
113 case k##clazz##ArrayViewGetIndexed: \
114 return kTypedData##clazz##ArrayViewCid;
117#undef TYPED_DATA_GET_SET_INDEXED_CASES
119 case kExternalUint8ArraySetIndexed:
120 return kExternalTypedDataUint8ArrayCid;
122 case kExternalUint8ClampedArraySetIndexed:
123 return kExternalTypedDataUint8ClampedArrayCid;
138 {
"",
"",
"Unknown", 0},
139#define RECOGNIZE_METHOD(class_name, function_name, enum_name, fp) \
140 {"" #class_name, "" #function_name, #enum_name, fp},
142#undef RECOGNIZE_METHOD
167 Symbols::vm_recognized(),
false, &
options);
168 if (!is_recognized)
return false;
169 if (kind ==
nullptr)
return true;
175 return String::Cast(
options).Equals(kind);
182 bool fingerprints_match =
true;
194#define RECOGNIZE_METHOD(class_name, function_name, enum_name, fp) \
195 case MethodRecognizer::k##enum_name: \
196 func.reset_unboxed_parameters_and_return(); \
199#undef RECOGNIZE_METHOD
203 }
else if (!FLAG_precompiled_mode) {
204 fingerprints_match =
false;
210#define SET_FUNCTION_BIT(class_name, function_name, dest, fp, setter, value) \
211 func = Library::GetFunction(libs, #class_name, #function_name); \
212 if (!func.IsNull()) { \
213 fingerprints_match = \
214 func.CheckSourceFingerprint(fp) && fingerprints_match; \
215 func.setter(value); \
216 } else if (!FLAG_precompiled_mode) { \
217 OS::PrintErr("Missing %s::%s\n", #class_name, #function_name); \
218 fingerprints_match = false; \
221#define SET_IS_POLYMORPHIC_TARGET(class_name, function_name, dest, fp) \
222 SET_FUNCTION_BIT(class_name, function_name, dest, fp, \
223 set_is_polymorphic_target, true)
227#undef SET_RECOGNIZED_KIND
228#undef SET_IS_POLYMORPHIC_TARGET
229#undef SET_FUNCTION_BIT
231 if (!fingerprints_match) {
235 "FP mismatch while recognizing methods. If the behavior of "
236 "these functions has changed, then changes are also needed in "
237 "the VM's compiler. Otherwise the fingerprint can simply be "
238 "updated in recognized_methods_list.h\n");
265 }
else if (
name.ptr() == Symbols::TruncDivOperator().ptr()) {
266 return Token::kTRUNCDIV;
270 return Token::kBIT_OR;
272 return Token::kBIT_AND;
274 return Token::kBIT_XOR;
275 }
else if (
name.ptr() == Symbols::LeftShiftOperator().ptr()) {
277 }
else if (
name.ptr() == Symbols::RightShiftOperator().ptr()) {
279 }
else if (
name.ptr() == Symbols::UnsignedRightShiftOperator().ptr()) {
282 return Token::kBIT_NOT;
283 }
else if (
name.ptr() == Symbols::UnaryMinus().ptr()) {
284 return Token::kNEGATE;
285 }
else if (
name.ptr() == Symbols::EqualOperator().ptr()) {
293 }
else if (
name.ptr() == Symbols::LessEqualOperator().ptr()) {
295 }
else if (
name.ptr() == Symbols::GreaterEqualOperator().ptr()) {
302 return Token::kILLEGAL;
317#define RECOGNIZE_FACTORY(symbol, class_name, constructor_name, cid, fp) \
318 {Symbols::k##symbol##Id, cid, fp, #symbol ", " #cid},
328#undef RECOGNIZE_FACTORY
361 if (owner.
Name() == Symbols::List().ptr()) {
362 if (
function.name() == Symbols::ListFactory().ptr()) {
364 return (
argument_count == 1) ? kGrowableObjectArrayCid : kArrayCid;
365 }
else if (
function.name() == Symbols::ListFilledFactory().ptr()) {
#define DART_CLASS_LIST_TYPED_DATA(V)
LibraryPtr library() const
static intptr_t ResultCid(const Function &factory)
static intptr_t GetResultCidOfListFactory(Zone *zone, const Function &function, intptr_t argument_count)
static bool IsGetterName(const String &function_name)
static bool IsSetterName(const String &function_name)
static bool IsDynamicInvocationForwarderName(const String &name)
static StringPtr DemangleDynamicInvocationForwarderName(const String &name)
bool CheckSourceFingerprint(int32_t fp, const char *kind=nullptr) const
bool IsDynamicInvocationForwarder() const
void set_recognized_kind(MethodRecognizer::Kind value) const
static LibraryPtr CoreLibrary()
static LibraryPtr IsolateLibrary()
static LibraryPtr ConvertLibrary()
static LibraryPtr NativeWrappersLibrary()
static LibraryPtr CollectionLibrary()
static bool FindPragma(Thread *T, bool only_core, const Object &object, const String &pragma_name, bool multiple=false, Object *options=nullptr)
static LibraryPtr AsyncLibrary()
static LibraryPtr LookupLibrary(Thread *thread, const String &url)
static FunctionPtr GetFunction(const GrowableArray< Library * > &libs, const char *class_name, const char *function_name)
static LibraryPtr InternalLibrary()
static LibraryPtr FfiLibrary()
static LibraryPtr MathLibrary()
static LibraryPtr DeveloperLibrary()
static LibraryPtr TypedDataLibrary()
static intptr_t ResultCidFromPragma(const Object &function_or_field)
static bool IsMarkedAsRecognized(const Function &function, const char *kind=nullptr)
static intptr_t MethodKindToReceiverCid(Kind kind)
static void InitializeState()
static intptr_t NumArgsCheckedForStaticCall(const Function &function)
static const char * KindToCString(Kind kind)
static const char * KindToFunctionNameCString(Kind kind)
static bool HasNonNullableResultTypeFromPragma(const Object &function_or_field)
static Token::Kind RecognizeTokenKind(const String &name)
static void static void PrintErr(const char *format,...) PRINTF_ATTRIBUTE(1
static Object & ZoneHandle()
static StringPtr SubString(const String &str, intptr_t begin_index, Heap::Space space=Heap::kNew)
static bool EqualsIgnoringPrivateKey(const String &str1, const String &str2)
static const String & Percent()
static const String & Symbol(intptr_t index)
static const String & Plus()
static const String & LAngleBracket()
static const String & BitOr()
static const String & Caret()
static const String & Tilde()
static const String & RAngleBracket()
static const String & Ampersand()
static const String & Star()
static const String & Slash()
static const String & Minus()
static const String & Token(Token::Kind token)
static Thread * Current()
Dart_NativeFunction function
#define SET_IS_POLYMORPHIC_TARGET(class_name, function_name, dest, fp)
#define RECOGNIZE_METHOD(class_name, function_name, enum_name, fp)
#define TYPED_DATA_GET_SET_INDEXED_CASES(clazz)
#define RECOGNIZE_FACTORY(symbol, class_name, constructor_name, cid, fp)
static bool Equals(const Object &expected, const Object &actual)
static const struct dart::@132 factory_recognizer_list[]
static Token::Kind RecognizeTokenKindHelper(const String &name)
const char *const class_name
const uint32_t finger_print
static const struct dart::@131 recognized_methods[MethodRecognizer::kNumRecognizedMethods]
const char *const enum_name
const char *const function_name
#define ALL_INTRINSICS_LIST(V)
#define POLYMORPHIC_TARGET_LIST(V)
#define RECOGNIZED_LIST_FACTORY_LIST(V)
#define RECOGNIZED_LIST(V)