private void copyNonPrivateMethodsFromSuper(Entry e) { Object oldListOrMethod = e.methodsForSuper; if (oldListOrMethod == null) return; if (oldListOrMethod instanceof FastArray) { FastArray oldList = (FastArray) oldListOrMethod; int len1 = oldList.size(); Object list[] = oldList.getArray(); for (int j = 0; j != len1; ++j) { MetaMethod method = (MetaMethod) list[j]; if (method.isPrivate()) continue; e.methods = addMethodToList(e.methods, method); } } else { MetaMethod method = (MetaMethod) oldListOrMethod; if (!method.isPrivate()) { e.methods = addMethodToList(e.methods, method); } } }
private void copyNonPrivateMethods(Entry from, Header to) { Object oldListOrMethod = from.methods; if (oldListOrMethod instanceof FastArray) { FastArray oldList = (FastArray) oldListOrMethod; Entry e = null; int len1 = oldList.size(); Object list[] = oldList.getArray(); for (int j = 0; j != len1; ++j) { MetaMethod method = (MetaMethod) list[j]; if (method.isPrivate()) continue; if (e == null) e = getOrPutMethods(from.name, to); e.methods = addMethodToList(e.methods, method); } } else { MetaMethod method = (MetaMethod) oldListOrMethod; if (!method.isPrivate()) { Entry e = getOrPutMethods(from.name, to); e.methods = addMethodToList(e.methods, method); } } }
public Object addMethodToList(Object o, MetaMethod method) { if (o == null) { return method; } if (o instanceof MetaMethod) { MetaMethod match = (MetaMethod) o; if (!isMatchingMethod(match, method)) { FastArray list = new FastArray(2); list.add(match); list.add(method); return list; } else { if (match.isPrivate() || (!isNonRealMethod(match) && match.getDeclaringClass().isInterface() && !method.getDeclaringClass().isInterface())) { // do not overwrite interface methods with instance methods // do not overwrite private methods // Note: private methods from parent classes are not shown here, // but when doing the multimethod connection step, we overwrite // methods of the parent class with methods of a subclass and // in that case we want to keep the private methods } else { CachedClass methodC = method.getDeclaringClass(); CachedClass matchC = match.getDeclaringClass(); if (methodC == matchC) { if (isNonRealMethod(method)) { return method; } } else if (!methodC.isAssignableFrom(matchC.getTheClass())) { return method; } } } return o; } if (o instanceof FastArray) { FastArray list = (FastArray) o; int found = findMatchingMethod(list, method); if (found == -1) { list.add(method); } else { MetaMethod match = (MetaMethod) list.get(found); if (match == method) return o; if (match.isPrivate() || (!isNonRealMethod(match) && match.getDeclaringClass().isInterface() && !method.getDeclaringClass().isInterface())) { // do not overwrite interface methods with instance methods // do not overwrite private methods // Note: private methods from parent classes are not shown here, // but when doing the multimethod connection step, we overwrite // methods of the parent class with methods of a subclass and // in that case we want to keep the private methods } else { CachedClass methodC = method.getDeclaringClass(); CachedClass matchC = match.getDeclaringClass(); if (methodC == matchC) { if (isNonRealMethod(method)) { list.set(found, method); } } else if (!methodC.isAssignableFrom(matchC.getTheClass())) { list.set(found, method); } } } } return o; }