|
@@ -279,6 +279,7 @@ function Smalltalk() {
|
|
|
|
|
|
st.initClass = function(klass) {
|
|
|
if(klass.wrapped) {
|
|
|
+ klass.inheritedMethods = {};
|
|
|
copySuperclass(klass);
|
|
|
} else {
|
|
|
installSuperclass(klass);
|
|
@@ -312,7 +313,7 @@ function Smalltalk() {
|
|
|
superclass && superclass !== nil;
|
|
|
superclass = superclass.superclass) {
|
|
|
for (var keys = Object.keys(superclass.methods), i = 0; i < keys.length; i++) {
|
|
|
- installMethodIfAbsent(superclass.methods[keys[i]], klass);
|
|
|
+ inheritMethodIfAbsent(superclass.methods[keys[i]], klass);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -324,11 +325,15 @@ function Smalltalk() {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- function installMethodIfAbsent(method, klass) {
|
|
|
- var jsFunction = klass.fn.prototype[method.jsSelector];
|
|
|
- if(!jsFunction || jsFunction.isAmberDNU) {
|
|
|
- installMethod(method, klass);
|
|
|
+ function inheritMethodIfAbsent(method, klass) {
|
|
|
+ var selector = method.selector;
|
|
|
+
|
|
|
+ if(klass.methods.hasOwnProperty(selector) || klass.inheritedMethods.hasOwnProperty(selector)) {
|
|
|
+ return;
|
|
|
}
|
|
|
+
|
|
|
+ installMethod(method, klass);
|
|
|
+ klass.inheritedMethods[method.selector] = true;
|
|
|
}
|
|
|
|
|
|
function reinstallMethods(klass) {
|
|
@@ -340,14 +345,21 @@ function Smalltalk() {
|
|
|
function installDnuHandlers(klass) {
|
|
|
var m = dnu.methods;
|
|
|
for(var i=0; i<m.length; i++) {
|
|
|
- installMethodIfAbsent(m[i], klass);
|
|
|
+ installDnuHandlerIfAbsent(m[i], klass);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function installNewDnuHandler(newHandler) {
|
|
|
- installMethodIfAbsent(newHandler, st.Object);
|
|
|
+ installDnuHandlerIfAbsent(newHandler, st.Object);
|
|
|
for(var i = 0; i < wrappedClasses.length; i++) {
|
|
|
- installMethodIfAbsent(newHandler, wrappedClasses[i]);
|
|
|
+ installDnuHandlerIfAbsent(newHandler, wrappedClasses[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function installDnuHandlerIfAbsent(handler, klass) {
|
|
|
+ var jsFunction = klass.fn.prototype[handler.jsSelector];
|
|
|
+ if(!jsFunction) {
|
|
|
+ installMethod(handler, klass);
|
|
|
}
|
|
|
}
|
|
|
|