-
Notifications
You must be signed in to change notification settings - Fork 65
/
CogImageFileHeader.class.st
126 lines (94 loc) · 4.35 KB
/
CogImageFileHeader.class.st
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
"
CogImageFileHeader is an extension of ImageFileHeader with additional fields that are used by Cog and Stack VMs. Some of the additional fields are encoded as short short integers, which are 16 bits when the header word size is 32, and 32 bits when the header word size is 64. All current Cog VMs use 32 bit word size with 16 bit short integer fields.
"
Class {
#name : #CogImageFileHeader,
#superclass : #ImageFileHeader,
#instVars : [
'desiredNumStackPages',
'unknownShortOrCodeSizeInKs',
'desiredEdenBytes',
'maxExtSemTabSizeSet'
],
#category : #'ImageFormat-Header'
}
{ #category : #accessing }
CogImageFileHeader >> desiredEdenBytes [
^ desiredEdenBytes
]
{ #category : #accessing }
CogImageFileHeader >> desiredEdenBytes: anInteger [
desiredEdenBytes := anInteger
]
{ #category : #accessing }
CogImageFileHeader >> desiredNumStackPages [
^ desiredNumStackPages
]
{ #category : #accessing }
CogImageFileHeader >> desiredNumStackPages: anInteger [
desiredNumStackPages := anInteger
]
{ #category : #reading }
CogImageFileHeader >> fromEntryStream: streamOfHeaderStateObjects [
super fromEntryStream: streamOfHeaderStateObjects.
desiredNumStackPages := streamOfHeaderStateObjects next.
unknownShortOrCodeSizeInKs := streamOfHeaderStateObjects next.
desiredEdenBytes := streamOfHeaderStateObjects next.
maxExtSemTabSizeSet := streamOfHeaderStateObjects next.
]
{ #category : #accessing }
CogImageFileHeader >> maxExtSemTabSizeSet [
^ maxExtSemTabSizeSet
]
{ #category : #accessing }
CogImageFileHeader >> maxExtSemTabSizeSet: anInteger [
maxExtSemTabSizeSet := anInteger
]
{ #category : #reading }
CogImageFileHeader >> readFieldsFrom: aStream startingAt: imageOffset headerWordSize: headerWordSize littleEndian: littleEndian into: aCollection [
"Read data fields and answer number of bytes read"
| remainder bytesRead |
bytesRead := super readFieldsFrom: aStream startingAt: imageOffset headerWordSize: headerWordSize littleEndian: littleEndian into: aCollection.
aCollection add: (self nextNumber: headerWordSize / 2 from: aStream littleEndian: littleEndian). "desiredNumStackPages"
aCollection add: (self nextNumber: headerWordSize / 2 from: aStream littleEndian: littleEndian). "unknownShortOrCodeSizeInKs"
aCollection add: (self nextNumber: headerWordSize from: aStream littleEndian: littleEndian). "desiredEdenBytes"
aCollection add: (self nextNumber: headerWordSize / 2 from: aStream littleEndian: littleEndian). "maxExtSemTabSizeSet"
self nextNumber: headerWordSize / 2 from: aStream littleEndian: littleEndian.
remainder := headerSize - (12 * imageFormat wordSize).
self assert: remainder >= 0. "n.b. Mantis 7455 bug in original 64 bit image due to VMM error"
^3 * imageFormat wordSize + bytesRead.
]
{ #category : #printing }
CogImageFileHeader >> storeOn: aStream [
"Append to the argument aStream a sequence of characters that is an
expression whose evaluation creates an object similar to the receiver."
super storeOn: aStream.
aStream nextPutAll: '; desiredNumStackPages: '.
desiredNumStackPages storeOn: aStream.
aStream nextPutAll: '; unknownShortOrCodeSizeInKs: '.
unknownShortOrCodeSizeInKs storeOn: aStream.
aStream nextPutAll: '; desiredEdenBytes: '.
desiredEdenBytes storeOn: aStream.
aStream nextPutAll: '; maxExtSemTabSizeSet: '.
maxExtSemTabSizeSet storeOn: aStream.
]
{ #category : #accessing }
CogImageFileHeader >> unknownShortOrCodeSizeInKs [
^ unknownShortOrCodeSizeInKs
]
{ #category : #accessing }
CogImageFileHeader >> unknownShortOrCodeSizeInKs: anInteger [
unknownShortOrCodeSizeInKs := anInteger
]
{ #category : #writing }
CogImageFileHeader >> writeFieldsTo: aStream littleEndian: littleEnder headerWordSize: headerWordSize [
"Write data fields and answer number of bytes written"
| bytesWritten |
bytesWritten := super writeFieldsTo: aStream littleEndian: littleEnder headerWordSize: headerWordSize.
self nextNumber: headerWordSize / 2 put: desiredNumStackPages to: aStream littleEndian: littleEnder.
self nextNumber: headerWordSize / 2 put: unknownShortOrCodeSizeInKs to: aStream littleEndian: littleEnder.
self nextNumber: headerWordSize put: desiredEdenBytes to: aStream littleEndian: littleEnder.
self nextNumber: headerWordSize / 2 put: maxExtSemTabSizeSet to: aStream littleEndian: littleEnder.
self nextNumber: headerWordSize / 2 put: 0 to: aStream littleEndian: littleEnder.
^3 * imageFormat wordSize + bytesWritten.
]