[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