[Vm-dev] VM Maker: ImageFormat-dtl.33.mcz

commits at source.squeak.org commits at source.squeak.org
Sun Feb 10 23:07:35 UTC 2019


David T. Lewis uploaded a new version of ImageFormat to project VM Maker:
http://source.squeak.org/VMMaker/ImageFormat-dtl.33.mcz

==================== Summary ====================

Name: ImageFormat-dtl.33
Author: dtl
Time: 10 February 2019, 6:07:34.977 pm
UUID: 4003ca6e-3b44-46e4-9c98-55b3ec8e3901
Ancestors: ImageFormat-dtl.31

Refactor instance creation to allow image header instances to be created from a stream or array of header field values in addition to the traditional read from file stream on the image file. Add hooks for hypothetical primitives to answer header filelds directly from the VM.

=============== Diff against ImageFormat-dtl.31 ===============

Item was added:
+ ----- Method: CogImageFileHeader>>fromEntryStream: (in category 'reading') -----
+ fromEntryStream: streamOfHeaderStateObjects
+ 
+ 	super fromEntryStream: streamOfHeaderStateObjects.
+ 	desiredNumStackPages := streamOfHeaderStateObjects next.
+ 	unknownShortOrCodeSizeInKs := streamOfHeaderStateObjects next.
+ 	desiredEdenBytes := streamOfHeaderStateObjects next.
+ 	maxExtSemTabSizeSet := streamOfHeaderStateObjects next.
+ !

Item was removed:
- ----- Method: CogImageFileHeader>>readFieldsFrom:startingAt:headerWordSize:littleEndian: (in category 'reading') -----
- readFieldsFrom: aStream startingAt: imageOffset headerWordSize: headerWordSize littleEndian: littleEndian
- 	"Read data fields and answer number of bytes read"
- 
- 	| remainder bytesRead |
- 	bytesRead := super readFieldsFrom: aStream startingAt: imageOffset headerWordSize: headerWordSize littleEndian: littleEndian.
- 	desiredNumStackPages := self nextNumber: headerWordSize / 2 from: aStream littleEndian: littleEndian.
- 	unknownShortOrCodeSizeInKs := self nextNumber: headerWordSize / 2 from: aStream littleEndian: littleEndian.
- 	desiredEdenBytes := self nextNumber: headerWordSize from: aStream littleEndian: littleEndian.
- 	maxExtSemTabSizeSet := self nextNumber: headerWordSize / 2 from: aStream littleEndian: littleEndian.
- 	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.
- !

Item was added:
+ ----- Method: CogImageFileHeader>>readFieldsFrom:startingAt:headerWordSize:littleEndian:into: (in category 'reading') -----
+ 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.
+ !

Item was added:
+ ----- Method: ImageFileHeader class>>fromValues: (in category 'instance creation') -----
+ fromValues: headerValues
+ 	"Answer an new instance initialized from an array of  values corresponding to
+ 	fields in an image file header on disk. The values may have been read from a
+ 	file, or they may have been created by querying the running VM."
+ 
+ 	"self fromValues:self primInterpreterStateSnapshot"
+ 
+ 	^self basicNew fromEntryStream: headerValues readStream
+ !

Item was added:
+ ----- Method: ImageFileHeader class>>primInterpreterStateSnapshot (in category 'primitive access') -----
+ primInterpreterStateSnapshot
+ 	"Answer an array of values suitable for creating an image file header"
+ 
+ 	"ImageFileHeader primInterpreterStateSnapshot"
+ 
+ 	"ImageFileHeader fromValues: ImageFileHeader primInterpreterStateSnapshot"
+ 
+ 	<primitive: 'primitiveInterpreterStateSnapshot'>
+ 	self primitiveFailed!

Item was added:
+ ----- Method: ImageFileHeader class>>primMemoryCopy (in category 'primitive access') -----
+ primMemoryCopy
+ 	"Answer an exact copy of the current object memory"
+ 
+ 	"ImageFileHeader primMemoryCopy"
+ 
+ 	<primitive: 'primitiveMemoryCopy'>
+ 	self primitiveFailed!

