Skip to content

Commit

Permalink
Mutant pharo-project#18, Installing [ Replace #= with #'~=' ] on meth…
Browse files Browse the repository at this point in the history
…od [ isValidObjStackPage:myIndex:firstPage: ]
  • Loading branch information
hogoww committed Dec 28, 2021
1 parent b484cc0 commit 2c9464f
Showing 1 changed file with 58 additions and 44 deletions.
102 changes: 58 additions & 44 deletions smalltalksrc/VMMaker/SpurMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -7622,53 +7622,67 @@ SpurMemoryManager >> isValidObjStackPage: objStackPage myIndex: myx [
{ #category : #'obj stacks' }
SpurMemoryManager >> isValidObjStackPage: objStackPage myIndex: myx firstPage: isFirstPage [
"Answer if the obj stack at stackRootIndex is valid."
| page freeOrNextPage index |
<inline: false>
(self isValidObjStackPage: objStackPage myIndex: myx) ifFalse:
[^false].
freeOrNextPage := self fetchPointer: ObjStackFreex ofObject: objStackPage.
[freeOrNextPage ~= 0] whileTrue:
[isFirstPage ifFalse:
[objStackInvalidBecause := 'free page on other than first page'.
invalidObjStackPage := objStackPage.
^false].
freeOrNextPage = (self fetchPointer: ObjStackNextx ofObject: objStackPage) ifTrue:
[objStackInvalidBecause := 'free page = next page'.
invalidObjStackPage := freeOrNextPage.
^false].
(self isValidObjStackPage: freeOrNextPage myIndex: myx) ifFalse:
[objStackInvalidBecause := self stretch: objStackInvalidBecause cat: ', on next page'.
^false].
page := self fetchPointer: ObjStackFreex ofObject: freeOrNextPage.
(page = freeOrNextPage
or: [page = objStackPage]) ifTrue:
[objStackInvalidBecause := 'circularity in free page list'.
invalidObjStackPage := page.
^false].
freeOrNextPage := page].
isFirstPage ifTrue:
[(myx between: self classTableRootSlots and: self classTableRootSlots + self hiddenRootSlots - 1) ifFalse:
[objStackInvalidBecause := 'myx out of range'.
invalidObjStackPage := objStackPage.
^false].
(self fetchPointer: myx ofObject: hiddenRootsObj) = objStackPage ifFalse:
[objStackInvalidBecause := 'firstPage is not root'.
invalidObjStackPage := objStackPage.
^false]].
| page freeOrNextPage index |
(self isValidObjStackPage: objStackPage myIndex: myx) ifFalse: [
^ false ].
freeOrNextPage := self
fetchPointer: ObjStackFreex
ofObject: objStackPage.
[ freeOrNextPage ~= 0 ] whileTrue: [
isFirstPage ifFalse: [
objStackInvalidBecause := 'free page on other than first page'.
invalidObjStackPage := objStackPage.
^ false ].
freeOrNextPage
= (self fetchPointer: ObjStackNextx ofObject: objStackPage) ifTrue: [
objStackInvalidBecause := 'free page = next page'.
invalidObjStackPage := freeOrNextPage.
^ false ].
(self isValidObjStackPage: freeOrNextPage myIndex: myx) ifFalse: [
objStackInvalidBecause := self
stretch: objStackInvalidBecause
cat: ', on next page'.
^ false ].
page := self fetchPointer: ObjStackFreex ofObject: freeOrNextPage.
(page = freeOrNextPage or: [ page = objStackPage ]) ifTrue: [
objStackInvalidBecause := 'circularity in free page list'.
invalidObjStackPage := page.
^ false ].
freeOrNextPage := page ].
isFirstPage ifTrue: [
(myx
between: self classTableRootSlots
and: self classTableRootSlots + self hiddenRootSlots - 1)
ifFalse: [
objStackInvalidBecause := 'myx out of range'.
invalidObjStackPage := objStackPage.
^ false ].
(self fetchPointer: myx ofObject: hiddenRootsObj) ~= objStackPage
ifFalse: [
objStackInvalidBecause := 'firstPage is not root'.
invalidObjStackPage := objStackPage.
^ false ] ].
index := self fetchPointer: ObjStackTopx ofObject: objStackPage.
(index between: 0 and: ObjStackLimit) ifFalse:
[objStackInvalidBecause := 'bad topx'.
invalidObjStackPage := objStackPage.
^false].
freeOrNextPage := self fetchPointer: ObjStackNextx ofObject: objStackPage.
freeOrNextPage = 0 ifTrue:
[^true].
freeOrNextPage = objStackPage ifTrue:
[objStackInvalidBecause := 'circularity in objStack page list'.
invalidObjStackPage := objStackPage.
^false].
^self isValidObjStackPage: freeOrNextPage myIndex: myx firstPage: false
(index between: 0 and: ObjStackLimit) ifFalse: [
objStackInvalidBecause := 'bad topx'.
invalidObjStackPage := objStackPage.
^ false ].
freeOrNextPage := self
fetchPointer: ObjStackNextx
ofObject: objStackPage.
freeOrNextPage = 0 ifTrue: [ ^ true ].
freeOrNextPage = objStackPage ifTrue: [
objStackInvalidBecause := 'circularity in objStack page list'.
invalidObjStackPage := objStackPage.
^ false ].
^ self
isValidObjStackPage: freeOrNextPage
myIndex: myx
firstPage: false
]
{ #category : #'object testing' }
Expand Down

0 comments on commit 2c9464f

Please sign in to comment.