Browse Source

Revert "Simpler fix for previous commit"
It has issue because of the removal of the compiledMethod

This reverts commit 04637ce678ce3fc3c2363e97a167fec65c1130c6.

Nicolas Petton 10 years ago
parent
commit
2f776d200f
2 changed files with 44 additions and 28 deletions
  1. 39 25
      js/Kernel-Classes.js
  2. 5 3
      st/Kernel-Classes.st

+ 39 - 25
js/Kernel-Classes.js

@@ -33,46 +33,60 @@ function $MethodAdded(){return smalltalk.MethodAdded||(typeof MethodAdded=="unde
 function $MethodModified(){return smalltalk.MethodModified||(typeof MethodModified=="undefined"?nil:MethodModified)}
 function $SystemAnnouncer(){return smalltalk.SystemAnnouncer||(typeof SystemAnnouncer=="undefined"?nil:SystemAnnouncer)}
 return smalltalk.withContext(function($ctx1) { 
-var $1,$3,$4,$2,$5,$6,$7,$8,$9;
+var $2,$3,$1,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13;
 oldMethod=_st(self._methodDictionary())._at_ifAbsent_(_st(aMethod)._selector(),(function(){
 return smalltalk.withContext(function($ctx2) {
 return nil;
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)})}));
-$1=oldMethod;
-if(($receiver = $1) == nil || $receiver == null){
-$1;
-} else {
-self._removeCompiledMethod_(oldMethod);
-};
-$3=self._protocols();
-$4=_st(aMethod)._protocol();
+$2=self._protocols();
+$3=_st(aMethod)._protocol();
 $ctx1.sendIdx["protocol"]=1;
-$2=_st($3)._includes_($4);
-if(! smalltalk.assert($2)){
-_st(self._organization())._addElement_(_st(aMethod)._protocol());
+$1=_st($2)._includes_($3);
+if(! smalltalk.assert($1)){
+$4=self._organization();
+$ctx1.sendIdx["organization"]=1;
+$5=_st(aMethod)._protocol();
+$ctx1.sendIdx["protocol"]=2;
+_st($4)._addElement_($5);
 };
 self._basicAddCompiledMethod_(aMethod);
-$5=oldMethod;
-if(($receiver = $5) == nil || $receiver == null){
-$6=_st($MethodAdded())._new();
+$6=oldMethod;
+if(($receiver = $6) == nil || $receiver == null){
+$6;
+} else {
+_st(_st(self._methods())._select_((function(each){
+return smalltalk.withContext(function($ctx2) {
+$7=_st(each)._protocol();
+$ctx2.sendIdx["protocol"]=3;
+$8=_st(oldMethod)._protocol();
+$ctx2.sendIdx["protocol"]=4;
+return _st($7).__eq($8);
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,4)})})))._ifEmpty_((function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(self._organization())._removeElement_(_st(oldMethod)._protocol());
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,5)})}));
+};
+$9=oldMethod;
+if(($receiver = $9) == nil || $receiver == null){
+$10=_st($MethodAdded())._new();
 $ctx1.sendIdx["new"]=1;
-_st($6)._method_(aMethod);
+_st($10)._method_(aMethod);
 $ctx1.sendIdx["method:"]=1;
-$7=_st($6)._yourself();
+$11=_st($10)._yourself();
 $ctx1.sendIdx["yourself"]=1;
-announcement=$7;
+announcement=$11;
 } else {
-$8=_st($MethodModified())._new();
-_st($8)._oldMethod_(oldMethod);
-_st($8)._method_(aMethod);
-$9=_st($8)._yourself();
-announcement=$9;
+$12=_st($MethodModified())._new();
+_st($12)._oldMethod_(oldMethod);
+_st($12)._method_(aMethod);
+$13=_st($12)._yourself();
+announcement=$13;
 };
 _st(_st($SystemAnnouncer())._current())._announce_(announcement);
 return self}, function($ctx1) {$ctx1.fill(self,"addCompiledMethod:",{aMethod:aMethod,oldMethod:oldMethod,announcement:announcement},smalltalk.Behavior)})},
 args: ["aMethod"],