Item was added:
+ ----- Method: ImageFileHeader class>>primMemorySnapshotWithHeader (in category 'primitive access') -----
+ primMemorySnapshotWithHeader
+ 	"Answer an array with a snapshot of the object memory, and with an interpreter
+ 	state array of values suitable for creating an image file header. This is an atomic
+ 	request for primitiveMemorySnapshot and primitiveInterpreterStateSnapshot."
+ 
+ 	"ImageFileHeader primMemorySnapshotWithHeader"
+ 
+ 	" | result |
+ 	result := ImageFileHeader primMemorySnapshotWithHeader.
+ 	{ result first . ImageFileHeader fromValues: result second } "
+ 
+ 	<primitive: 'primitiveMemorySnapshotWithHeader'>
+ 	self primitiveFailed!

Item was changed:
  ----- Method: ImageFileHeader class>>readFrom: (in category 'instance creation') -----
  readFrom: aStream
  
  	^self readFrom: aStream startingAt: 0!

Item was changed:
  ----- Method: ImageFileHeader class>>readFrom:startingAt: (in category 'instance creation') -----
  readFrom: aStream startingAt: imageOffset
  
+ 	^self basicNew readFrom: aStream startingAt: imageOffset into: OrderedCollection new!
- 	^self basicNew readFrom: aStream startingAt: imageOffset!

Item was added:
+ ----- Method: ImageFileHeader>>= (in category 'comparing') -----
+ = other
+ 
+ 	self species == other species ifFalse: [^ false].
+ 	1 to: self class instSize do:
+ 		[:i | (self instVarAt: i) = (other instVarAt: i) ifFalse: [^ false]].
+ 	^ true!

Item was added:
+ ----- Method: ImageFileHeader>>asValues (in category 'converting') -----
+ asValues
+ 	"Answer an array of values from which a copy of this instance could be
+ 	created with #fromValues:"
+ 
+ 	"self fromValues: (self fromValues:self primInterpreterStateSnapshot) asValues"
+ 
+ 	^Array new writeStream
+ 		nextPut: imageFormat asInteger;
+ 		nextPut: headerSize;
+ 		nextPut: imageBytes;
+ 		nextPut: startOfMemory;
+ 		nextPut: specialObjectsOop;
+ 		nextPut: lastHash;
+ 		nextPut: screenSize;
+ 		nextPut: imageHeaderFlags;
+ 		nextPut: extraVMMemory;
+ 		contents
+ !

Item was added:
+ ----- Method: ImageFileHeader>>fromEntryStream: (in category 'reading') -----
+ fromEntryStream: streamOfHeaderStateObjects
+ 
+ 	imageFormat := ImageFormat fromInteger: streamOfHeaderStateObjects next.
+ 	headerSize := streamOfHeaderStateObjects next.
+ 	imageBytes := streamOfHeaderStateObjects next.
+ 	startOfMemory := streamOfHeaderStateObjects next.
+ 	specialObjectsOop := streamOfHeaderStateObjects next.
+ 	lastHash := streamOfHeaderStateObjects next.
+ 	screenSize := streamOfHeaderStateObjects next. "a Point with two integer values for X and Y extent"
+ 	imageHeaderFlags := streamOfHeaderStateObjects next.
+ 	extraVMMemory := streamOfHeaderStateObjects next.
+ 
+ !

Item was added:
+ ----- Method: ImageFileHeader>>hash (in category 'comparing') -----
+ hash
+ 	^imageBytes hash xor: lastHash!

Item was removed:
- ----- Method: ImageFileHeader>>readFieldsFrom:startingAt:headerWordSize:littleEndian: (in category 'reading') -----
- readFieldsFrom: aStream startingAt: imageOffset headerWordSize: headerWordSize littleEndian: littleEndian
- 	"Read data fields and answer number of bytes read"
- 
- 	| remainder screenSizeWord |
- 	headerSize := self nextNumber: headerWordSize from: aStream littleEndian: littleEndian.
- 	imageBytes := self nextNumber: headerWordSize from: aStream littleEndian: littleEndian.
- 	startOfMemory := self nextNumber: headerWordSize from: aStream littleEndian: littleEndian.
- 	specialObjectsOop := self nextNumber: headerWordSize from: aStream littleEndian: littleEndian.
- 	lastHash := self nextNumber: headerWordSize from: aStream littleEndian: littleEndian.
- 	screenSizeWord := self nextNumber: headerWordSize from: aStream littleEndian: littleEndian.
- 	screenSize := (screenSizeWord >> 16) @ (screenSizeWord bitAnd: 16rFFFF).
- 	imageHeaderFlags := self nextNumber: headerWordSize from: aStream littleEndian: littleEndian.
- 	extraVMMemory := self nextNumber: headerWordSize from: aStream littleEndian: littleEndian.
- 	remainder := headerSize - (9 * imageFormat wordSize).
- 	self assert: remainder >= 0. "n.b. Mantis 7455 bug in original 64 bit image due to VMM error"
- 	^9 * imageFormat wordSize.
- !

