Потому что String
не реализован как часть SDK, а вместо этого определяется временем выполнения c (класс String
, который вы видите в SDK, - это просто класс abstract
). Так что, если вы, например, компилируете в JavaScript, вы будете использовать другую реализацию (точнее, прямой вызов того же метода в JavaScript).
В VM методы String
«вставлены» в класс с этим классом: https://github.com/dart-lang/sdk/blob/ea50b03cbee9971a3e3f1cc5c832fc2dfb941654/sdk/lib/_internal/vm/lib/string_patch.dart
Но, как вы можете видеть:
String toUpperCase() native "String_toUpperCase";
String toLowerCase() native "String_toLowerCase";
Эти два метода фактически реализуются вызовом в реализацию C ++. Поэтому нам нужно посмотреть здесь: https://github.com/dart-lang/sdk/blob/78df4ac452dd3ba69ac0c78559f6dde51eeeadb2/runtime/lib/string.cc
Где мы находим:
DEFINE_NATIVE_ENTRY(String_toLowerCase, 0, 1) {
const String& receiver =
String::CheckedHandle(zone, arguments->NativeArgAt(0));
ASSERT(!receiver.IsNull());
return String::ToLowerCase(receiver);
}
DEFINE_NATIVE_ENTRY(String_toUpperCase, 0, 1) {
const String& receiver =
String::CheckedHandle(zone, arguments->NativeArgAt(0));
ASSERT(!receiver.IsNull());
return String::ToUpperCase(receiver);
}
Эту реализацию можно найти здесь: https://github.com/dart-lang/sdk/blob/da9697feb96364360bfaedbb1c661c20bf7a4cb0/runtime/vm/object.cc#L22023
StringPtr String::ToUpperCase(const String& str, Heap::Space space) {
// TODO(cshapiro): create a fast-path for OneByteString instances.
return Transform(CaseMapping::ToUpper, str, space);
}
StringPtr String::ToLowerCase(const String& str, Heap::Space space) {
// TODO(cshapiro): create a fast-path for OneByteString instances.
return Transform(CaseMapping::ToLower, str, space);
}
Где CaseMapping
можно найти здесь: https://github.com/dart-lang/sdk/blob/da9697feb96364360bfaedbb1c661c20bf7a4cb0/runtime/platform/unicode.h#L170
И так далее и так далее ... :)