Browse Source

Set >> remove: works for non-prim arg. Fix #1245.

Herby Vojčík 4 years ago
parent
commit
e756476b01

+ 1 - 0
CHANGELOG

@@ -3,6 +3,7 @@
 
 * $core.removeClass returns removed class.
 * Cleaned error-handling code.
+* More Set fixes.
 
 Commits: https://lolg.it/amber/amber/commits/0.24.1
 

+ 7 - 7
lang/src/Kernel-Collections.js

@@ -7753,29 +7753,29 @@ selector: "remove:ifAbsent:",
 protocol: "adding/removing",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: ["anObject", "aBlock"],
-source: "remove: anObject ifAbsent: aBlock\x0a\x09| bucket |\x0a\x09bucket := self bucketsOfElement: anObject.\x0a\x09^ bucket second\x0a\x09\x09ifNil: [ bucket third remove: bucket first ifAbsent: [ ^aBlock value ]. size := size - 1 ]\x0a\x09\x09ifNotNil: [ :primitiveBucket | self remove: bucket first in: primitiveBucket ifAbsent: aBlock ]",
+source: "remove: anObject ifAbsent: aBlock\x0a\x09| bucket |\x0a\x09bucket := self bucketsOfElement: anObject.\x0a\x09^ bucket second\x0a\x09\x09ifNil: [ | obj | obj := bucket first. bucket third remove: obj ifAbsent: [ ^aBlock value ]. size := size - 1. obj ]\x0a\x09\x09ifNotNil: [ :primitiveBucket | self remove: bucket first in: primitiveBucket ifAbsent: aBlock ]",
 referencedClasses: [],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["bucketsOfElement:", "ifNil:ifNotNil:", "second", "remove:ifAbsent:", "third", "first", "value", "-", "remove:in:ifAbsent:"]
+messageSends: ["bucketsOfElement:", "ifNil:ifNotNil:", "second", "first", "remove:ifAbsent:", "third", "value", "-", "remove:in:ifAbsent:"]
 }, function ($methodClass){ return function (anObject,aBlock){
 var self=this,$self=this;
 var bucket;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $1,$2,$3,$receiver;
+var $1,$receiver;
 var $early={};
 try {
 bucket=$self._bucketsOfElement_(anObject);
 $1=$recv(bucket)._second();
 if(($receiver = $1) == null || $receiver.a$nil){
-$2=$recv(bucket)._third();
-$3=$recv(bucket)._first();
+var obj;
+obj=$recv(bucket)._first();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["first"]=1;
 //>>excludeEnd("ctx");
-$recv($2)._remove_ifAbsent_($3,(function(){
+$recv($recv(bucket)._third())._remove_ifAbsent_(obj,(function(){
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx2) {
 //>>excludeEnd("ctx");
@@ -7785,7 +7785,7 @@ throw $early=[$recv(aBlock)._value()];
 //>>excludeEnd("ctx");
 }));
 $self.size=$recv($self.size).__minus((1));
-return $self.size;
+return obj;
 } else {
 var primitiveBucket;
 primitiveBucket=$receiver;

+ 1 - 1
lang/src/Kernel-Collections.st

@@ -1700,7 +1700,7 @@ remove: anObject ifAbsent: aBlock
 	| bucket |
 	bucket := self bucketsOfElement: anObject.
 	^ bucket second
-		ifNil: [ bucket third remove: bucket first ifAbsent: [ ^aBlock value ]. size := size - 1 ]
+		ifNil: [ | obj | obj := bucket first. bucket third remove: obj ifAbsent: [ ^aBlock value ]. size := size - 1. obj ]
 		ifNotNil: [ :primitiveBucket | self remove: bucket first in: primitiveBucket ifAbsent: aBlock ]
 !
 

+ 24 - 0
lang/src/Kernel-Tests.js

@@ -9723,6 +9723,30 @@ return self;
 }; }),
 $globals.SetTest);
 
+$core.addMethod(
+$core.method({
+selector: "testRegression1245",
+protocol: "tests",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "testRegression1245\x0a\x09self assert: ({Object. String} asSet remove: String) equals: String",
+referencedClasses: ["Object", "String"],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: ["assert:equals:", "remove:", "asSet"]
+}, function ($methodClass){ return function (){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$self._assert_equals_($recv($recv([$globals.Object,$globals.String])._asSet())._remove_($globals.String),$globals.String);
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"testRegression1245",{})});
+//>>excludeEnd("ctx");
+}; }),
+$globals.SetTest);
+
 $core.addMethod(
 $core.method({
 selector: "testUnboxedObjects",

+ 4 - 0
lang/src/Kernel-Tests.st

@@ -1821,6 +1821,10 @@ testRegression1228
 	self should: [#(1 2 3) asSet remove: 4] raise: Error
 !
 
+testRegression1245
+	self assert: ({Object. String} asSet remove: String) equals: String
+!
+
 testUnboxedObjects
 	self assert: {'foo' yourself. 'foo' yourself} asSet asArray equals: #('foo')
 !