Bladeren bron

Fix: no local return in async block.

Herby Vojčík 12 jaren geleden
bovenliggende
commit
801adeb7f5
3 gewijzigde bestanden met toevoegingen van 54 en 17 verwijderingen
  1. 18 5
      js/Kernel-Methods.deploy.js
  2. 27 9
      js/Kernel-Methods.js
  3. 9 3
      st/Kernel-Methods.st

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

@@ -499,28 +499,30 @@ smalltalk.method({
 selector: "initialize",
 selector: "initialize",
 fn: function (){
 fn: function (){
 var self=this;
 var self=this;
-var $early={};
-try {
+var $1;
+var sentinel;
 self["@poolSize"]=(0);
 self["@poolSize"]=(0);
 self["@maxPoolSize"]=smalltalk.send(smalltalk.send(self,"_class",[]),"_defaultMaxPoolSize",[]);
 self["@maxPoolSize"]=smalltalk.send(smalltalk.send(self,"_class",[]),"_defaultMaxPoolSize",[]);
 self["@queue"]=smalltalk.send((smalltalk.Queue || Queue),"_new",[]);
 self["@queue"]=smalltalk.send((smalltalk.Queue || Queue),"_new",[]);
+sentinel=smalltalk.send((smalltalk.Object || Object),"_new",[]);
 self["@worker"]=(function(){
 self["@worker"]=(function(){
 var block;
 var block;
 self["@poolSize"]=smalltalk.send(self["@poolSize"],"__minus",[(1)]);
 self["@poolSize"]=smalltalk.send(self["@poolSize"],"__minus",[(1)]);
 self["@poolSize"];
 self["@poolSize"];
 block=smalltalk.send(self["@queue"],"_frontIfAbsent_",[(function(){
 block=smalltalk.send(self["@queue"],"_frontIfAbsent_",[(function(){
-throw $early=[nil];
+return sentinel;
 })]);
 })]);
 block;
 block;
+$1=smalltalk.send(block,"__eq_eq",[sentinel]);
+if(! smalltalk.assert($1)){
 return smalltalk.send((function(){
 return smalltalk.send((function(){
 return smalltalk.send(block,"_value",[]);
 return smalltalk.send(block,"_value",[]);
 }),"_ensure_",[(function(){
 }),"_ensure_",[(function(){
 return smalltalk.send(self,"_addWorker",[]);
 return smalltalk.send(self,"_addWorker",[]);
 })]);
 })]);
+};
 });
 });
 return self}
 return self}
-catch(e) {if(e===$early)return e[0]; throw e}
-}
 }),
 }),
 smalltalk.ForkPool);
 smalltalk.ForkPool);
 
 
@@ -555,6 +557,17 @@ return (100);
 }),
 }),
 smalltalk.ForkPool.klass);
 smalltalk.ForkPool.klass);
 
 
+smalltalk.addMethod(
+"_resetDefault",
+smalltalk.method({
+selector: "resetDefault",
+fn: function (){
+var self=this;
+self["@default"]=nil;
+return self}
+}),
+smalltalk.ForkPool.klass);
+
 
 
 smalltalk.addClass('Message', smalltalk.Object, ['selector', 'arguments'], 'Kernel-Methods');
 smalltalk.addClass('Message', smalltalk.Object, ['selector', 'arguments'], 'Kernel-Methods');
 smalltalk.addMethod(
 smalltalk.addMethod(

+ 27 - 9
js/Kernel-Methods.js

@@ -687,32 +687,34 @@ selector: "initialize",
 category: 'initialization',
 category: 'initialization',
 fn: function (){
 fn: function (){
 var self=this;
 var self=this;
-var $early={};
-try {
+var $1;
+var sentinel;
 self["@poolSize"]=(0);
 self["@poolSize"]=(0);
 self["@maxPoolSize"]=smalltalk.send(smalltalk.send(self,"_class",[]),"_defaultMaxPoolSize",[]);
 self["@maxPoolSize"]=smalltalk.send(smalltalk.send(self,"_class",[]),"_defaultMaxPoolSize",[]);
 self["@queue"]=smalltalk.send((smalltalk.Queue || Queue),"_new",[]);
 self["@queue"]=smalltalk.send((smalltalk.Queue || Queue),"_new",[]);
+sentinel=smalltalk.send((smalltalk.Object || Object),"_new",[]);
 self["@worker"]=(function(){
 self["@worker"]=(function(){
 var block;
 var block;
 self["@poolSize"]=smalltalk.send(self["@poolSize"],"__minus",[(1)]);
 self["@poolSize"]=smalltalk.send(self["@poolSize"],"__minus",[(1)]);
 self["@poolSize"];
 self["@poolSize"];
 block=smalltalk.send(self["@queue"],"_frontIfAbsent_",[(function(){
 block=smalltalk.send(self["@queue"],"_frontIfAbsent_",[(function(){
-throw $early=[nil];
+return sentinel;
 })]);
 })]);
 block;
 block;
+$1=smalltalk.send(block,"__eq_eq",[sentinel]);
+if(! smalltalk.assert($1)){
 return smalltalk.send((function(){
 return smalltalk.send((function(){
 return smalltalk.send(block,"_value",[]);
 return smalltalk.send(block,"_value",[]);
 }),"_ensure_",[(function(){
 }),"_ensure_",[(function(){
 return smalltalk.send(self,"_addWorker",[]);
 return smalltalk.send(self,"_addWorker",[]);
 })]);
 })]);
+};
 });
 });
-return self}
-catch(e) {if(e===$early)return e[0]; throw e}
-},
+return self},
 args: [],
 args: [],
-source: "initialize\x0a\x09poolSize := 0.\x0a    maxPoolSize := self class defaultMaxPoolSize.\x0a    queue := Queue new.\x0a    worker := [\x0a\x09\x09| block |\x0a        poolSize := poolSize - 1.\x0a\x09\x09block := queue frontIfAbsent: [ ^nil ].\x0a        [ block value ] ensure: [ self addWorker ]\x0a\x09].",
-messageSends: ["defaultMaxPoolSize", "class", "new", "-", "frontIfAbsent:", "ensure:", "addWorker", "value"],
-referencedClasses: ["Queue"]
+source: "initialize\x0a\x09| sentinel |\x0a\x09poolSize := 0.\x0a    maxPoolSize := self class defaultMaxPoolSize.\x0a    queue := Queue new.\x0a    sentinel := Object new.\x0a    worker := [\x0a\x09\x09| block |\x0a        poolSize := poolSize - 1.\x0a\x09\x09block := queue frontIfAbsent: [ sentinel ].\x0a        block == sentinel ifFalse: [\x0a        \x09[ block value ] ensure: [ self addWorker ]]].",
+messageSends: ["defaultMaxPoolSize", "class", "new", "-", "frontIfAbsent:", "ifFalse:", "ensure:", "addWorker", "value", "=="],
+referencedClasses: ["Queue", "Object"]
 }),
 }),
 smalltalk.ForkPool);
 smalltalk.ForkPool);
 
 
