[Vm-dev] VM Maker: VMMaker-dtl.435.mcz

commits at source.squeak.org commits at source.squeak.org
Mon Aug 1 23:01:58 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: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'!



More information about the Vm-dev mailing list