История изменений
Исправление foror, (текущая версия) :
Все методы, т.е. я внутри класса вызываю this.foo(...) и оно начинает искать нужный this.foo метод. Я в hotspot пока нашел вот это:
private static Method findMethod(ObjArray methods, Symbol name, Symbol signature) {
int len = (int) methods.getLength();
// methods are sorted, so do binary search
int l = 0;
int h = len - 1;
while (l <= h) {
int mid = (l + h) >> 1;
Method m = (Method) methods.getObjAt(mid);
int res = m.getName().fastCompare(name);
if (res == 0) {
// found matching name; do linear search to find matching signature
// first, quick check for common case
if (m.getSignature().equals(signature)) return m;
// search downwards through overloaded methods
int i;
for (i = mid - 1; i >= l; i--) {
Method m1 = (Method) methods.getObjAt(i);
if (!m1.getName().equals(name)) break;
if (m1.getSignature().equals(signature)) return m1;
}
// search upwards
for (i = mid + 1; i <= h; i++) {
Method m1 = (Method) methods.getObjAt(i);
if (!m1.getName().equals(name)) break;
if (m1.getSignature().equals(signature)) return m1;
}
// not found
if (Assert.ASSERTS_ENABLED) {
int index = linearSearch(methods, name, signature);
if (index != -1) {
throw new DebuggerException("binary search bug: should have found entry " + index);
}
}
return null;
} else if (res < 0) {
l = mid + 1;
} else {
h = mid - 1;
}
}
if (Assert.ASSERTS_ENABLED) {
int index = linearSearch(methods, name, signature);
if (index != -1) {
throw new DebuggerException("binary search bug: should have found entry " + index);
}
}
return null;
}
Но оно тут просто сравнивает адреса сигнатур, т.е. это не то. Я пробовал искать алгоритмы для поиска перегруженного метода, там участвует целочисленная переменная distance. И по ней затем просто определяют насколько метод близок.
Исправление foror, :
Все методы, т.е. я внутри класса вызываю this.foo(...) и оно начинает искать нужные this.foo метод. Я в hotspot пока нашел вот это:
private static Method findMethod(ObjArray methods, Symbol name, Symbol signature) {
int len = (int) methods.getLength();
// methods are sorted, so do binary search
int l = 0;
int h = len - 1;
while (l <= h) {
int mid = (l + h) >> 1;
Method m = (Method) methods.getObjAt(mid);
int res = m.getName().fastCompare(name);
if (res == 0) {
// found matching name; do linear search to find matching signature
// first, quick check for common case
if (m.getSignature().equals(signature)) return m;
// search downwards through overloaded methods
int i;
for (i = mid - 1; i >= l; i--) {
Method m1 = (Method) methods.getObjAt(i);
if (!m1.getName().equals(name)) break;
if (m1.getSignature().equals(signature)) return m1;
}
// search upwards
for (i = mid + 1; i <= h; i++) {
Method m1 = (Method) methods.getObjAt(i);
if (!m1.getName().equals(name)) break;
if (m1.getSignature().equals(signature)) return m1;
}
// not found
if (Assert.ASSERTS_ENABLED) {
int index = linearSearch(methods, name, signature);
if (index != -1) {
throw new DebuggerException("binary search bug: should have found entry " + index);
}
}
return null;
} else if (res < 0) {
l = mid + 1;
} else {
h = mid - 1;
}
}
if (Assert.ASSERTS_ENABLED) {
int index = linearSearch(methods, name, signature);
if (index != -1) {
throw new DebuggerException("binary search bug: should have found entry " + index);
}
}
return null;
}
Но оно тут просто сравнивает адреса сигнатур, т.е. это не то. Я пробовал искать алгоритмы для поиска перегруженного метода, там участвует целочисленная переменная distance. И по ней затем просто определяют насколько метод близок.
Исходная версия foror, :
Все методы, т.е. я внутри класса вызываю this.foo(...) и оно начинает искать нужные this.foo метод. Я в hotspot пока нашел вот это:
private static Method findMethod(ObjArray methods, Symbol name, Symbol signature) { int len = (int) methods.getLength(); // methods are sorted, so do binary search int l = 0; int h = len - 1; while (l <= h) { int mid = (l + h) >> 1; Method m = (Method) methods.getObjAt(mid); int res = m.getName().fastCompare(name); if (res == 0) { // found matching name; do linear search to find matching signature // first, quick check for common case if (m.getSignature().equals(signature)) return m; // search downwards through overloaded methods int i; for (i = mid - 1; i >= l; i--) { Method m1 = (Method) methods.getObjAt(i); if (!m1.getName().equals(name)) break; if (m1.getSignature().equals(signature)) return m1; } // search upwards for (i = mid + 1; i <= h; i++) { Method m1 = (Method) methods.getObjAt(i); if (!m1.getName().equals(name)) break; if (m1.getSignature().equals(signature)) return m1; } // not found if (Assert.ASSERTS_ENABLED) { int index = linearSearch(methods, name, signature); if (index != -1) { throw new DebuggerException(«binary search bug: should have found entry » + index); } } return null; } else if (res < 0) { l = mid + 1; } else { h = mid - 1; } } if (Assert.ASSERTS_ENABLED) { int index = linearSearch(methods, name, signature); if (index != -1) { throw new DebuggerException(«binary search bug: should have found entry » + index); } } return null; }
Но оно тут просто сравнивает адреса сигнатур, т.е. это не то. Я пробовал искать алгоритмы для поиска перегруженного метода, там участвует целочисленная переменная distance. И по ней затем просто определяют насколько метод близок.