Item was added:
+ ----- Method: ImageFileHeader>>readFieldsFrom:startingAt:headerWordSize:littleEndian:into: (in category 'reading') -----
+ readFieldsFrom: aStream startingAt: imageOffset headerWordSize: headerWordSize littleEndian: littleEndian into: aCollection
+ 	"Read data fields and answer number of bytes read"
+ 
+ 	| remainder screenSizeWord |
+ 	headerSize := self nextNumber: headerWordSize from: aStream littleEndian: littleEndian.
+ 	aCollection add: headerSize.
+ 	aCollection add: ( self nextNumber: headerWordSize from: aStream littleEndian: littleEndian). "imageBytes"
+ 	aCollection add: (self nextNumber: headerWordSize from: aStream littleEndian: littleEndian). "startOfMemory"
+ 	aCollection add: (self nextNumber: headerWordSize from: aStream littleEndian: littleEndian). "specialObjectsOop"
+ 	aCollection add: (self nextNumber: headerWordSize from: aStream littleEndian: littleEndian). "lastHash"
+ 	screenSizeWord := self nextNumber: headerWordSize from: aStream littleEndian: littleEndian.
+ 	aCollection add: ((screenSizeWord >> 16) @ (screenSizeWord bitAnd: 16rFFFF)).
+ 	aCollection add: (self nextNumber: headerWordSize from: aStream littleEndian: littleEndian). "imageHeaderFlags"
+ 	aCollection add: (self nextNumber: headerWordSize from: aStream littleEndian: littleEndian). "extraVMMemory"
+ 	remainder := headerSize - (9 * imageFormat wordSize).
+ 	self assert: remainder >= 0. "n.b. Mantis 7455 bug in original 64 bit image due to VMM error"
+ 	^9 * imageFormat wordSize.
+ !

Item was removed:
- ----- Method: ImageFileHeader>>readFrom:startingAt: (in category 'reading') -----
- readFrom: aStream startingAt: imageOffset
- 
- 	| remainder bytesRead headerWordSize littleEndian |
- 	littleEndian := self readImageVersionFrom: aStream startingAt: imageOffset.
- 	headerWordSize := aStream position - imageOffset.
- 	bytesRead := self readFieldsFrom: aStream startingAt: imageOffset headerWordSize: headerWordSize littleEndian: littleEndian.
- 	remainder := headerSize - bytesRead.
- 	self assert: remainder >= 0. "n.b. Mantis 7455 bug in original 64 bit image due to VMM error"
- 	aStream next: (headerSize - bytesRead).
- !

Item was added:
+ ----- Method: ImageFileHeader>>readFrom:startingAt:into: (in category 'reading') -----
+ readFrom: aStream startingAt: imageOffset into: aCollection
+ 
+ 	| remainder bytesRead headerWordSize littleEndian |
+ 	littleEndian := self readImageVersionFrom: aStream startingAt: imageOffset.
+ 	headerWordSize := aStream position - imageOffset.
+ 	aCollection add: imageFormat asInteger.
+ 	bytesRead := self readFieldsFrom: aStream startingAt: imageOffset headerWordSize: headerWordSize littleEndian: littleEndian into: aCollection.
+ 	remainder := headerSize - bytesRead.
+ 	self assert: remainder >= 0. "n.b. Mantis 7455 bug in original 64 bit image due to VMM error"
+ 	aStream next: (headerSize - bytesRead).
+ 
+ 	self fromEntryStream: aCollection readStream.
+ !

Item was added:
+ ----- Method: ImageFormat>>= (in category 'comparing') -----
+ = anImageFormat
+ 	^self class == anImageFormat class
+ 		and: [self asInteger = anImageFormat asInteger].
+ !

Item was added:
+ ----- Method: ImageFormat>>hash (in category 'comparing') -----
+ hash
+ 	^self asInteger hash!



More information about the Vm-dev mailing list