Browse Source

Optimize announcements.

Herby Vojčík 5 years ago
parent
commit
28fc8c99ff

+ 13 - 27
lang/src/Kernel-Announcements.js

@@ -33,16 +33,21 @@ selector: "announcementClass:",
 protocol: "accessing",
 fn: function (aClass){
 var self=this,$self=this;
-$self["@announcementClass"]=aClass;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$self["@announcementClass"]=$recv($recv($globals.Smalltalk)._globals())._at_($recv(aClass)._name());
 return self;
-
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"announcementClass:",{aClass:aClass},$globals.AnnouncementSubscription)});
+//>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: ["aClass"],
-source: "announcementClass: aClass\x0a\x09announcementClass := aClass",
-referencedClasses: [],
+source: "announcementClass: aClass\x0a\x09announcementClass := Smalltalk globals at: aClass name",
+referencedClasses: ["Smalltalk"],
 //>>excludeEnd("ide");
-messageSends: []
+messageSends: ["at:", "globals", "name"]
 }),
 $globals.AnnouncementSubscription);
 
@@ -83,36 +88,17 @@ var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $2,$3,$1,$receiver;
-$2=$recv($globals.Smalltalk)._globals();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["globals"]=1;
-//>>excludeEnd("ctx");
-$3=$recv($self._announcementClass())._name();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["name"]=1;
-//>>excludeEnd("ctx");
-$1=$recv($2)._at_($3);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["at:"]=1;
-//>>excludeEnd("ctx");
-if(($receiver = $1) == null || $receiver.a$nil){
-return false;
-} else {
-var class_;
-class_=$receiver;
-return $recv($recv($recv($globals.Smalltalk)._globals())._at_($recv($recv($recv(anAnnouncement)._class())._theNonMetaClass())._name()))._includesBehavior_(class_);
-}
+return $recv($recv($recv($globals.Smalltalk)._globals())._at_($recv($recv(anAnnouncement)._class())._name()))._includesBehavior_($self._announcementClass());
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 }, function($ctx1) {$ctx1.fill(self,"handlesAnnouncement:",{anAnnouncement:anAnnouncement},$globals.AnnouncementSubscription)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: ["anAnnouncement"],
-source: "handlesAnnouncement: anAnnouncement\x0a\x09\x22anAnnouncement might be announced from within another Amber environment\x22\x0a\x09\x0a\x09^ (Smalltalk globals at: self announcementClass name)\x0a\x09\x09ifNil: [ ^ false ]\x0a\x09\x09ifNotNil: [ :class |\x0a\x09\x09(Smalltalk globals at: anAnnouncement class theNonMetaClass name) includesBehavior: class ]",
+source: "handlesAnnouncement: anAnnouncement\x0a\x09\x22anAnnouncement might be announced from within another Amber environment\x22\x0a\x09\x0a\x09^ (Smalltalk globals at: anAnnouncement class name) includesBehavior: self announcementClass",
 referencedClasses: ["Smalltalk"],
 //>>excludeEnd("ide");
-messageSends: ["ifNil:ifNotNil:", "at:", "globals", "name", "announcementClass", "includesBehavior:", "theNonMetaClass", "class"]
+messageSends: ["includesBehavior:", "at:", "globals", "name", "class", "announcementClass"]
 }),
 $globals.AnnouncementSubscription);
 

+ 2 - 5
lang/src/Kernel-Announcements.st

@@ -13,7 +13,7 @@ announcementClass
 !
 
 announcementClass: aClass
-	announcementClass := aClass
+	announcementClass := Smalltalk globals at: aClass name
 !
 
 receiver
@@ -38,10 +38,7 @@ deliver: anAnnouncement
 handlesAnnouncement: anAnnouncement
 	"anAnnouncement might be announced from within another Amber environment"
 	
-	^ (Smalltalk globals at: self announcementClass name)
-		ifNil: [ ^ false ]
-		ifNotNil: [ :class |
-		(Smalltalk globals at: anAnnouncement class theNonMetaClass name) includesBehavior: class ]
+	^ (Smalltalk globals at: anAnnouncement class name) includesBehavior: self announcementClass
 ! !
 
 Object subclass: #AnnouncementValuable

+ 22 - 8
lang/src/Kernel-Tests.js

@@ -86,30 +86,44 @@ var subscription,announcementClass1,announcementClass2,classBuilder;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $1,$2;
+var $1,$3,$4,$2,$6,$7,$5;
 classBuilder=$recv($globals.ClassBuilder)._new();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["new"]=1;
 //>>excludeEnd("ctx");
 announcementClass1=$recv(classBuilder)._basicAddSubclassOf_named_instanceVariableNames_package_($globals.SystemAnnouncement,"TestAnnouncement1",[],"Kernel-Tests");
