Chromium Code Reviews| Index: runtime/vm/intermediate_language.cc |
| diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc |
| index 86240ec4255c2ebb9961f42f07cbe28a28da37c8..7f1afca28f1aaf57397a6562f7be472c974b81c3 100644 |
| --- a/runtime/vm/intermediate_language.cc |
| +++ b/runtime/vm/intermediate_language.cc |
| @@ -217,15 +217,48 @@ ConstantInstr* GraphEntryInstr::constant_null() { |
| } |
| +static bool StartsWith(const String& name, const char* prefix, intptr_t n) { |
|
Florian Schneider
2013/01/07 13:15:48
Maybe assert that name is a OneByteString?
Vyacheslav Egorov (Google)
2013/01/07 15:02:47
Done.
|
| + if (name.Length() < n) { |
| + return false; |
| + } |
| + |
| + for (intptr_t i = 0; i < n; i++) { |
| + if (name.CharAt(i) != prefix[i]) { |
| + return false; |
| + } |
| + } |
| + |
| + return true; |
| +} |
| + |
| + |
| static bool CompareNames(const Library& lib, |
| const char* test_name, |
| const String& name) { |
| - // If both names are private mangle test_name before comparison. |
| - if ((name.CharAt(0) == '_') && (test_name[0] == '_')) { |
| - const String& test_name_symbol = String::Handle(Symbols::New(test_name)); |
| - return String::Handle(lib.PrivateName(test_name_symbol)).Equals(name); |
| + static const intptr_t kPrefixLength = 5; |
|
Florian Schneider
2013/01/07 13:15:48
Do you really need static here? I'd omit it for lo
Florian Schneider
2013/01/07 13:15:48
Maybe rather use strlen(kPrefixGetter) and strlen(
Kevin Millikin (Google)
2013/01/07 13:26:36
You can also use the trick:
static const char kGe
Vyacheslav Egorov (Google)
2013/01/07 15:02:47
Done.
Vyacheslav Egorov (Google)
2013/01/07 15:02:47
Done.
|
| + static const char* kGetterPrefix = "get:_"; |
|
Florian Schneider
2013/01/07 13:15:48
We have already kGetterPrefix in object.cc. Maybe
Vyacheslav Egorov (Google)
2013/01/07 15:02:47
Done.
|
| + static const char* kSetterPrefix = "set:_"; |
| + |
| + if (test_name[0] == '_') { |
| + if (name.CharAt(0) != '_') { |
| + return false; |
| + } |
| + } else if (strncmp(test_name, kGetterPrefix, kPrefixLength) == 0) { |
| + if (!StartsWith(name, kGetterPrefix, kPrefixLength)) { |
| + return false; |
| + } |
| + } else if (strncmp(test_name, kSetterPrefix, kPrefixLength) == 0) { |
| + if (!StartsWith(name, kSetterPrefix, kPrefixLength)) { |
| + return false; |
| + } |
| + } else { |
| + // Compare without mangling. |
| + return name.Equals(test_name); |
| } |
| - return name.Equals(test_name); |
| + |
| + // Both names are private. Mangle test_name before comparison. |
| + const String& test_name_symbol = String::Handle(Symbols::New(test_name)); |
| + return String::Handle(lib.PrivateName(test_name_symbol)).Equals(name); |
| } |
| @@ -236,6 +269,7 @@ static bool IsRecognizedLibrary(const Library& library) { |
| || (library.raw() == Library::ScalarlistLibrary()); |
| } |
| + |
| MethodRecognizer::Kind MethodRecognizer::RecognizeKind( |
| const Function& function) { |
| const Class& function_class = Class::Handle(function.Owner()); |