The Trunk: Kernel-eem.1355.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Kernel-eem.1355.mcz

commits-2
Eliot Miranda uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-eem.1355.mcz

==================== Summary ====================

Name: Kernel-eem.1355
Author: eem
Time: 28 October 2020, 6:16:21.972202 pm
UUID: 14e40036-578b-4645-88e4-77be34a6d96b
Ancestors: Kernel-eem.1354

Speed-up cull:[cull:*] by supplying the primitive to handle teh case where the number of block arguments matches the number of arguments to cull:[cull:].
Nuke the obsolete pre-closure simulation code for block closure activation.

=============== Diff against Kernel-eem.1354 ===============

Item was changed:
  ----- Method: BlockClosure>>cull: (in category 'evaluating') -----
  cull: firstArg
  "Activate the receiver, with one or zero arguments."
+ <primitive: 202> "Handle the one argument case primitively"
-
  numArgs >= 1 ifTrue: [ ^self value: firstArg ].
  ^self value!

Item was changed:
  ----- Method: BlockClosure>>cull:cull: (in category 'evaluating') -----
  cull: firstArg cull: secondArg
  "Activate the receiver, with two or less arguments."
+ <primitive: 203> "Handle the two argument case primitively"
-
  numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ].
  numArgs = 1 ifTrue: [ ^self value: firstArg ].
  ^self value!

Item was changed:
  ----- Method: BlockClosure>>cull:cull:cull: (in category 'evaluating') -----
  cull: firstArg cull: secondArg cull: thirdArg
  "Activate the receiver, with three or less arguments."
+ <primitive: 204> "Handle the two argument case primitively"
-
  numArgs >= 2 ifTrue: [
  numArgs >= 3 ifTrue: [ ^self value: firstArg value: secondArg value: thirdArg ].
  ^self value: firstArg value: secondArg ].
  numArgs = 1 ifTrue: [ ^self value: firstArg ].
  ^self value!

Item was changed:
  ----- Method: BlockClosure>>cull:cull:cull:cull: (in category 'evaluating') -----
  cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg
  "Activate the receiver, with four or less arguments."
+ <primitive: 205> "Handle the two argument case primitively"
-
  numArgs >= 3 ifTrue: [
  numArgs >= 4 ifTrue: [
  ^self value: firstArg value: secondArg value: thirdArg value: fourthArg ].
  ^self value: firstArg value: secondArg value: thirdArg ].
  numArgs = 2 ifTrue: [ ^self value: firstArg value: secondArg ].
  numArgs = 1 ifTrue: [ ^self value: firstArg ].
  ^self value!

Item was changed:
  ----- Method: BlockClosure>>value (in category 'evaluating') -----
  value
  "Activate the receiver, creating a closure activation (Context)
  whose closure is the receiver and whose caller is the sender of this
  message. Supply the copied values to the activation as its copied
  temps. Primitive. Essential."
  <primitive: 201>
- | newContext |
  numArgs ~= 0 ifTrue:
  [self numArgsError: 0].
+ ^self primitiveFailed!
- false
- ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
- [newContext := self asContextWithSender: thisContext sender.
- thisContext privSender: newContext]
- ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: BlockClosure>>value: (in category 'evaluating') -----
  value: firstArg
  "Activate the receiver, creating a closure activation (Context)
  whose closure is the receiver and whose caller is the sender of this
  message. Supply the argument and copied values to the activation
  as its argument and copied temps. Primitive. Essential."
  <primitive: 202>
- | newContext |
  numArgs ~= 1 ifTrue:
  [self numArgsError: 1].
+ ^self primitiveFailed!
- false
- ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
- [newContext := self asContextWithSender: thisContext sender.
- newContext at: 1 put: firstArg.
- thisContext privSender: newContext]
- ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: BlockClosure>>value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg
  "Activate the receiver, creating a closure activation (Context)
  whose closure is the receiver and whose caller is the sender of this
  message. Supply the arguments and copied values to the activation
  as its arguments and copied temps. Primitive. Essential."
  <primitive: 203>
- | newContext |
  numArgs ~= 2 ifTrue:
  [self numArgsError: 2].
+ ^self primitiveFailed!
- false
- ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
- [newContext := self asContextWithSender: thisContext sender.
- newContext at: 1 put: firstArg.
- newContext at: 2 put: secondArg.
- thisContext privSender: newContext]
- ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: BlockClosure>>value:value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg value: thirdArg
  "Activate the receiver, creating a closure activation (Context)
  whose closure is the receiver and whose caller is the sender of this
  message. Supply the arguments and copied values to the activation
  as its arguments and copied temps. Primitive. Essential."
  <primitive: 204>
- | newContext |
  numArgs ~= 3 ifTrue:
  [self numArgsError: 3].
+ ^self primitiveFailed!
- false
- ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
- [newContext := self asContextWithSender: thisContext sender.
- newContext at: 1 put: firstArg.
- newContext at: 2 put: secondArg.
- newContext at: 3 put: thirdArg.
- thisContext privSender: newContext]
- ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: BlockClosure>>value:value:value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg value: thirdArg value: fourthArg
  "Activate the receiver, creating a closure activation (Context)
  whose closure is the receiver and whose caller is the sender of this
  message. Supply the arguments and copied values to the activation
  as its arguments and copied temps. Primitive. Essential."
  <primitive: 205>
- | newContext |
  numArgs ~= 4 ifTrue:
  [self numArgsError: 4].
+ ^self primitiveFailed!
- false
- ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
- [newContext := self asContextWithSender: thisContext sender.
- newContext at: 1 put: firstArg.
- newContext at: 2 put: secondArg.
- newContext at: 3 put: thirdArg.
- newContext at: 4 put: fourthArg.
- thisContext privSender: newContext]
- ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: BlockClosure>>value:value:value:value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg
  "Activate the receiver, creating a closure activation (Context)
  whose closure is the receiver and whose caller is the sender of this
  message. Supply the arguments and copied values to the activation
  as its arguments and copied temps. Primitive. Essential."
  <primitive: 205>
- | newContext |
  numArgs ~= 5 ifTrue:
  [self numArgsError: 5].