@@ -757,6 +759,22 @@ referencedClasses: []
 }),
 }),
 smalltalk.ForkPool.klass);
 smalltalk.ForkPool.klass);
 
 
+smalltalk.addMethod(
+"_resetDefault",
+smalltalk.method({
+selector: "resetDefault",
+category: 'accessing',
+fn: function (){
+var self=this;
+self["@default"]=nil;
+return self},
+args: [],
+source: "resetDefault\x0a\x09default := nil",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ForkPool.klass);
+
 
 
 smalltalk.addClass('Message', smalltalk.Object, ['selector', 'arguments'], 'Kernel-Methods');
 smalltalk.addClass('Message', smalltalk.Object, ['selector', 'arguments'], 'Kernel-Methods');
 smalltalk.Message.comment="Generally, the system does not use instances of Message for efficiency reasons.\x0aHowever, when a message is not understood by its receiver, the interpreter will make up an instance of it in order to capture the information involved in an actual message transmission. \x0aThis instance is sent it as an argument with the message `doesNotUnderstand:` to the receiver.\x0a\x0aSee boot.js, `messageNotUnderstood`  and its counterpart `Object>>doesNotUnderstand:`"
 smalltalk.Message.comment="Generally, the system does not use instances of Message for efficiency reasons.\x0aHowever, when a message is not understood by its receiver, the interpreter will make up an instance of it in order to capture the information involved in an actual message transmission. \x0aThis instance is sent it as an argument with the message `doesNotUnderstand:` to the receiver.\x0a\x0aSee boot.js, `messageNotUnderstood`  and its counterpart `Object>>doesNotUnderstand:`"

+ 9 - 3
st/Kernel-Methods.st

@@ -237,15 +237,17 @@ fork: aBlock
 !ForkPool methodsFor: 'initialization'!
 !ForkPool methodsFor: 'initialization'!
 
 
 initialize
 initialize
+	| sentinel |
 	poolSize := 0.
 	poolSize := 0.
     maxPoolSize := self class defaultMaxPoolSize.
     maxPoolSize := self class defaultMaxPoolSize.
     queue := Queue new.
     queue := Queue new.
+    sentinel := Object new.
     worker := [
     worker := [
 		| block |
 		| block |
         poolSize := poolSize - 1.
         poolSize := poolSize - 1.
-		block := queue frontIfAbsent: [ ^nil ].
-        [ block value ] ensure: [ self addWorker ]
-	].
+		block := queue frontIfAbsent: [ sentinel ].
+        block == sentinel ifFalse: [
+        	[ block value ] ensure: [ self addWorker ]]].
 ! !
 ! !
 
 
 ForkPool class instanceVariableNames: 'default'!
 ForkPool class instanceVariableNames: 'default'!
@@ -258,6 +260,10 @@ default
 
 
 defaultMaxPoolSize
 defaultMaxPoolSize
 	^100
 	^100
+!
+
+resetDefault
+	default := nil
 ! !
 ! !
 
 
 Object subclass: #Message
 Object subclass: #Message