[Vm-dev] VM Maker: VMMaker.oscog-mt.3260.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Nov 1 10:53:00 UTC 2022


Marcel Taeumel uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-mt.3260.mcz

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

Name: VMMaker.oscog-mt.3260
Author: mt
Time: 1 November 2022, 11:52:51.509196 am
UUID: 44ed8e4a-a0d1-dd40-a840-d438405c51af
Ancestors: VMMaker.oscog-mt.3259

Fixes generation of cmacros for one-arg quick-returns.

This fixes a regression from
  VMMaker.oscog-eem.3240
  VMMaker.oscog-eem.3237
  VMMaker.oscog-eem.3236
  VMMaker.oscog-eem.3234

:-)

=============== Diff against VMMaker.oscog-mt.3259 ===============

Item was changed:
  ----- Method: CCodeGenerator>>addMethodFor:selector: (in category 'utilities') -----
  addMethodFor: aClass selector: selector
  	"Add the given method to the code base and answer its translation
  	 or nil if it shouldn't be translated."
  
  	| method tmethod |
  	method := aClass compiledMethodAt: selector.
  	(method pragmaAt: #doNotGenerate) ifNotNil:
  		["only remove a previous method if this one overrides it, i.e. this is a subclass method.
  		 If the existing method is in a different hierarchy this method must be merely a redeirect."
  		 (methods at: selector ifAbsent: []) ifNotNil:
  			[:tm|
  			(aClass includesBehavior: tm definingClass) ifTrue:
  				[self removeMethodForSelector: selector]].
  		 ^nil].
  	method isSubclassResponsibility ifTrue:
  		[^nil].
  	(self shouldIncludeMethodFor: aClass selector: selector) ifFalse:
  		[^nil].
  	tmethod := self compileToTMethodSelector: selector in: aClass.
  	"Even though we exclude initialize methods, we must consider their
  	 global variable usage, otherwise globals may be incorrectly localized."
  	selector == #initialize ifTrue:
  		[self checkForGlobalUsage: (tmethod allReferencedVariablesUsing: self) in: tmethod.
  		 ^nil].
  	self addMethod: tmethod.
  	"If the method has a macro then add the macro.  But keep the method
  	 for analysis purposes (e.g. its variable accesses)."
  	(method pragmaAt: #cmacro:) ifNotNil:
  		[:pragma|
  		self addMacro: (pragma argumentAt: 1) for: selector.
  		(inlineList includes: selector) ifTrue:
  			[inlineList := inlineList copyWithout: selector]].
  	(method pragmaAt: #cmacro) ifNotNil:
  		[:pragma| | literal | "Method should be just foo ^const"
  		self assert: (self isValidMacroMethod: method).
  		literal := (method isQuick or: [method numArgs = 1])
  					ifTrue: [method decompile quickMethodReturnLiteral]
  					ifFalse: [method literalAt: 1].
+ 		self addMacro: (method numArgs = 1 "foo: arg ^const is a useful exception"
+ 								ifTrue: ['(x) ']
+ 								ifFalse: ['() ']),
+ 						(method isReturnField
- 		self addMacro: '() ', (method isReturnField
  								ifTrue: [literal]
  								ifFalse: [self cLiteralFor: literal value name: method selector]) for: selector.
  		(inlineList includes: selector) ifTrue:
  			[inlineList := inlineList copyWithout: selector]].
  	^tmethod!



More information about the Vm-dev mailing list