+ ^self primitiveFailed!
- false
- ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
- [newContext := self asContextWithSender: thisContext sender.
- newContext at: 1 put: firstArg.
- newContext at: 2 put: secondArg.
- newContext at: 3 put: thirdArg.
- newContext at: 4 put: fourthArg.
- newContext at: 5 put: fifthArg.
- thisContext privSender: newContext]
- ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: BlockClosure>>valueWithArguments: (in category 'evaluating') -----
  valueWithArguments: anArray
  "Activate the receiver, creating a closure activation (Context)
  whose closure is the receiver and whose caller is the sender of this
  message. Supply the arguments in an anArray and copied values to
  the activation as its arguments and copied temps. Primitive. Essential."
  <primitive: 206>
- | newContext |
  numArgs ~= anArray size ifTrue:
  [self numArgsError: anArray size].
+ ^self primitiveFailed!
- false
- ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
- [newContext := self asContextWithSender: thisContext sender.
- 1 to: numArgs do:
- [:i| newContext at: i put: (anArray at: i)].
- thisContext privSender: newContext]
- ifFalse: [self primitiveFailed]!

Item was added:
+ ----- Method: FullBlockClosure>>cull: (in category 'evaluating') -----
+ cull: firstArg
+ "Activate the receiver, with one or zero arguments."
+ <primitive: 207> "Handle the one argument case primitively"
+ numArgs >= 1 ifTrue: [ ^self value: firstArg ].
+ ^self value!

Item was added:
+ ----- Method: FullBlockClosure>>cull:cull: (in category 'evaluating') -----
+ cull: firstArg cull: secondArg
+ "Activate the receiver, with two or less arguments."
+ <primitive: 207> "Handle the two argument case primitively"
+ numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ].
+ numArgs = 1 ifTrue: [ ^self value: firstArg ].
+ ^self value!

Item was added:
+ ----- Method: FullBlockClosure>>cull:cull:cull: (in category 'evaluating') -----
+ cull: firstArg cull: secondArg cull: thirdArg
+ "Activate the receiver, with three or less arguments."
+ <primitive: 207> "Handle the three argument case primitively"
+ numArgs >= 2 ifTrue:
+ [numArgs >= 3 ifTrue:
+ [^self value: firstArg value: secondArg value: thirdArg].
+ ^self value: firstArg value: secondArg].
+ numArgs = 1 ifTrue:
+ [^self value: firstArg].
+ ^self value!

Item was added:
+ ----- Method: FullBlockClosure>>cull:cull:cull:cull: (in category 'evaluating') -----
+ cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg
+ "Activate the receiver, with four or less arguments."
+ <primitive: 207> "Handle the four argument case primitively"
+ numArgs >= 3 ifTrue:
+ [numArgs >= 4 ifTrue:
+ [^self value: firstArg value: secondArg value: thirdArg value: fourthArg].
+ ^self value: firstArg value: secondArg value: thirdArg].
+ numArgs = 2 ifTrue:
+ [^self value: firstArg value: secondArg].
+ numArgs = 1 ifTrue:
+ [^self value: firstArg].
+ ^self value!

Item was changed:
  ----- Method: FullBlockClosure>>value (in category 'evaluating') -----
  value
  "Activate the receiver, creating a closure activation (MethodContext)
  whose closure is the receiver and whose caller is the sender of this
  message. Supply the copied values to the activation as its copied
  temps. Primitive. Essential."
  <primitive: 207>
- | newContext |
  numArgs ~= 0 ifTrue:
  [self numArgsError: 0].
+ ^self primitiveFailed!
- false
- ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
- [newContext := self asContextWithSender: thisContext sender.
- thisContext privSender: newContext]
- ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: FullBlockClosure>>value: (in category 'evaluating') -----
  value: firstArg
  "Activate the receiver, creating a closure activation (MethodContext)
  whose closure is the receiver and whose caller is the sender of this
  message. Supply the argument and copied values to the activation
  as its argument and copied temps. Primitive. Essential."
  <primitive: 207>
- | newContext |
  numArgs ~= 1 ifTrue:
  [self numArgsError: 1].
+ ^self primitiveFailed!
- false
- ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
- [newContext := self asContextWithSender: thisContext sender.
- newContext at: 1 put: firstArg.
- thisContext privSender: newContext]
- ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: FullBlockClosure>>value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg
  "Activate the receiver, creating a closure activation (MethodContext)
  whose closure is the receiver and whose caller is the sender of this
  message. Supply the arguments and copied values to the activation
  as its arguments and copied temps. Primitive. Essential."
  <primitive: 207>
- | newContext |
  numArgs ~= 2 ifTrue:
  [self numArgsError: 2].
+ ^self primitiveFailed!
- false
- ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
- [newContext := self asContextWithSender: thisContext sender.
- newContext at: 1 put: firstArg.
- newContext at: 2 put: secondArg.
- thisContext privSender: newContext]
- ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: FullBlockClosure>>value:value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg value: thirdArg
  "Activate the receiver, creating a closure activation (MethodContext)
  whose closure is the receiver and whose caller is the sender of this
  message. Supply the arguments and copied values to the activation
  as its arguments and copied temps. Primitive. Essential."
  <primitive: 207>
- | newContext |
  numArgs ~= 3 ifTrue:
  [self numArgsError: 3].
+ ^self primitiveFailed!
- false
- ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
- [newContext := self asContextWithSender: thisContext sender.
- newContext at: 1 put: firstArg.
- newContext at: 2 put: secondArg.
- newContext at: 3 put: thirdArg.
- thisContext privSender: newContext]
- ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: FullBlockClosure>>value:value:value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg value: thirdArg value: fourthArg
  "Activate the receiver, creating a closure activation (MethodContext)
  whose closure is the receiver and whose caller is the sender of this
  message. Supply the arguments and copied values to the activation
  as its arguments and copied temps. Primitive. Essential."
  <primitive: 207>
- | newContext |
  numArgs ~= 4 ifTrue:
  [self numArgsError: 4].
+ ^self primitiveFailed!
- false
- ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
- [newContext := self asContextWithSender: thisContext sender.
- newContext at: 1 put: firstArg.
- newContext at: 2 put: secondArg.
- newContext at: 3 put: thirdArg.
- newContext at: 4 put: fourthArg.
- thisContext privSender: newContext]
- ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: FullBlockClosure>>value:value:value:value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg
  "Activate the receiver, creating a closure activation (MethodContext)
  whose closure is the receiver and whose caller is the sender of this
  message. Supply the arguments and copied values to the activation
  as its arguments and copied temps. Primitive. Essential."
  <primitive: 207>
- | newContext |
  numArgs ~= 5 ifTrue:
  [self numArgsError: 5].