-source: "addCompiledMethod: aMethod\x0a\x09| oldMethod announcement |\x0a\x09\x0a\x09oldMethod := self methodDictionary\x0a\x09\x09at: aMethod selector\x0a\x09\x09ifAbsent: [ nil ].\x0a\x09\x0a\x09oldMethod ifNotNil: [\x0a\x09\x09self removeCompiledMethod: oldMethod ].\x0a\x09\x0a\x09(self protocols includes: aMethod protocol)\x0a\x09\x09ifFalse: [ self organization addElement: aMethod protocol ].\x0a\x0a\x09self basicAddCompiledMethod: aMethod.\x0a\x09\x0a\x09announcement := oldMethod\x0a\x09\x09ifNil: [\x0a\x09\x09\x09MethodAdded new\x0a\x09\x09\x09\x09\x09method: aMethod;\x0a\x09\x09\x09\x09\x09yourself ]\x0a\x09\x09ifNotNil: [\x0a\x09\x09\x09MethodModified new\x0a\x09\x09\x09\x09\x09oldMethod: oldMethod;\x0a\x09\x09\x09\x09\x09method: aMethod;\x0a\x09\x09\x09\x09\x09yourself ].\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x0a\x09SystemAnnouncer current\x0a\x09\x09\x09\x09announce: announcement",
-messageSends: ["at:ifAbsent:", "methodDictionary", "selector", "ifNotNil:", "removeCompiledMethod:", "ifFalse:", "includes:", "protocols", "protocol", "addElement:", "organization", "basicAddCompiledMethod:", "ifNil:ifNotNil:", "method:", "new", "yourself", "oldMethod:", "announce:", "current"],
+source: "addCompiledMethod: aMethod\x0a\x09| oldMethod announcement |\x0a\x09\x0a\x09oldMethod := self methodDictionary\x0a\x09\x09at: aMethod selector\x0a\x09\x09ifAbsent: [ nil ].\x0a\x09\x0a\x09(self protocols includes: aMethod protocol)\x0a\x09\x09ifFalse: [ self organization addElement: aMethod protocol ].\x0a\x0a\x09self basicAddCompiledMethod: aMethod.\x0a\x09\x0a\x09oldMethod ifNotNil: [\x0a\x09\x09(self methods\x0a\x09\x09\x09select: [ :each | each protocol = oldMethod protocol ])\x0a\x09\x09\x09ifEmpty: [ self organization removeElement: oldMethod protocol ] ].\x0a\x09\x0a\x09announcement := oldMethod\x0a\x09\x09ifNil: [\x0a\x09\x09\x09MethodAdded new\x0a\x09\x09\x09\x09\x09method: aMethod;\x0a\x09\x09\x09\x09\x09yourself ]\x0a\x09\x09ifNotNil: [\x0a\x09\x09\x09MethodModified new\x0a\x09\x09\x09\x09\x09oldMethod: oldMethod;\x0a\x09\x09\x09\x09\x09method: aMethod;\x0a\x09\x09\x09\x09\x09yourself ].\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09\x0a\x09SystemAnnouncer current\x0a\x09\x09\x09\x09announce: announcement",
+messageSends: ["at:ifAbsent:", "methodDictionary", "selector", "ifFalse:", "includes:", "protocols", "protocol", "addElement:", "organization", "basicAddCompiledMethod:", "ifNotNil:", "ifEmpty:", "select:", "methods", "=", "removeElement:", "ifNil:ifNotNil:", "method:", "new", "yourself", "oldMethod:", "announce:", "current"],
 referencedClasses: ["MethodAdded", "MethodModified", "SystemAnnouncer"]
 }),
 smalltalk.Behavior);

+ 5 - 3
st/Kernel-Classes.st

@@ -213,14 +213,16 @@ addCompiledMethod: aMethod
 		at: aMethod selector
 		ifAbsent: [ nil ].
 	
-	oldMethod ifNotNil: [
-		self removeCompiledMethod: oldMethod ].
-	
 	(self protocols includes: aMethod protocol)
 		ifFalse: [ self organization addElement: aMethod protocol ].
 
 	self basicAddCompiledMethod: aMethod.
 	
+	oldMethod ifNotNil: [
+		(self methods
+			select: [ :each | each protocol = oldMethod protocol ])
+			ifEmpty: [ self organization removeElement: oldMethod protocol ] ].
+
 	announcement := oldMethod
 		ifNil: [
 			MethodAdded new