Skip to content

Commit

Permalink
Prepare ComposedImageWriter for C translation: open files and type de…
Browse files Browse the repository at this point in the history
…clarations
  • Loading branch information
PalumboN committed Feb 4, 2022
1 parent 95bca0b commit 4b6fbd6
Show file tree
Hide file tree
Showing 7 changed files with 123 additions and 29 deletions.
84 changes: 70 additions & 14 deletions smalltalksrc/VMMaker/AbstractComposedImageAccess.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,20 @@ Class {
{ #category : #'file operations' }
AbstractComposedImageAccess >> headerFile: imageFileName [

| imageFile |
imageFile := self imageFile: imageFileName.

^ imageFile / 'header.ston'
| headerFileName |
headerFileName := 'header.ston'.

^ self
cCode: [ self vmConcatPath: imageFileName File: headerFileName ]
inSmalltalk: [ | imageFile |
imageFile := self imageFile: imageFileName.
imageFile / headerFileName ]
]

{ #category : #'file operations' }
AbstractComposedImageAccess >> imageFile: imageFileName [

<doNotGenerate>
| imageFile |
imageFile := imageFileName asFileReference.
imageFile ensureCreateDirectory.
Expand All @@ -26,30 +31,51 @@ AbstractComposedImageAccess >> imageFile: imageFileName [
{ #category : #'file operations' }
AbstractComposedImageAccess >> segmentDataFile: segmentIndex fromFile: imageFile [

<doNotGenerate>
| segmentDataFileName |
segmentDataFileName := (self segmentFileNameWithoutExtension: segmentIndex) , '.data'.

segmentDataFileName := self segmentDataFileName: segmentIndex.
^ imageFile / segmentDataFileName
]

{ #category : #'file operations' }
AbstractComposedImageAccess >> segmentDataFile: segmentIndex inImage: imageFileName [

| imageFile |
imageFile := self imageFile: imageFileName.
^ self
cCode: [ | segmentFileName fullSegmentPath |
segmentFileName := self segmentDataFileName: segmentIndex.
fullSegmentPath := self
vmConcatPath: imageFileName
File: segmentFileName.
self free: segmentFileName.
fullSegmentPath ]
inSmalltalk: [ | imageFile |
imageFile := self imageFile: imageFileName.
self segmentDataFile: segmentIndex fromFile: imageFile ]
]

{ #category : #'file operations' }
AbstractComposedImageAccess >> segmentDataFileName: segmentIndex [

| fileName extension dataFileName |
fileName := self segmentFileNameWithoutExtension: segmentIndex.
extension := '.data'.
dataFileName := self stretch: fileName cat: extension.
self free: fileName.
^ dataFileName

^ self segmentDataFile: segmentIndex fromFile: imageFile
]

{ #category : #'file operations' }
AbstractComposedImageAccess >> segmentFileNameWithoutExtension: segmentIndex [

^ 'seg' , segmentIndex asString
^ self stretch: 'seg' cat: segmentIndex asString.
]

{ #category : #'file operations' }
AbstractComposedImageAccess >> segmentMetadataFile: segmentIndex fromFile: imageFile [

<doNotGenerate>
| segmentDataFileName |
segmentDataFileName := (self segmentFileNameWithoutExtension: segmentIndex) , '.ston'.

Expand All @@ -59,14 +85,44 @@ AbstractComposedImageAccess >> segmentMetadataFile: segmentIndex fromFile: image
{ #category : #'file operations' }
AbstractComposedImageAccess >> segmentMetadataFile: segmentIndex inImage: imageFileName [

| imageFile |
imageFile := self imageFile: imageFileName.
^ self
cCode: [ | segmentFileName fullSegmentPath |
segmentFileName := self segmentMetadataFileName: segmentIndex.
fullSegmentPath := self
vmConcatPath: imageFileName
File: segmentFileName.
self free: segmentFileName.
fullSegmentPath ]
inSmalltalk: [ | imageFile |
imageFile := self imageFile: imageFileName.
self segmentMetadataFile: segmentIndex fromFile: imageFile ]
]

{ #category : #'file operations' }
AbstractComposedImageAccess >> segmentMetadataFileName: segmentIndex [

| fileName extension metadataFileName |
fileName := self segmentFileNameWithoutExtension: segmentIndex.
extension := '.ston'.
metadataFileName := self stretch: fileName cat: extension.
self free: fileName.
^ metadataFileName

]

{ #category : #'string manipulation' }
AbstractComposedImageAccess >> vmConcatPath: dirPath File: fileName [

^ self segmentMetadataFile: segmentIndex fromFile: imageFile
| prefix fullPath |
self flag: #TODO. "implement sprint"
prefix := self stretch: dirPath cat: '/'.
fullPath := self stretch: prefix cat: fileName.
self free: prefix.
^ fullPath
]

{ #category : #'accessing - files' }
AbstractComposedImageAccess >> sqImageSTONFile: file Open: fileMode [
AbstractComposedImageAccess >> vmImageSTONFile: file Open: fileMode [

<doNotGenerate>
^file asFileReference writeStream
Expand Down
8 changes: 6 additions & 2 deletions smalltalksrc/VMMaker/ComposedImageReader.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Class {
{ #category : #api }
ComposedImageReader >> readHeaderFromImage: anImageFileName [

<var: #header type: #SpurImageHeaderStruct>
| header |
header := (self headerFile: anImageFileName) readStreamDo: [ :f |
self readSTONFrom: f ].
Expand All @@ -18,7 +19,10 @@ ComposedImageReader >> readHeaderFromImage: anImageFileName [

{ #category : #api }
ComposedImageReader >> readImageNamed: anImageName [


<var: #header type: #'SpurImageHeaderStruct'>
<var: #anImageName declareC: 'char *imageFileName'>

| header imageFile |

imageFile := self imageFile: anImageName.
Expand All @@ -39,7 +43,7 @@ ComposedImageReader >> readSTONFrom: f [
^ STON reader on: f; next
]

{ #category : #api }
{ #category : #segments }
ComposedImageReader >> readSegmentMetadata: segmentIndex fromFile: imageFile [

^ (self segmentMetadataFile: segmentIndex fromFile: imageFile)
Expand Down
25 changes: 17 additions & 8 deletions smalltalksrc/VMMaker/ComposedImageWriter.class.st
Original file line number Diff line number Diff line change
@@ -1,20 +1,30 @@
Class {
#name : #ComposedImageWriter,
#superclass : #AbstractComposedImageAccess,
#instVars : [
'stonWriter'
],
#category : #'VMMaker-ImageFormat'
}

{ #category : #writing }
ComposedImageWriter >> initialize [

super initialize .
stonWriter := STON writer.
]

{ #category : #writing }
ComposedImageWriter >> writeHeaderFile: imageFileName fromHeader: header [

<var: #file type: #sqImageFile> "ImageFile ?"
| file |

file := self sqImageSTONFile: (self headerFile: imageFileName) Open: 'wb'.
file := self vmImageSTONFile: (self headerFile: imageFileName) Open: 'wb'.
file ifNil: [ "could not open the file for writing"
^ self primitiveFail ].

self writeSTON: header toFile: file.
self writeHeaderSTON: header toFile: file.

self sqImageFileClose: file.

Expand All @@ -33,7 +43,7 @@ ComposedImageWriter >> writeImageFile: imageFileName fromHeader: header [

self writeHeaderFile: imageFileName fromHeader: header.

self flag: #TODO. "success: header imageHeaderSize "
self flag: #TODO. "success: header imageHeaderSize?"

bytesWritten := self writeImageSegments: imageFileName.

Expand All @@ -43,7 +53,6 @@ ComposedImageWriter >> writeImageFile: imageFileName fromHeader: header [
{ #category : #writing }
ComposedImageWriter >> writeImageSegments: imageFileName [

<var: 'aBinaryStream' type: #sqImageFile>
<var: 'aSegment' type:#'SpurSegmentInfo *'>

self beginWriteImageSegments.
Expand All @@ -58,19 +67,19 @@ ComposedImageWriter >> writeImageSegments: imageFileName [
]

{ #category : #writing }
ComposedImageWriter >> writeSTON: ston toFile: f [
ComposedImageWriter >> writeSTON: struct toFile: f [

STON writer
stonWriter
on: f;
nextPut: ston
nextPut: struct
]

{ #category : #writing }
ComposedImageWriter >> writeSegment: segment nextIndex: segmentIndex inImage: imageFileName [

| metadataFile dataFile nWritten |

metadataFile := self sqImageSTONFile: (self segmentMetadataFile: segmentIndex inImage: imageFileName) Open: 'wb'.
metadataFile := self vmImageSTONFile: (self segmentMetadataFile: segmentIndex inImage: imageFileName) Open: 'wb'.
metadataFile ifNil: [ "could not open the file for writing"
^ self primitiveFail ].

Expand Down
22 changes: 22 additions & 0 deletions smalltalksrc/VMMaker/ComposedSegmentMetadataStruct.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,28 @@ Class {
#category : #'VMMaker-ImageFormat'
}

{ #category : #'simulation only' }
ComposedSegmentMetadataStruct class >> byteSizeForSimulator: aCogit [

"Answer an approximation of the byte size of an AbstractInstruction struct.
This is for estimating the alloca in allocateOpcodes:bytecodes:ifFail:"
^self instSize * (aCogit sizeof: #'void *').
]

{ #category : #translation }
ComposedSegmentMetadataStruct class >> instVarNamesAndTypesForTranslationDo: aBinaryBlock [
"enumerate aBinaryBlock with the names and C type strings for the inst vars to include in a struct of this type."

<var: #segSize type: #size_t>
<var: #segStart type: #squeakFileOffsetType>

aBinaryBlock
value: 'segSize' value:'size_t';
value: 'segStart' value:'squeakFileOffsetType'.


]

{ #category : #accessing }
ComposedSegmentMetadataStruct >> segSize [

Expand Down
7 changes: 5 additions & 2 deletions smalltalksrc/VMMaker/StackInterpreter.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,10 @@ StackInterpreter class >> ancilliaryClasses [
LibFFI.
CogStackPage.
SpurImageHeaderStruct.
AbstractImageAccess. "I am putting the abstract superclass... because I cannot make it work else"
ComposedSegmentMetadataStruct.
"I am putting the abstract superclasses... because I cannot make it work else"
AbstractImageAccess.
AbstractComposedImageAccess.
self imageReaderClass.
self imageWriterClass}
]
Expand Down Expand Up @@ -653,7 +656,7 @@ StackInterpreter class >> imageWriterClass [

^Smalltalk at: (InitializationOptions
at: #ImageWriter
ifAbsent: [ #SpurImageWriter ])
ifAbsent: [ #ComposedImageWriter ])
]

{ #category : #translation }
Expand Down
4 changes: 2 additions & 2 deletions smalltalksrc/VMMaker/VMMemoryMap.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,8 @@ VMMemoryMap >> initialOldSpaceSize: anInteger [
VMMemoryMap >> initializeMemoryMap [

self cCode: [ ] inSmalltalk: [
memoryMapConfiguration := VMMemoryMapConfiguration forWordsize:
self class objectMemoryClass wordSize ]
memoryMapConfiguration := (VMMemoryMapConfiguration forWordsize:
self class objectMemoryClass wordSize) new ]
]

{ #category : #private }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ Class {
VMAbstractImageFormatTest class >> testParameters [

^ super testParameters * {
{ #imageReaderClass -> SpurImageReader. #imageWriterClass -> SpurImageWriter }.
{ #imageReaderClass -> ComposedImageReader. #imageWriterClass -> ComposedImageWriter }.
{ #imageReaderClass -> SpurImageReader. #imageWriterClass -> SpurImageWriter }.
}
]

Expand Down

0 comments on commit 4b6fbd6

Please sign in to comment.