Browse Source

BlockClosure >> ensure: impl'd by try/finally.

Herby Vojčík 12 years ago
parent
commit
43db62db26
6 changed files with 57 additions and 26 deletions
  1. 5 8
      js/Kernel-Methods.deploy.js
  2. 8 11
      js/Kernel-Methods.js
  3. 17 0
      js/Kernel-Tests.deploy.js
  4. 22 0
      js/Kernel-Tests.js
  5. 1 7
      st/Kernel-Methods.st
  6. 4 0
      st/Kernel-Tests.st

+ 5 - 8
js/Kernel-Methods.deploy.js

@@ -28,14 +28,11 @@ smalltalk.addMethod(
 "_ensure_",
 smalltalk.method({
 selector: "ensure:",
-fn: function (aBlock) {
-    var self = this;
-    var $1;
-    var success;
-    success = false;
-    $1 = smalltalk.send(function () {smalltalk.send(self, "_value", []);success = true;success;return smalltalk.send(aBlock, "_value", []);}, "_on_do_", [smalltalk.Error || Error, function (ex) {if (!smalltalk.assert(success)) {smalltalk.send(aBlock, "_value", []);}return smalltalk.send(ex, "_signal", []);}]);
-    return $1;
-}
+fn: function (aBlock){
+var self=this;
+try{self()}finally{return aBlock._value()};
+;
+return self}
 }),
 smalltalk.BlockClosure);
 

+ 8 - 11
js/Kernel-Methods.js

@@ -40,18 +40,15 @@ smalltalk.addMethod(
 smalltalk.method({
 selector: "ensure:",
 category: 'evaluating',
-fn: function (aBlock) {
-    var self = this;
-    var $1;
-    var success;
-    success = false;
-    $1 = smalltalk.send(function () {smalltalk.send(self, "_value", []);success = true;success;return smalltalk.send(aBlock, "_value", []);}, "_on_do_", [smalltalk.Error || Error, function (ex) {if (!smalltalk.assert(success)) {smalltalk.send(aBlock, "_value", []);}return smalltalk.send(ex, "_signal", []);}]);
-    return $1;
-},
+fn: function (aBlock){
+var self=this;
+try{self()}finally{return aBlock._value()};
+;
+return self},
 args: ["aBlock"],
-source: "ensure: aBlock\x0a\x09| success |\x0a\x09success := false.\x0a\x09^[self value. success := true. aBlock value]\x0a\x09\x09on: Error\x0a\x09\x09do: [:ex |\x0a\x09\x09\x09success ifFalse: [aBlock value].\x0a\x09\x09\x09ex signal]",
-messageSends: ["on:do:", "ifFalse:", "value", "signal"],
-referencedClasses: ["Error"]
+source: "ensure: aBlock\x0a\x09<try{self()}finally{return aBlock._value()}>",
+messageSends: [],
+referencedClasses: []
 }),
 smalltalk.BlockClosure);
 

+ 17 - 0
js/Kernel-Tests.deploy.js

@@ -28,6 +28,23 @@ return self}
 }),
 smalltalk.BlockClosureTest);
 
+smalltalk.addMethod(
+"_testEnsureRaises",
+smalltalk.method({
+selector: "testEnsureRaises",
+fn: function (){
+var self=this;
+smalltalk.send(self,"_should_raise_",[(function(){
+return smalltalk.send((function(){
+return smalltalk.send(smalltalk.send((smalltalk.Error || Error),"_new",[]),"_signal",[]);
+}),"_ensure_",[(function(){
+return true;
+})]);
+}),(smalltalk.Error || Error)]);
+return self}
+}),
+smalltalk.BlockClosureTest);
+
 smalltalk.addMethod(
 "_testNumArgs",
 smalltalk.method({

+ 22 - 0
js/Kernel-Tests.js

@@ -38,6 +38,28 @@ referencedClasses: ["Error"]
 }),
 smalltalk.BlockClosureTest);
 
+smalltalk.addMethod(
+"_testEnsureRaises",
+smalltalk.method({
+selector: "testEnsureRaises",
+category: 'tests',
+fn: function (){
+var self=this;
+smalltalk.send(self,"_should_raise_",[(function(){
+return smalltalk.send((function(){
+return smalltalk.send(smalltalk.send((smalltalk.Error || Error),"_new",[]),"_signal",[]);
+}),"_ensure_",[(function(){
+return true;
+})]);
+}),(smalltalk.Error || Error)]);
+return self},
+args: [],
+source: "testEnsureRaises\x0a\x09self should: [[Error new signal] ensure: [true]] raise: Error",
+messageSends: ["should:raise:", "ensure:", "signal", "new"],
+referencedClasses: ["Error"]
+}),
+smalltalk.BlockClosureTest);
+
 smalltalk.addMethod(
 "_testNumArgs",
 smalltalk.method({

+ 1 - 7
st/Kernel-Methods.st

@@ -56,13 +56,7 @@ applyTo: anObject arguments: aCollection
 !
 
 ensure: aBlock
-	| success |
-	success := false.
-	^[self value. success := true. aBlock value]
-		on: Error
-		do: [:ex |
-			success ifFalse: [aBlock value].
-			ex signal]
+	<try{self()}finally{return aBlock._value()}>
 !
 
 new

+ 4 - 0
st/Kernel-Tests.st

@@ -13,6 +13,10 @@ testEnsure
 	self assert: ([Error new] ensure: [true])
 !
 
+testEnsureRaises
+	self should: [[Error new signal] ensure: [true]] raise: Error
+!
+
 testNumArgs
 	self assert: [] numArgs equals: 0.
 	self assert: [:a :b | ] numArgs equals: 2