Skip to content

Commit

Permalink
Use binary search for method metas
Browse files Browse the repository at this point in the history
  • Loading branch information
tdermendjiev committed Nov 6, 2018
1 parent e81f423 commit bc8d308
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 7 deletions.
8 changes: 8 additions & 0 deletions src/NativeScript/Metadata/Metadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,14 @@ struct Array {
}
return -(left + 1);
}

int binarySearchLeftmost(std::function<int(const T&)> comparer) const {
int mid = binarySearch(comparer);
while (mid > 0 && comparer((*this)[mid - 1]) == 0) {
mid -= 1;
}
return mid;
}
};

template <typename T>
Expand Down
15 changes: 8 additions & 7 deletions src/NativeScript/Metadata/Metadata.mm
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ static int compareIdentifiers(const char* nullTerminated, const char* notNullTer

const std::vector<const MethodMeta*> BaseClassMeta::members(const char* identifier, size_t length, MemberType type, bool includeProtocols, bool onlyIfAvailable) const {
ASSERT(type == MemberType::InstanceMethod || type == MemberType::StaticMethod);
const ArrayOfPtrTo<MemberMeta>* members;
const ArrayOfPtrTo<MemberMeta>* members = nullptr;
switch (type) {
case MemberType::InstanceMethod:
members = &this->instanceMethods->castTo<PtrTo<MemberMeta>>();
Expand All @@ -132,18 +132,19 @@ static int compareIdentifiers(const char* nullTerminated, const char* notNullTer
members = &this->staticMethods->castTo<PtrTo<MemberMeta>>();
break;
default:
members = nullptr;
ASSERT_NOT_REACHED();
}

std::vector<const MethodMeta*> result;
int resultIndex = -1;
if (members != nullptr) {
resultIndex = members->binarySearchLeftmost([&](const PtrTo<MemberMeta>& member) { return compareIdentifiers(member->jsName(), identifier, length); });
const MemberMeta* m = reinterpret_cast<const MemberMeta*>((*members)[resultIndex].valuePtr());
if (resultIndex >= 0) {

for (int i = 0; i < members->count; i++) {

const MethodMeta* m = reinterpret_cast<const MethodMeta*>((*members)[i].valuePtr());
if ((strncmp(identifier, m->jsName(), length) == 0) && strlen(m->jsName()) == length) {
result.push_back(m);
while (resultIndex < members->count && (strncmp(m->jsName(), identifier, length) == 0 && strlen(m->jsName()) == length)) {
result.push_back(reinterpret_cast<const MethodMeta*>(m));
m = reinterpret_cast<const MemberMeta*>((*members)[++resultIndex].valuePtr());
}
}
}
Expand Down

0 comments on commit bc8d308

Please sign in to comment.