[squeak-dev] The Inbox: Kernel-jar.1503.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Feb 15 16:20:19 UTC 2023
A new version of Kernel was added to project The Inbox:
http://source.squeak.org/inbox/Kernel-jar.1503.mcz
==================== Summary ====================
Name: Kernel-jar.1503
Author: jar
Time: 15 February 2023, 5:20:15.299287 pm
UUID: 63fd8775-0f3d-7f49-93f3-a116e9fbb3d5
Ancestors: Kernel-eem.1498
remove unwind code duplication and fix the "stepOver bug" (Cannot #stepOver '^2' in example '[^2] ensure: []')
See http://lists.squeakfoundation.org/pipermail/squeak-dev/2023-February/223443.html for detailed explanation
=============== Diff against Kernel-eem.1498 ===============
Item was changed:
----- Method: Context>>restart (in category 'controlling') -----
restart
"Unwind thisContext to self and resume from beginning. Execute unwind blocks when unwinding. ASSUMES self is a sender of thisContext"
+ ^self resumeEvaluating: [self privRefresh]!
- | ctxt unwindBlock |
- self isDead ifTrue: [self cannotReturn: nil to: self].
- self privRefresh.
- ctxt := thisContext.
- [ ctxt := ctxt findNextUnwindContextUpTo: self.
- ctxt isNil
- ] whileFalse: [
- (ctxt tempAt: 2) ifNil:[
- ctxt tempAt: 2 put: true.
- unwindBlock := ctxt tempAt: 1.
- thisContext terminateTo: ctxt.
- unwindBlock value].
- ].
- thisContext terminateTo: self.
- self jump.
- !
Item was changed:
----- Method: Context>>resume:through: (in category 'controlling') -----
resume: value through: firstUnwindCtxt
"Unwind thisContext to self and resume with value as result of last send.
Execute any unwind blocks while unwinding.
ASSUMES self is a sender of thisContext."
+ ^self resumeEvaluating: [value] through: firstUnwindCtxt!
- | ctxt unwindBlock |
- self isDead ifTrue: [self cannotReturn: value to: self].
- ctxt := firstUnwindCtxt.
- [ctxt isNil] whileFalse:
- [(ctxt tempAt: 2) ifNil:
- [ctxt tempAt: 2 put: true.
- unwindBlock := ctxt tempAt: 1.
- thisContext terminateTo: ctxt.
- unwindBlock value].
- ctxt := ctxt findNextUnwindContextUpTo: self].
- thisContext terminateTo: self.
- ^value
- !
Item was changed:
----- Method: Context>>resumeEvaluating: (in category 'controlling') -----
resumeEvaluating: aBlock
"Unwind thisContext to self and resume with value as result of last send.
Execute unwind blocks when unwinding.
ASSUMES self is a sender of thisContext"
+ ^self resumeEvaluating: aBlock through: nil!
- | ctxt unwindBlock |
- self isDead ifTrue: [self cannotReturn: aBlock value to: self].
- ctxt := thisContext.
- [ ctxt := ctxt findNextUnwindContextUpTo: self.
- ctxt isNil
- ] whileFalse: [
- (ctxt tempAt: 2) ifNil:[
- "(tempAt: 2) refers to complete temporary in ensure: and ifCurtailed:
- or any other method marked with <primitive: 198>"
- ctxt tempAt: 2 put: true.
- unwindBlock := ctxt tempAt: 1.
- thisContext terminateTo: ctxt.
- unwindBlock value].
- ].
- thisContext terminateTo: self.
- ^ aBlock value
- !
Item was added:
+ ----- Method: Context>>resumeEvaluating:through: (in category 'controlling') -----
+ resumeEvaluating: aBlock through: firstUnwindCtxtOrNil
+ "Unwind thisContext to self and resume with value as result of last send.
+ Execute unwind blocks when unwinding.
+ ASSUMES self is a sender of thisContext."
+
+ self isDead ifTrue: [self cannotReturn: aBlock value to: self].
+ (firstUnwindCtxtOrNil ifNil: thisContext) unwindTo: self safely: false.
+ thisContext terminateTo: self.
+ ^aBlock value!
Item was changed:
----- Method: Context>>return:from: (in category 'instruction decoding') -----
return: value from: aSender
"For simulation. Roll back self to aSender and return value from it. Execute any unwind blocks on the way. ASSUMES aSender is a sender of self"
| newTop |
aSender isDead ifTrue:
[^self send: #cannotReturn: to: self with: {value}].
newTop := aSender sender.
(self findNextUnwindContextUpTo: newTop) ifNotNil:
+ "Send #aboutToReturn:through: with nil as the second argument to avoid this bug:
+ Cannot #stepOver '^2' in example '[^2] ensure: []'.
- [:unwindProtectCtxt|
- self flag: #knownBug. "Cannot #stepOver '^2' in example '[^2] ensure: []'.
See http://lists.squeakfoundation.org/pipermail/squeak-dev/2022-June/220975.html"
+ [^self send: #aboutToReturn:through: to: self with: {value. nil}].
- ^self send: #aboutToReturn:through: to: self with: {value. unwindProtectCtxt}].
self releaseTo: newTop.
newTop ifNotNil: [newTop push: value].
^newTop!
More information about the Squeak-dev
mailing list
|