author | Tony Garnock-Jones <tonygarnockjones@gmail.com> |
Wed, 16 Jan 2019 17:15:58 +0000 | |
changeset 438 | 1fe179d53161 |
parent 374 | 533e87a8b4b1 |
permissions | -rw-r--r-- |
374
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
1 |
EVAL Class addNewClass: (Object subclass: 'Scavenger' variables: 'worklist fillPointer readPointer' classVariables: '') |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
2 |
META Scavenger |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
3 |
new |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
4 |
^ super new initialize |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
5 |
! |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
6 |
METHOD Scavenger |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
7 |
initialize |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
8 |
worklist <- Array new: 10000. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
9 |
fillPointer <- 2. "simulates having already scheduled nil" |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
10 |
readPointer <- 1. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
11 |
! |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
12 |
METHOD Scavenger |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
13 |
schedule: anObject |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
14 |
| c | |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
15 |
c <- <2 anObject>. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
16 |
c == SmallInt ifTrue: [ ^self ]. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
17 |
c == ByteArray ifTrue: [ ^self ]. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
18 |
c == String ifTrue: [ ^self ]. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
19 |
(self hasSeen: anObject) ifTrue: [ ^self ]. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
20 |
worklist at: fillPointer put: anObject. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
21 |
fillPointer <- fillPointer + 1. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
22 |
! |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
23 |
METHOD Scavenger |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
24 |
hasSeen: anObject |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
25 |
1 to: (fillPointer - 1) do: [:i | ((worklist at: i) == anObject) ifTrue: [ ^true ]]. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
26 |
^ false |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
27 |
! |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
28 |
METHOD Scavenger |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
29 |
findAllClasses |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
30 |
"self schedule: nil." "see Scavenger >> initialize" |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
31 |
self schedule: true. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
32 |
self schedule: false. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
33 |
self schedule: Array. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
34 |
self schedule: Block. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
35 |
self schedule: Context. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
36 |
self schedule: SmallInt. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
37 |
self schedule: 'hello world'. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
38 |
[ readPointer < fillPointer ] whileTrue: [ |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
39 |
self scavenge: (worklist at: readPointer). |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
40 |
readPointer <- readPointer + 1 ]. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
41 |
Transcript show: 'Total objects scanned = ' + (fillPointer - 1). |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
42 |
! |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
43 |
METHOD Scavenger |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
44 |
scavenge: anObject |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
45 |
| c slotCount | |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
46 |
c <- <2 anObject>. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
47 |
(c class == Class) ifTrue: [ |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
48 |
Transcript show: 'Found classlike: ' + anObject printString. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
49 |
(Class classes includes: anObject) ifFalse: [Class addNewClass: anObject]. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
50 |
]. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
51 |
self schedule: c. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
52 |
slotCount <- <4 anObject>. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
53 |
1 to: slotCount do: [:i | self schedule: (Object in: anObject at: i)]. |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
54 |
! |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
55 |
EVAL Scavenger new findAllClasses |
533e87a8b4b1
scan-image-for-all-classes.st, plus image updated using it
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
56 |
EVAL Class removeClass: Scavenger |