+ ^self primitiveFailed!
- false
- ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
- [newContext := self asContextWithSender: thisContext sender.
- newContext at: 1 put: firstArg.
- newContext at: 2 put: secondArg.
- newContext at: 3 put: thirdArg.
- newContext at: 4 put: fourthArg.
- newContext at: 5 put: fifthArg.
- thisContext privSender: newContext]
- ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: FullBlockClosure>>valueWithArguments: (in category 'evaluating') -----
  valueWithArguments: anArray
  "Activate the receiver, creating a closure activation (MethodContext)
  whose closure is the receiver and whose caller is the sender of this
  message. Supply the arguments in an anArray and copied values to
  the activation as its arguments and copied temps. Primitive. Essential."
  <primitive: 208>
- | newContext |
  numArgs ~= anArray size ifTrue:
  [self numArgsError: anArray size].
+ ^self primitiveFailed!
- false
- ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
- [newContext := self asContextWithSender: thisContext sender.
- 1 to: numArgs do:
- [:i| newContext at: i put: (anArray at: i)].
- thisContext privSender: newContext]
- ifFalse: [self primitiveFailed]!


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Kernel-eem.1355.mcz

Christoph Thiede

Great idea! As a side-effect, there will also be less noise when debugging some block invocation. :-)

Why did you choose numArgs = 2 for the fast lane, was this a random choice only, or did you do some measurements to find out which number of arguments is most commonly passed?


Best,
Christoph

Von: Squeak-dev <[hidden email]> im Auftrag von [hidden email] <[hidden email]>
Gesendet: Donnerstag, 29. Oktober 2020 03:13:04
An: [hidden email]; [hidden email]
Betreff: [squeak-dev] The Trunk: Kernel-eem.1355.mcz
 
Eliot Miranda uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-eem.1355.mcz

==================== Summary ====================

Name: Kernel-eem.1355
Author: eem
Time: 28 October 2020, 6:16:21.972202 pm
UUID: 14e40036-578b-4645-88e4-77be34a6d96b
Ancestors: Kernel-eem.1354

Speed-up cull:[cull:*] by supplying the primitive to handle teh case where the number of block arguments matches the number of arguments to cull:[cull:].
Nuke the obsolete pre-closure simulation code for block closure activation.

=============== Diff against Kernel-eem.1354 ===============

Item was changed:
  ----- Method: BlockClosure>>cull: (in category 'evaluating') -----
  cull: firstArg
         "Activate the receiver, with one or zero arguments."
+        <primitive: 202> "Handle the one argument case primitively"
-       
         numArgs >= 1 ifTrue: [ ^self value: firstArg ].
         ^self value!

Item was changed:
  ----- Method: BlockClosure>>cull:cull: (in category 'evaluating') -----
  cull: firstArg cull: secondArg
         "Activate the receiver, with two or less arguments."
+        <primitive: 203> "Handle the two argument case primitively"
-       
         numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ].       
         numArgs = 1 ifTrue: [ ^self value: firstArg ].
         ^self value!

Item was changed:
  ----- Method: BlockClosure>>cull:cull:cull: (in category 'evaluating') -----
  cull: firstArg cull: secondArg cull: thirdArg
         "Activate the receiver, with three or less arguments."
+        <primitive: 204> "Handle the two argument case primitively"
-       
         numArgs >= 2 ifTrue: [
                 numArgs >= 3 ifTrue: [ ^self value: firstArg value: secondArg value: thirdArg ].
                 ^self value: firstArg value: secondArg ].
         numArgs = 1 ifTrue: [ ^self value: firstArg ].
         ^self value!

Item was changed:
  ----- Method: BlockClosure>>cull:cull:cull:cull: (in category 'evaluating') -----
  cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg
         "Activate the receiver, with four or less arguments."
+        <primitive: 205> "Handle the two argument case primitively"
-       
         numArgs >= 3 ifTrue: [
                 numArgs >= 4 ifTrue: [
                         ^self value: firstArg value: secondArg value: thirdArg value: fourthArg ].
                 ^self value: firstArg value: secondArg value: thirdArg ].
         numArgs = 2 ifTrue: [ ^self value: firstArg value: secondArg ].
         numArgs = 1 ifTrue: [ ^self value: firstArg ].
         ^self value!

Item was changed:
  ----- Method: BlockClosure>>value (in category 'evaluating') -----
  value
         "Activate the receiver, creating a closure activation (Context)
          whose closure is the receiver and whose caller is the sender of this
          message. Supply the copied values to the activation as its copied
          temps. Primitive. Essential."
         <primitive: 201>
-        | newContext |
         numArgs ~= 0 ifTrue:
                 [self numArgsError: 0].
+        ^self primitiveFailed!
-        false
-                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
-                        [newContext := self asContextWithSender: thisContext sender.
-                        thisContext privSender: newContext]
-                ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: BlockClosure>>value: (in category 'evaluating') -----
  value: firstArg
         "Activate the receiver, creating a closure activation (Context)
          whose closure is the receiver and whose caller is the sender of this
          message. Supply the argument and copied values to the activation
          as its argument and copied temps. Primitive. Essential."
         <primitive: 202>
-        | newContext |
         numArgs ~= 1 ifTrue:
                 [self numArgsError: 1].
+        ^self primitiveFailed!
-        false
-                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
-                        [newContext := self asContextWithSender: thisContext sender.
-                        newContext at: 1 put: firstArg.
-                        thisContext privSender: newContext]
-                ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: BlockClosure>>value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg
         "Activate the receiver, creating a closure activation (Context)
          whose closure is the receiver and whose caller is the sender of this
          message. Supply the arguments and copied values to the activation
          as its arguments and copied temps. Primitive. Essential."
         <primitive: 203>
-        | newContext |
         numArgs ~= 2 ifTrue:
                 [self numArgsError: 2].
+        ^self primitiveFailed!
-        false
-                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
-                        [newContext := self asContextWithSender: thisContext sender.
-                        newContext at: 1 put: firstArg.
-                        newContext at: 2 put: secondArg.
-                        thisContext privSender: newContext]
-                ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: BlockClosure>>value:value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg value: thirdArg
         "Activate the receiver, creating a closure activation (Context)
          whose closure is the receiver and whose caller is the sender of this
          message. Supply the arguments and copied values to the activation
          as its arguments and copied temps. Primitive. Essential."
         <primitive: 204>
-        | newContext |
         numArgs ~= 3 ifTrue:
                 [self numArgsError: 3].
