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:01:50.518 pm UUID: 242fb465-c99f-417d-b8bd-b320a076a72a 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 r3819.
=============== 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'!
vm-dev@lists.squeakfoundation.org