[Vm-dev] VM Maker: VMMaker-dtl.435.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Aug 1 23:15:35 UTC 2022
David T. Lewis uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker-dtl.435.mcz
==================== Summary ====================
Name: VMMaker-dtl.435
Author: dtl
Time: 1 August 2022, 7:15:27.889 pm
UUID: a890fb46-cce6-48ca-af49-b0abbb0967bb
Ancestors: VMMaker-dtl.434
VMMaker 4.20.1 Add FilePlugin>>primitiveDirectoryEntry. The primitive was present in the initial opensmalltalk-vm commits but was accidentally omitted from merge back to VMM trunk in that time frame. Requires platform sources update r3820.
=============== Diff against VMMaker-dtl.434 ===============
Item was changed:
----- Method: CCodeGenerator>>initializeCTranslationDictionary (in category 'C translation') -----
initializeCTranslationDictionary
"Initialize the dictionary mapping message names to actions for C code generation."
| pairs |
translationDict := Dictionary new: 200.
pairs := #(
#& #generateAnd:on:indent:
#| #generateOr:on:indent:
#and: #generateSequentialAnd:on:indent:
#or: #generateSequentialOr:on:indent:
#not #generateNot:on:indent:
#+ #generatePlus:on:indent:
#- #generateMinus:on:indent:
#negated #generateNegated:on:indent:
#* #generateTimes:on:indent:
#/ #generateDivide:on:indent:
#// #generateDivide:on:indent:
#\\ #generateModulo:on:indent:
#<< #generateShiftLeft:on:indent:
#>> #generateShiftRight:on:indent:
#min: #generateMin:on:indent:
#max: #generateMax:on:indent:
#between:and: #generateBetweenAnd:on:indent:
#bitAnd: #generateBitAnd:on:indent:
#bitOr: #generateBitOr:on:indent:
#bitXor: #generateBitXor:on:indent:
#bitShift: #generateBitShift:on:indent:
#signedBitShift: #generateSignedBitShift:on:indent:
#bitInvert32 #generateBitInvert32:on:indent:
#bitClear: #generateBitClear:on:indent:
#< #generateLessThan:on:indent:
#<= #generateLessThanOrEqual:on:indent:
#= #generateEqual:on:indent:
#> #generateGreaterThan:on:indent:
#>= #generateGreaterThanOrEqual:on:indent:
#~= #generateNotEqual:on:indent:
#== #generateEqual:on:indent:
#~~ #generateNotEqual:on:indent:
#isNil #generateIsNil:on:indent:
#notNil #generateNotNil:on:indent:
#whileTrue: #generateWhileTrue:on:indent:
#whileFalse: #generateWhileFalse:on:indent:
#whileTrue #generateDoWhileTrue:on:indent:
#whileFalse #generateDoWhileFalse:on:indent:
#to:do: #generateToDo:on:indent:
#to:by:do: #generateToByDo:on:indent:
#repeat #generateRepeat:on:indent:
#ifTrue: #generateIfTrue:on:indent:
#ifFalse: #generateIfFalse:on:indent:
#ifTrue:ifFalse: #generateIfTrueIfFalse:on:indent:
#ifFalse:ifTrue: #generateIfFalseIfTrue:on:indent:
#at: #generateAt:on:indent:
#at:put: #generateAtPut:on:indent:
#basicAt: #generateAt:on:indent:
#basicAt:put: #generateAtPut:on:indent:
#integerValueOf: #generateIntegerValueOf:on:indent:
#integerObjectOf: #generateIntegerObjectOf:on:indent:
#isIntegerObject: #generateIsIntegerObject:on:indent:
#cCode: #generateInlineCCode:on:indent:
#cCode:inSmalltalk: #generateInlineCCode:on:indent:
#cPreprocessorDirective: #generateInlineCPreprocessorDirective:on:indent:
#preprocessorExpression: #generateInlineCppDirective:on:indent:
#isDefined:inSmalltalk:comment:ifTrue: #generateInlineCppIfDef:on:indent:
#isDefined:inSmalltalk:comment:ifTrue:ifFalse: #generateInlineCppIfDefElse:on:indent:
#isDefinedTrueExpression:inSmalltalk:comment:ifTrue:ifFalse: #generateInlineCppIfElse:on:indent:
#cPreprocessorDirective: #generateOscogInlineCppDirective:on:indent: "oscog compatibility"
#cppIf:ifTrue:ifFalse: #generateOscogInlineCppIfElse:on:indent: "oscog compatibility"
#cppIf:ifTrue: #generateOscogInlineCppIf:on:indent: "oscog compatibility"
#cCoerce:to: #generateCCoercion:on:indent:
#cCoerceSimple:to: #generateCCoercion:on:indent:
#addressOf: #generateAddressOf:on:indent:
+ #addressOf:put: #generateAddressOf:on:indent:
#signedIntFromLong #generateSignedIntFromLong:on:indent:
#signedIntToLong #generateSignedIntToLong:on:indent:
#signedIntFromShort #generateSignedIntFromShort:on:indent:
#signedIntToShort #generateSignedIntToShort:on:indent:
#preIncrement #generatePreIncrement:on:indent:
#preDecrement #generatePreDecrement:on:indent:
#inline: #generateInlineDirective:on:indent:
#asFloat #generateAsFloat:on:indent:
#asInteger #generateAsInteger:on:indent:
#asIntegerPtr #generateAsIntegerPtr:on:indent:
#asUnsignedInteger #generateAsUnsignedInteger:on:indent:
#asUnsignedIntegerPtr #generateAsUnsignedIntegerPtr:on:indent:
#asLong #generateAsLong:on:indent:
#asUnsignedLong #generateAsUnsignedLong:on:indent:
#asUnsignedLongLong #generateAsUnsignedLongLong:on:indent:
#asVoidPointer #generateAsVoidPointer:on:indent:
#asSymbol #generateAsSymbol:on:indent:
#flag: #generateFlag:on:indent:
#anyMask: #generateBitAnd:on:indent:
#raisedTo: #generateRaisedTo:on:indent:
#touch: #generateTouch:on:indent:
#bytesPerWord #generateBytesPerWord:on:indent:
#baseHeaderSize #generateBaseHeaderSize:on:indent:
#sharedCodeNamed:inCase: #generateSharedCodeDirective:on:indent:
#perform: #generatePerform:on:indent:
#perform:with: #generatePerform:on:indent:
#perform:with:with: #generatePerform:on:indent:
#perform:with:with:with: #generatePerform:on:indent:
#perform:with:with:with:with: #generatePerform:on:indent:
#perform:with:with:with:with:with: #generatePerform:on:indent:
#value #generateValue:on:indent:
#value: #generateValue:on:indent:
#value:value: #generateValue:on:indent:
#shouldNotImplement #generateSmalltalkMetaError:on:indent:
#shouldBeImplemented #generateSmalltalkMetaError:on:indent:
).
1 to: pairs size by: 2 do: [:i |
translationDict at: (pairs at: i) put: (pairs at: i + 1)].
pairs := #(
#ifTrue: #generateIfTrueAsArgument:on:indent:
#ifFalse: #generateIfFalseAsArgument:on:indent:
#ifTrue:ifFalse: #generateIfTrueIfFalseAsArgument:on:indent:
#ifFalse:ifTrue: #generateIfFalseIfTrueAsArgument:on:indent:
#cCode: #generateInlineCCodeAsArgument:on:indent:
#cCode:inSmalltalk: #generateInlineCCodeAsArgument:on:indent:
#value #generateValueAsArgument:on:indent:
#value: #generateValueAsArgument:on:indent:
#value:value: #generateValueAsArgument:on:indent:
).
asArgumentTranslationDict := Dictionary new: 8.
1 to: pairs size by: 2 do: [:i |
asArgumentTranslationDict at: (pairs at: i) put: (pairs at: i + 1)].
!
Item was added:
+ ----- Method: FilePlugin>>primitiveDirectoryEntry (in category 'directory primitives') -----
+ primitiveDirectoryEntry
+
+ "Two arguments - directory path, and simple file name;
+ returns an array (see primitiveDirectoryLookup) describing the file or directory,
+ or nil if it does not exist.
+ Primitive fails if the outer path does not identify a readable directory.
+ (This is a lookup-by-name variant of primitiveDirectoryLookup.)"
+
+ | requestedName pathName pathNameIndex pathNameSize status entryName entryNameSize createDate modifiedDate dirFlag posixPermissions symlinkFlag fileSize okToList reqNameIndex reqNameSize |
+
+ <var: 'entryName' declareC: 'char entryName[256]'>
+ <var: 'pathNameIndex' type: #'char *'>
+ <var: 'reqNameIndex' type: #'char *'>
+ <var: 'fileSize' type: #squeakFileOffsetType>
+ <export: true>
+
+ requestedName := interpreterProxy stackValue: 0.
+ pathName := interpreterProxy stackValue: 1.
+ (interpreterProxy isBytes: pathName) ifFalse:
+ [^interpreterProxy primitiveFail].
+
+ "Outbound string parameters"
+ pathNameIndex := interpreterProxy firstIndexableField: pathName.
+ pathNameSize := interpreterProxy byteSizeOf: pathName.
+
+ reqNameIndex := interpreterProxy firstIndexableField: requestedName.
+ reqNameSize := interpreterProxy byteSizeOf: requestedName.
+ self cCode: '' inSmalltalk:
+ [entryName := ByteString new: 256.
+ entryNameSize := createDate := modifiedDate := dirFlag := fileSize := posixPermissions := symlinkFlag := nil].
+ "If the security plugin can be loaded, use it to check for permission.
+ If not, assume it's ok"
+ okToList := sCLPfn ~= 0
+ ifTrue: [self cCode: '((sqInt (*)(char *, sqInt))sCLPfn)(pathNameIndex, pathNameSize)' inSmalltalk: [true]]
+ ifFalse: [true].
+ status := okToList
+ ifTrue:
+ [self dir_EntryLookup: pathNameIndex _: pathNameSize
+ _: reqNameIndex _: reqNameSize
+ _: entryName _: (self addressOf: entryNameSize put: [:v| entryNameSize := v])
+ _: (self addressOf: createDate put: [:v| createDate := v])
+ _: (self addressOf: modifiedDate put: [:v| modifiedDate := v])
+ _: (self addressOf: dirFlag put: [:v| dirFlag := v])
+ _: (self addressOf: fileSize put: [:v| fileSize := v])
+ _: (self addressOf: posixPermissions put: [:v| posixPermissions := v])
+ _: (self addressOf: symlinkFlag put: [:v| symlinkFlag := v])]
+ ifFalse:
+ [DirNoMoreEntries].
+
+ interpreterProxy failed ifTrue:
+ [^nil].
+ status = DirNoMoreEntries ifTrue: "no entry; return nil"
+ [interpreterProxy "pop pathName, index, rcvr"
+ pop: 3 thenPush: interpreterProxy nilObject.
+ ^nil].
+ status = DirBadPath ifTrue:
+ [^interpreterProxy primitiveFail]."bad path"
+
+ interpreterProxy
+ pop: 3 "pop pathName, index, rcvr"
+ thenPush:
+ (self makeDirEntryName: entryName
+ size: entryNameSize
+ createDate: createDate
+ modDate: modifiedDate
+ isDir: dirFlag
+ fileSize: fileSize).
+ !
Item was changed:
----- Method: VMMaker class>>versionString (in category 'version testing') -----
versionString
"VMMaker versionString"
+ ^'4.20.1'!
- ^'4.19.15'!
More information about the Vm-dev
mailing list