+        ^self primitiveFailed!
-        false
-                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
-                        [newContext := self asContextWithSender: thisContext sender.
-                        newContext at: 1 put: firstArg.
-                        newContext at: 2 put: secondArg.
-                        newContext at: 3 put: thirdArg.
-                        thisContext privSender: newContext]
-                ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: BlockClosure>>value:value:value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg value: thirdArg value: fourthArg
         "Activate the receiver, creating a closure activation (Context)
          whose closure is the receiver and whose caller is the sender of this
          message. Supply the arguments and copied values to the activation
          as its arguments and copied temps. Primitive. Essential."
         <primitive: 205>
-        | newContext |
         numArgs ~= 4 ifTrue:
                 [self numArgsError: 4].
+        ^self primitiveFailed!
-        false
-                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
-                        [newContext := self asContextWithSender: thisContext sender.
-                        newContext at: 1 put: firstArg.
-                        newContext at: 2 put: secondArg.
-                        newContext at: 3 put: thirdArg.
-                        newContext at: 4 put: fourthArg.
-                        thisContext privSender: newContext]
-                ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: BlockClosure>>value:value:value:value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg
         "Activate the receiver, creating a closure activation (Context)
          whose closure is the receiver and whose caller is the sender of this
          message. Supply the arguments and copied values to the activation
          as its arguments and copied temps. Primitive. Essential."
         <primitive: 205>
-        | newContext |
         numArgs ~= 5 ifTrue:
                 [self numArgsError: 5].
+        ^self primitiveFailed!
-        false
-                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
-                        [newContext := self asContextWithSender: thisContext sender.
-                        newContext at: 1 put: firstArg.
-                        newContext at: 2 put: secondArg.
-                        newContext at: 3 put: thirdArg.
-                        newContext at: 4 put: fourthArg.
-                        newContext at: 5 put: fifthArg.
-                        thisContext privSender: newContext]
-                ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: BlockClosure>>valueWithArguments: (in category 'evaluating') -----
  valueWithArguments: anArray
         "Activate the receiver, creating a closure activation (Context)
          whose closure is the receiver and whose caller is the sender of this
          message. Supply the arguments in an anArray and copied values to
          the activation as its arguments and copied temps. Primitive. Essential."
         <primitive: 206>
-        | newContext |
         numArgs ~= anArray size ifTrue:
                 [self numArgsError: anArray size].
+        ^self primitiveFailed!
-        false
-                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
-                        [newContext := self asContextWithSender: thisContext sender.
-                        1 to: numArgs do:
-                                [:i| newContext at: i put: (anArray at: i)].
-                        thisContext privSender: newContext]
-                ifFalse: [self primitiveFailed]!

Item was added:
+ ----- Method: FullBlockClosure>>cull: (in category 'evaluating') -----
+ cull: firstArg
+        "Activate the receiver, with one or zero arguments."
+        <primitive: 207> "Handle the one argument case primitively"
+        numArgs >= 1 ifTrue: [ ^self value: firstArg ].
+        ^self value!

Item was added:
+ ----- Method: FullBlockClosure>>cull:cull: (in category 'evaluating') -----
+ cull: firstArg cull: secondArg
+        "Activate the receiver, with two or less arguments."
+        <primitive: 207> "Handle the two argument case primitively"
+        numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ].       
+        numArgs = 1 ifTrue: [ ^self value: firstArg ].
+        ^self value!

Item was added:
+ ----- Method: FullBlockClosure>>cull:cull:cull: (in category 'evaluating') -----
+ cull: firstArg cull: secondArg cull: thirdArg
+        "Activate the receiver, with three or less arguments."
+        <primitive: 207> "Handle the three argument case primitively"
+        numArgs >= 2 ifTrue:
+                [numArgs >= 3 ifTrue:
+                        [^self value: firstArg value: secondArg value: thirdArg].
+                ^self value: firstArg value: secondArg].
+        numArgs = 1 ifTrue:
+                [^self value: firstArg].
+        ^self value!

Item was added:
+ ----- Method: FullBlockClosure>>cull:cull:cull:cull: (in category 'evaluating') -----
+ cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg
+        "Activate the receiver, with four or less arguments."
+        <primitive: 207> "Handle the four argument case primitively"
+        numArgs >= 3 ifTrue:
+                [numArgs >= 4 ifTrue:
+                        [^self value: firstArg value: secondArg value: thirdArg value: fourthArg].
+                ^self value: firstArg value: secondArg value: thirdArg].
+        numArgs = 2 ifTrue:
+                [^self value: firstArg value: secondArg].
+        numArgs = 1 ifTrue:
+                [^self value: firstArg].
+        ^self value!

Item was changed:
  ----- Method: FullBlockClosure>>value (in category 'evaluating') -----
  value
         "Activate the receiver, creating a closure activation (MethodContext)
          whose closure is the receiver and whose caller is the sender of this
          message. Supply the copied values to the activation as its copied
          temps. Primitive. Essential."
         <primitive: 207>
-        | newContext |
         numArgs ~= 0 ifTrue:
                 [self numArgsError: 0].
+        ^self primitiveFailed!
-        false
-                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
-                        [newContext := self asContextWithSender: thisContext sender.
-                        thisContext privSender: newContext]
-                ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: FullBlockClosure>>value: (in category 'evaluating') -----
  value: firstArg
         "Activate the receiver, creating a closure activation (MethodContext)
          whose closure is the receiver and whose caller is the sender of this
          message. Supply the argument and copied values to the activation
          as its argument and copied temps. Primitive. Essential."
         <primitive: 207>
-        | newContext |
         numArgs ~= 1 ifTrue:
                 [self numArgsError: 1].
+        ^self primitiveFailed!
-        false
-                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
-                        [newContext := self asContextWithSender: thisContext sender.
-                        newContext at: 1 put: firstArg.
-                        thisContext privSender: newContext]
-                ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: FullBlockClosure>>value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg
         "Activate the receiver, creating a closure activation (MethodContext)
          whose closure is the receiver and whose caller is the sender of this
          message. Supply the arguments and copied values to the activation
          as its arguments and copied temps. Primitive. Essential."
         <primitive: 207>
-        | newContext |
         numArgs ~= 2 ifTrue:
                 [self numArgsError: 2].
