Parcourir la source

Fixes issue #520 (hopes it ok this time)

Nicolas Petton il y a 11 ans
Parent
commit
d1291f40df
1 fichiers modifiés avec 20 ajouts et 8 suppressions
  1. 20 8
      js/boot.js

+ 20 - 8
js/boot.js

@@ -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);
 		}
 	}