-subscription=$recv($recv($globals.AnnouncementSubscription)._new())._announcementClass_($globals.SystemAnnouncement);
-$1=$recv(subscription)._handlesAnnouncement_($globals.SystemAnnouncement);
+$1=$recv($globals.AnnouncementSubscription)._new();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["new"]=2;
+//>>excludeEnd("ctx");
+subscription=$recv($1)._announcementClass_($globals.SystemAnnouncement);
+$3=subscription;
+$4=$recv($globals.SystemAnnouncement)._new();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["new"]=3;
+//>>excludeEnd("ctx");
+$2=$recv($3)._handlesAnnouncement_($4);
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["handlesAnnouncement:"]=1;
 //>>excludeEnd("ctx");
-$self._assert_equals_($1,true);
+$self._assert_equals_($2,true);
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["assert:equals:"]=1;
 //>>excludeEnd("ctx");
-$2=$recv(subscription)._handlesAnnouncement_(announcementClass1);
+$6=subscription;
+$7=$recv(announcementClass1)._new();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["new"]=4;
+//>>excludeEnd("ctx");
+$5=$recv($6)._handlesAnnouncement_($7);
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["handlesAnnouncement:"]=2;
 //>>excludeEnd("ctx");
-$self._assert_equals_($2,true);
+$self._assert_equals_($5,true);
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["assert:equals:"]=2;
 //>>excludeEnd("ctx");
-$self._assert_equals_($recv(subscription)._handlesAnnouncement_($globals.Object),false);
+$self._assert_equals_($recv(subscription)._handlesAnnouncement_($recv($globals.Object)._new()),false);
 $recv(classBuilder)._basicRemoveClass_(announcementClass1);
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -118,7 +132,7 @@ return self;
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "testHandlesAnnouncement\x0a\x09| subscription announcementClass1 announcementClass2 classBuilder |\x0a\x09\x0a\x09classBuilder := ClassBuilder new.\x0a\x09announcementClass1 := classBuilder basicAddSubclassOf: SystemAnnouncement named: 'TestAnnouncement1' instanceVariableNames: #() package: 'Kernel-Tests'.\x0a\x09\x0a\x09subscription := AnnouncementSubscription new announcementClass: SystemAnnouncement.\x0a\x09\x22Test whether the same class triggers the announcement\x22\x0a\x09self assert: (subscription handlesAnnouncement: SystemAnnouncement) equals: true.\x0a\x09\x22Test whether a subclass triggers the announcement\x22\x0a\x09self assert: (subscription handlesAnnouncement: announcementClass1) equals: true.\x0a\x09\x22Test whether an unrelated class does not trigger the announcement\x22\x0a\x09self assert: (subscription handlesAnnouncement: Object) equals: false.\x0a\x09\x0a\x09classBuilder basicRemoveClass: announcementClass1.",
+source: "testHandlesAnnouncement\x0a\x09| subscription announcementClass1 announcementClass2 classBuilder |\x0a\x09\x0a\x09classBuilder := ClassBuilder new.\x0a\x09announcementClass1 := classBuilder basicAddSubclassOf: SystemAnnouncement named: 'TestAnnouncement1' instanceVariableNames: #() package: 'Kernel-Tests'.\x0a\x09\x0a\x09subscription := AnnouncementSubscription new announcementClass: SystemAnnouncement.\x0a\x09\x22Test whether the same class triggers the announcement\x22\x0a\x09self assert: (subscription handlesAnnouncement: SystemAnnouncement new) equals: true.\x0a\x09\x22Test whether a subclass triggers the announcement\x22\x0a\x09self assert: (subscription handlesAnnouncement: announcementClass1 new) equals: true.\x0a\x09\x22Test whether an unrelated class does not trigger the announcement\x22\x0a\x09self assert: (subscription handlesAnnouncement: Object new) equals: false.\x0a\x09\x0a\x09classBuilder basicRemoveClass: announcementClass1.",
 referencedClasses: ["ClassBuilder", "SystemAnnouncement", "AnnouncementSubscription", "Object"],
 //>>excludeEnd("ide");
 messageSends: ["new", "basicAddSubclassOf:named:instanceVariableNames:package:", "announcementClass:", "assert:equals:", "handlesAnnouncement:", "basicRemoveClass:"]

+ 3 - 3
lang/src/Kernel-Tests.st

@@ -24,11 +24,11 @@ testHandlesAnnouncement
 	
 	subscription := AnnouncementSubscription new announcementClass: SystemAnnouncement.
 	"Test whether the same class triggers the announcement"
-	self assert: (subscription handlesAnnouncement: SystemAnnouncement) equals: true.
+	self assert: (subscription handlesAnnouncement: SystemAnnouncement new) equals: true.
 	"Test whether a subclass triggers the announcement"
-	self assert: (subscription handlesAnnouncement: announcementClass1) equals: true.
+	self assert: (subscription handlesAnnouncement: announcementClass1 new) equals: true.
 	"Test whether an unrelated class does not trigger the announcement"
-	self assert: (subscription handlesAnnouncement: Object) equals: false.
+	self assert: (subscription handlesAnnouncement: Object new) equals: false.
 	
 	classBuilder basicRemoveClass: announcementClass1.
 ! !