+        ^self primitiveFailed!
-        false
-                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
-                        [newContext := self asContextWithSender: thisContext sender.
-                        newContext at: 1 put: firstArg.
-                        newContext at: 2 put: secondArg.
-                        thisContext privSender: newContext]
-                ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: FullBlockClosure>>value:value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg value: thirdArg
         "Activate the receiver, creating a closure activation (MethodContext)
          whose closure is the receiver and whose caller is the sender of this
          message. Supply the arguments and copied values to the activation
          as its arguments and copied temps. Primitive. Essential."
         <primitive: 207>
-        | newContext |
         numArgs ~= 3 ifTrue:
                 [self numArgsError: 3].
+        ^self primitiveFailed!
-        false
-                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
-                        [newContext := self asContextWithSender: thisContext sender.
-                        newContext at: 1 put: firstArg.
-                        newContext at: 2 put: secondArg.
-                        newContext at: 3 put: thirdArg.
-                        thisContext privSender: newContext]
-                ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: FullBlockClosure>>value:value:value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg value: thirdArg value: fourthArg
         "Activate the receiver, creating a closure activation (MethodContext)
          whose closure is the receiver and whose caller is the sender of this
          message. Supply the arguments and copied values to the activation
          as its arguments and copied temps. Primitive. Essential."
         <primitive: 207>
-        | newContext |
         numArgs ~= 4 ifTrue:
                 [self numArgsError: 4].
+        ^self primitiveFailed!
-        false
-                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
-                        [newContext := self asContextWithSender: thisContext sender.
-                        newContext at: 1 put: firstArg.
-                        newContext at: 2 put: secondArg.
-                        newContext at: 3 put: thirdArg.
-                        newContext at: 4 put: fourthArg.
-                        thisContext privSender: newContext]
-                ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: FullBlockClosure>>value:value:value:value:value: (in category 'evaluating') -----
  value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg
         "Activate the receiver, creating a closure activation (MethodContext)
          whose closure is the receiver and whose caller is the sender of this
          message. Supply the arguments and copied values to the activation
          as its arguments and copied temps. Primitive. Essential."
         <primitive: 207>
-        | newContext |
         numArgs ~= 5 ifTrue:
                 [self numArgsError: 5].
+        ^self primitiveFailed!
-        false
-                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
-                        [newContext := self asContextWithSender: thisContext sender.
-                        newContext at: 1 put: firstArg.
-                        newContext at: 2 put: secondArg.
-                        newContext at: 3 put: thirdArg.
-                        newContext at: 4 put: fourthArg.
-                        newContext at: 5 put: fifthArg.
-                        thisContext privSender: newContext]
-                ifFalse: [self primitiveFailed]!

Item was changed:
  ----- Method: FullBlockClosure>>valueWithArguments: (in category 'evaluating') -----
  valueWithArguments: anArray
         "Activate the receiver, creating a closure activation (MethodContext)
          whose closure is the receiver and whose caller is the sender of this
          message. Supply the arguments in an anArray and copied values to
          the activation as its arguments and copied temps. Primitive. Essential."
         <primitive: 208>
-        | newContext |
         numArgs ~= anArray size ifTrue:
                 [self numArgsError: anArray size].
+        ^self primitiveFailed!
-        false
-                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
-                        [newContext := self asContextWithSender: thisContext sender.
-                        1 to: numArgs do:
-                                [:i| newContext at: i put: (anArray at: i)].
-                        thisContext privSender: newContext]
-                ifFalse: [self primitiveFailed]!




Carpe Squeak!
Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Kernel-eem.1355.mcz

Levente Uzonyi
Hi Christoph,

On Thu, 29 Oct 2020, Thiede, Christoph wrote:

>
> Great idea! As a side-effect, there will also be less noise when debugging some block invocation. :-)
>
> Why did you choose numArgs = 2 for the fast lane, was this a random choice only, or did you do some measurements to find out which number of arguments is most commonly passed?

If you mean the comments for primitive 204 and 205 saying "Handle the two
argument case primitively", "two" is just a copy-paste error. The correct
words are "three" and "four", respectively.


Levente

>
>
> Best,
> Christoph
>
> __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
> Von: Squeak-dev <[hidden email]> im Auftrag von [hidden email] <[hidden email]>
> Gesendet: Donnerstag, 29. Oktober 2020 03:13:04
> An: [hidden email]; [hidden email]
> Betreff: [squeak-dev] The Trunk: Kernel-eem.1355.mcz  
> Eliot Miranda uploaded a new version of Kernel to project The Trunk:
> http://source.squeak.org/trunk/Kernel-eem.1355.mcz
>
> ==================== Summary ====================
>
> Name: Kernel-eem.1355
> Author: eem
> Time: 28 October 2020, 6:16:21.972202 pm
> UUID: 14e40036-578b-4645-88e4-77be34a6d96b
> Ancestors: Kernel-eem.1354
>
> Speed-up cull:[cull:*] by supplying the primitive to handle teh case where the number of block arguments matches the number of arguments to cull:[cull:].
> Nuke the obsolete pre-closure simulation code for block closure activation.
>
> =============== Diff against Kernel-eem.1354 ===============
>
> Item was changed:
>   ----- Method: BlockClosure>>cull: (in category 'evaluating') -----
>   cull: firstArg
>          "Activate the receiver, with one or zero arguments."
> +        <primitive: 202> "Handle the one argument case primitively"
> -       
>          numArgs >= 1 ifTrue: [ ^self value: firstArg ].
>          ^self value!
>
> Item was changed:
>   ----- Method: BlockClosure>>cull:cull: (in category 'evaluating') -----
>   cull: firstArg cull: secondArg
>          "Activate the receiver, with two or less arguments."
> +        <primitive: 203> "Handle the two argument case primitively"
> -       
>          numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ].       
>          numArgs = 1 ifTrue: [ ^self value: firstArg ].
>          ^self value!
>
> Item was changed:
>   ----- Method: BlockClosure>>cull:cull:cull: (in category 'evaluating') -----
>   cull: firstArg cull: secondArg cull: thirdArg
>          "Activate the receiver, with three or less arguments."
> +        <primitive: 204> "Handle the two argument case primitively"
> -       
>          numArgs >= 2 ifTrue: [
>                  numArgs >= 3 ifTrue: [ ^self value: firstArg value: secondArg value: thirdArg ].
>                  ^self value: firstArg value: secondArg ].
>          numArgs = 1 ifTrue: [ ^self value: firstArg ].
>          ^self value!
>
> Item was changed:
>   ----- Method: BlockClosure>>cull:cull:cull:cull: (in category 'evaluating') -----
>   cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg
>          "Activate the receiver, with four or less arguments."
> +        <primitive: 205> "Handle the two argument case primitively"
> -       
>          numArgs >= 3 ifTrue: [
>                  numArgs >= 4 ifTrue: [
>                          ^self value: firstArg value: secondArg value: thirdArg value: fourthArg ].
>                  ^self value: firstArg value: secondArg value: thirdArg ].
>          numArgs = 2 ifTrue: [ ^self value: firstArg value: secondArg ].
>          numArgs = 1 ifTrue: [ ^self value: firstArg ].
>          ^self value!
>
> Item was changed:
>   ----- Method: BlockClosure>>value (in category 'evaluating') -----
>   value
>          "Activate the receiver, creating a closure activation (Context)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the copied values to the activation as its copied
>           temps. Primitive. Essential."
>          <primitive: 201>
> -        | newContext |
>          numArgs ~= 0 ifTrue:
>                  [self numArgsError: 0].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: BlockClosure>>value: (in category 'evaluating') -----
>   value: firstArg
>          "Activate the receiver, creating a closure activation (Context)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the argument and copied values to the activation
>           as its argument and copied temps. Primitive. Essential."
>          <primitive: 202>
> -        | newContext |
>          numArgs ~= 1 ifTrue:
>                  [self numArgsError: 1].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: BlockClosure>>value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg
>          "Activate the receiver, creating a closure activation (Context)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 203>
> -        | newContext |
>          numArgs ~= 2 ifTrue:
>                  [self numArgsError: 2].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: BlockClosure>>value:value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg value: thirdArg
>          "Activate the receiver, creating a closure activation (Context)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 204>
> -        | newContext |
>          numArgs ~= 3 ifTrue:
>                  [self numArgsError: 3].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        newContext at: 3 put: thirdArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: BlockClosure>>value:value:value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg value: thirdArg value: fourthArg
>          "Activate the receiver, creating a closure activation (Context)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 205>
> -        | newContext |
>          numArgs ~= 4 ifTrue:
>                  [self numArgsError: 4].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        newContext at: 3 put: thirdArg.
> -                        newContext at: 4 put: fourthArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: BlockClosure>>value:value:value:value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg
>          "Activate the receiver, creating a closure activation (Context)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 205>
> -        | newContext |
>          numArgs ~= 5 ifTrue:
>                  [self numArgsError: 5].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        newContext at: 3 put: thirdArg.
> -                        newContext at: 4 put: fourthArg.
> -                        newContext at: 5 put: fifthArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: BlockClosure>>valueWithArguments: (in category 'evaluating') -----
>   valueWithArguments: anArray
>          "Activate the receiver, creating a closure activation (Context)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments in an anArray and copied values to
>           the activation as its arguments and copied temps. Primitive. Essential."
>          <primitive: 206>
> -        | newContext |
>          numArgs ~= anArray size ifTrue:
>                  [self numArgsError: anArray size].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        1 to: numArgs do:
> -                                [:i| newContext at: i put: (anArray at: i)].
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was added:
> + ----- Method: FullBlockClosure>>cull: (in category 'evaluating') -----
> + cull: firstArg
> +        "Activate the receiver, with one or zero arguments."
> +        <primitive: 207> "Handle the one argument case primitively"
> +        numArgs >= 1 ifTrue: [ ^self value: firstArg ].
> +        ^self value!
>
> Item was added:
> + ----- Method: FullBlockClosure>>cull:cull: (in category 'evaluating') -----
> + cull: firstArg cull: secondArg
> +        "Activate the receiver, with two or less arguments."
> +        <primitive: 207> "Handle the two argument case primitively"
> +        numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ].       
> +        numArgs = 1 ifTrue: [ ^self value: firstArg ].
> +        ^self value!
>
> Item was added:
> + ----- Method: FullBlockClosure>>cull:cull:cull: (in category 'evaluating') -----
> + cull: firstArg cull: secondArg cull: thirdArg
> +        "Activate the receiver, with three or less arguments."
> +        <primitive: 207> "Handle the three argument case primitively"
> +        numArgs >= 2 ifTrue:
> +                [numArgs >= 3 ifTrue:
> +                        [^self value: firstArg value: secondArg value: thirdArg].
> +                ^self value: firstArg value: secondArg].
> +        numArgs = 1 ifTrue:
> +                [^self value: firstArg].
> +        ^self value!
>
> Item was added:
> + ----- Method: FullBlockClosure>>cull:cull:cull:cull: (in category 'evaluating') -----
> + cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg
> +        "Activate the receiver, with four or less arguments."
> +        <primitive: 207> "Handle the four argument case primitively"
> +        numArgs >= 3 ifTrue:
> +                [numArgs >= 4 ifTrue:
> +                        [^self value: firstArg value: secondArg value: thirdArg value: fourthArg].
> +                ^self value: firstArg value: secondArg value: thirdArg].
> +        numArgs = 2 ifTrue:
> +                [^self value: firstArg value: secondArg].
> +        numArgs = 1 ifTrue:
> +                [^self value: firstArg].
> +        ^self value!
>
> Item was changed:
>   ----- Method: FullBlockClosure>>value (in category 'evaluating') -----
>   value
>          "Activate the receiver, creating a closure activation (MethodContext)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the copied values to the activation as its copied
>           temps. Primitive. Essential."
>          <primitive: 207>
> -        | newContext |
>          numArgs ~= 0 ifTrue:
>                  [self numArgsError: 0].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: FullBlockClosure>>value: (in category 'evaluating') -----
>   value: firstArg
>          "Activate the receiver, creating a closure activation (MethodContext)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the argument and copied values to the activation
>           as its argument and copied temps. Primitive. Essential."
>          <primitive: 207>
> -        | newContext |
>          numArgs ~= 1 ifTrue:
>                  [self numArgsError: 1].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: FullBlockClosure>>value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg
>          "Activate the receiver, creating a closure activation (MethodContext)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 207>
> -        | newContext |
>          numArgs ~= 2 ifTrue:
>                  [self numArgsError: 2].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: FullBlockClosure>>value:value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg value: thirdArg
>          "Activate the receiver, creating a closure activation (MethodContext)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 207>
> -        | newContext |
>          numArgs ~= 3 ifTrue:
>                  [self numArgsError: 3].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        newContext at: 3 put: thirdArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: FullBlockClosure>>value:value:value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg value: thirdArg value: fourthArg
>          "Activate the receiver, creating a closure activation (MethodContext)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 207>
> -        | newContext |
>          numArgs ~= 4 ifTrue:
>                  [self numArgsError: 4].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        newContext at: 3 put: thirdArg.
> -                        newContext at: 4 put: fourthArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: FullBlockClosure>>value:value:value:value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg
>          "Activate the receiver, creating a closure activation (MethodContext)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 207>
> -        | newContext |
>          numArgs ~= 5 ifTrue:
>                  [self numArgsError: 5].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        newContext at: 3 put: thirdArg.
> -                        newContext at: 4 put: fourthArg.
> -                        newContext at: 5 put: fifthArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: FullBlockClosure>>valueWithArguments: (in category 'evaluating') -----
>   valueWithArguments: anArray
>          "Activate the receiver, creating a closure activation (MethodContext)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments in an anArray and copied values to
>           the activation as its arguments and copied temps. Primitive. Essential."
>          <primitive: 208>
> -        | newContext |
>          numArgs ~= anArray size ifTrue:
>                  [self numArgsError: anArray size].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        1 to: numArgs do:
> -                                [:i| newContext at: i put: (anArray at: i)].
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
>
>
>

Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Kernel-eem.1355.mcz

Christoph Thiede

Alright. :-) Still, might it be an optimization to try with a smaller number of arguments first? I don't know which case occurs more commonly.


Best,

Christoph


Von: Squeak-dev <[hidden email]> im Auftrag von Levente Uzonyi <[hidden email]>
Gesendet: Donnerstag, 29. Oktober 2020 14:24:49
An: The general-purpose Squeak developers list
Cc: [hidden email]
Betreff: Re: [squeak-dev] The Trunk: Kernel-eem.1355.mcz
 
Hi Christoph,

On Thu, 29 Oct 2020, Thiede, Christoph wrote:

>
> Great idea! As a side-effect, there will also be less noise when debugging some block invocation. :-)
>
> Why did you choose numArgs = 2 for the fast lane, was this a random choice only, or did you do some measurements to find out which number of arguments is most commonly passed?

If you mean the comments for primitive 204 and 205 saying "Handle the two
argument case primitively", "two" is just a copy-paste error. The correct
words are "three" and "four", respectively.


Levente

>
>
> Best,
> Christoph
>
> __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
> Von: Squeak-dev <[hidden email]> im Auftrag von [hidden email] <[hidden email]>
> Gesendet: Donnerstag, 29. Oktober 2020 03:13:04
> An: [hidden email]; [hidden email]
> Betreff: [squeak-dev] The Trunk: Kernel-eem.1355.mcz  
> Eliot Miranda uploaded a new version of Kernel to project The Trunk:
> http://source.squeak.org/trunk/Kernel-eem.1355.mcz
>
> ==================== Summary ====================
>
> Name: Kernel-eem.1355
> Author: eem
> Time: 28 October 2020, 6:16:21.972202 pm
> UUID: 14e40036-578b-4645-88e4-77be34a6d96b
> Ancestors: Kernel-eem.1354
>
> Speed-up cull:[cull:*] by supplying the primitive to handle teh case where the number of block arguments matches the number of arguments to cull:[cull:].
> Nuke the obsolete pre-closure simulation code for block closure activation.
>
> =============== Diff against Kernel-eem.1354 ===============
>
> Item was changed:
>   ----- Method: BlockClosure>>cull: (in category 'evaluating') -----
>   cull: firstArg
>          "Activate the receiver, with one or zero arguments."
> +        <primitive: 202> "Handle the one argument case primitively"
> -       
>          numArgs >= 1 ifTrue: [ ^self value: firstArg ].
>          ^self value!
>
> Item was changed:
>   ----- Method: BlockClosure>>cull:cull: (in category 'evaluating') -----
>   cull: firstArg cull: secondArg
>          "Activate the receiver, with two or less arguments."
> +        <primitive: 203> "Handle the two argument case primitively"
> -       
>          numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ].       
>          numArgs = 1 ifTrue: [ ^self value: firstArg ].
>          ^self value!
>
> Item was changed:
>   ----- Method: BlockClosure>>cull:cull:cull: (in category 'evaluating') -----
>   cull: firstArg cull: secondArg cull: thirdArg
>          "Activate the receiver, with three or less arguments."
> +        <primitive: 204> "Handle the two argument case primitively"
> -       
>          numArgs >= 2 ifTrue: [
>                  numArgs >= 3 ifTrue: [ ^self value: firstArg value: secondArg value: thirdArg ].
>                  ^self value: firstArg value: secondArg ].
>          numArgs = 1 ifTrue: [ ^self value: firstArg ].
>          ^self value!
>
> Item was changed:
>   ----- Method: BlockClosure>>cull:cull:cull:cull: (in category 'evaluating') -----
>   cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg
>          "Activate the receiver, with four or less arguments."
> +        <primitive: 205> "Handle the two argument case primitively"
> -       
>          numArgs >= 3 ifTrue: [
>                  numArgs >= 4 ifTrue: [
>                          ^self value: firstArg value: secondArg value: thirdArg value: fourthArg ].
>                  ^self value: firstArg value: secondArg value: thirdArg ].
>          numArgs = 2 ifTrue: [ ^self value: firstArg value: secondArg ].
>          numArgs = 1 ifTrue: [ ^self value: firstArg ].
>          ^self value!
>
> Item was changed:
>   ----- Method: BlockClosure>>value (in category 'evaluating') -----
>   value
>          "Activate the receiver, creating a closure activation (Context)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the copied values to the activation as its copied
>           temps. Primitive. Essential."
>          <primitive: 201>
> -        | newContext |
>          numArgs ~= 0 ifTrue:
>                  [self numArgsError: 0].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: BlockClosure>>value: (in category 'evaluating') -----
>   value: firstArg
>          "Activate the receiver, creating a closure activation (Context)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the argument and copied values to the activation
>           as its argument and copied temps. Primitive. Essential."
>          <primitive: 202>
> -        | newContext |
>          numArgs ~= 1 ifTrue:
>                  [self numArgsError: 1].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: BlockClosure>>value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg
>          "Activate the receiver, creating a closure activation (Context)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 203>
> -        | newContext |
>          numArgs ~= 2 ifTrue:
>                  [self numArgsError: 2].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: BlockClosure>>value:value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg value: thirdArg
>          "Activate the receiver, creating a closure activation (Context)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 204>
> -        | newContext |
>          numArgs ~= 3 ifTrue:
>                  [self numArgsError: 3].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        newContext at: 3 put: thirdArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: BlockClosure>>value:value:value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg value: thirdArg value: fourthArg
>          "Activate the receiver, creating a closure activation (Context)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 205>
> -        | newContext |
>          numArgs ~= 4 ifTrue:
>                  [self numArgsError: 4].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        newContext at: 3 put: thirdArg.
> -                        newContext at: 4 put: fourthArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: BlockClosure>>value:value:value:value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg
>          "Activate the receiver, creating a closure activation (Context)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 205>
> -        | newContext |
>          numArgs ~= 5 ifTrue:
>                  [self numArgsError: 5].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        newContext at: 3 put: thirdArg.
> -                        newContext at: 4 put: fourthArg.
> -                        newContext at: 5 put: fifthArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: BlockClosure>>valueWithArguments: (in category 'evaluating') -----
>   valueWithArguments: anArray
>          "Activate the receiver, creating a closure activation (Context)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments in an anArray and copied values to
>           the activation as its arguments and copied temps. Primitive. Essential."
>          <primitive: 206>
> -        | newContext |
>          numArgs ~= anArray size ifTrue:
>                  [self numArgsError: anArray size].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        1 to: numArgs do:
> -                                [:i| newContext at: i put: (anArray at: i)].
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was added:
> + ----- Method: FullBlockClosure>>cull: (in category 'evaluating') -----
> + cull: firstArg
> +        "Activate the receiver, with one or zero arguments."
> +        <primitive: 207> "Handle the one argument case primitively"
> +        numArgs >= 1 ifTrue: [ ^self value: firstArg ].
> +        ^self value!
>
> Item was added:
> + ----- Method: FullBlockClosure>>cull:cull: (in category 'evaluating') -----
> + cull: firstArg cull: secondArg
> +        "Activate the receiver, with two or less arguments."
> +        <primitive: 207> "Handle the two argument case primitively"
> +        numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ].       
> +        numArgs = 1 ifTrue: [ ^self value: firstArg ].
> +        ^self value!
>
> Item was added:
> + ----- Method: FullBlockClosure>>cull:cull:cull: (in category 'evaluating') -----
> + cull: firstArg cull: secondArg cull: thirdArg
> +        "Activate the receiver, with three or less arguments."
> +        <primitive: 207> "Handle the three argument case primitively"
> +        numArgs >= 2 ifTrue:
> +                [numArgs >= 3 ifTrue:
> +                        [^self value: firstArg value: secondArg value: thirdArg].
> +                ^self value: firstArg value: secondArg].
> +        numArgs = 1 ifTrue:
> +                [^self value: firstArg].
> +        ^self value!
>
> Item was added:
> + ----- Method: FullBlockClosure>>cull:cull:cull:cull: (in category 'evaluating') -----
> + cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg
> +        "Activate the receiver, with four or less arguments."
> +        <primitive: 207> "Handle the four argument case primitively"
> +        numArgs >= 3 ifTrue:
> +                [numArgs >= 4 ifTrue:
> +                        [^self value: firstArg value: secondArg value: thirdArg value: fourthArg].
> +                ^self value: firstArg value: secondArg value: thirdArg].
> +        numArgs = 2 ifTrue:
> +                [^self value: firstArg value: secondArg].
> +        numArgs = 1 ifTrue:
> +                [^self value: firstArg].
> +        ^self value!
>
> Item was changed:
>   ----- Method: FullBlockClosure>>value (in category 'evaluating') -----
>   value
>          "Activate the receiver, creating a closure activation (MethodContext)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the copied values to the activation as its copied
>           temps. Primitive. Essential."
>          <primitive: 207>
> -        | newContext |
>          numArgs ~= 0 ifTrue:
>                  [self numArgsError: 0].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: FullBlockClosure>>value: (in category 'evaluating') -----
>   value: firstArg
>          "Activate the receiver, creating a closure activation (MethodContext)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the argument and copied values to the activation
>           as its argument and copied temps. Primitive. Essential."
>          <primitive: 207>
> -        | newContext |
>          numArgs ~= 1 ifTrue:
>                  [self numArgsError: 1].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: FullBlockClosure>>value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg
>          "Activate the receiver, creating a closure activation (MethodContext)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 207>
> -        | newContext |
>          numArgs ~= 2 ifTrue:
>                  [self numArgsError: 2].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: FullBlockClosure>>value:value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg value: thirdArg
>          "Activate the receiver, creating a closure activation (MethodContext)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 207>
> -        | newContext |
>          numArgs ~= 3 ifTrue:
>                  [self numArgsError: 3].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        newContext at: 3 put: thirdArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: FullBlockClosure>>value:value:value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg value: thirdArg value: fourthArg
>          "Activate the receiver, creating a closure activation (MethodContext)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 207>
> -        | newContext |
>          numArgs ~= 4 ifTrue:
>                  [self numArgsError: 4].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        newContext at: 3 put: thirdArg.
> -                        newContext at: 4 put: fourthArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: FullBlockClosure>>value:value:value:value:value: (in category 'evaluating') -----
>   value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg
>          "Activate the receiver, creating a closure activation (MethodContext)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments and copied values to the activation
>           as its arguments and copied temps. Primitive. Essential."
>          <primitive: 207>
> -        | newContext |
>          numArgs ~= 5 ifTrue:
>                  [self numArgsError: 5].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        newContext at: 1 put: firstArg.
> -                        newContext at: 2 put: secondArg.
> -                        newContext at: 3 put: thirdArg.
> -                        newContext at: 4 put: fourthArg.
> -                        newContext at: 5 put: fifthArg.
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
> Item was changed:
>   ----- Method: FullBlockClosure>>valueWithArguments: (in category 'evaluating') -----
>   valueWithArguments: anArray
>          "Activate the receiver, creating a closure activation (MethodContext)
>           whose closure is the receiver and whose caller is the sender of this
>           message. Supply the arguments in an anArray and copied values to
>           the activation as its arguments and copied temps. Primitive. Essential."
>          <primitive: 208>
> -        | newContext |
>          numArgs ~= anArray size ifTrue:
>                  [self numArgsError: anArray size].
> +        ^self primitiveFailed!
> -        false
> -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it."
> -                        [newContext := self asContextWithSender: thisContext sender.
> -                        1 to: numArgs do:
> -                                [:i| newContext at: i put: (anArray at: i)].
> -                        thisContext privSender: newContext]
> -                ifFalse: [self primitiveFailed]!
>
>
>
>


Carpe Squeak!