[Vm-dev] VM Maker: VMMaker.oscog-eem.1068.mcz

commits at source.squeak.org commits at source.squeak.org
Mon Feb 16 19:55:07 UTC 2015


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1068.mcz

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

Name: VMMaker.oscog-eem.1068
Author: eem
Time: 16 February 2015, 11:53:51.24 am
UUID: 3aeb252a-64eb-45a8-a5ad-c4daf88f87b8
Ancestors: VMMaker.oscog-eem.1067

...and add type inference support for at: rto rescue
inlining in the Klatt plugin.

Mark SpurSegmentManager>>initializeFromFreeChunks:
as doNotGenerate to avoid a type inferrence error.

=============== Diff against VMMaker.oscog-eem.1067 ===============

Item was changed:
  ----- Method: CCodeGenerator>>returnTypeForSend:in: (in category 'type inference') -----
  returnTypeForSend: sendNode in: aTMethod
  	"Answer the return type for a send.  Absent sends default to #sqInt.
  	 The bitwise operators answer unsigned versions of their argument types, at least in gcc
  	 although this author can't find that in the C99 spec.  If you can find this, please let me know."
  	| sel |
  	^(self anyMethodNamed: (sel := sendNode selector))
  		ifNil: [kernelReturnTypes
  				at: sel
  				ifAbsent:
  					[^sel
  						caseOf: {
  						[#+]					->	[self typeForArithmetic: sendNode in: aTMethod].
  						[#-]						->	[self typeForArithmetic: sendNode in: aTMethod].
  						[#*]					->	[self typeForArithmetic: sendNode in: aTMethod].
  						[#/]						->	[self typeForArithmetic: sendNode in: aTMethod].
+ 						[#at:]					->	[self typeForDereference: sendNode in: aTMethod].
  						[#bitAnd:]				->	[self unsignedTypeForBitwiseSend: sendNode in: aTMethod].
  						[#bitOr:]				->	[self unsignedTypeForBitwiseSend: sendNode in: aTMethod].
  						[#bitXor:]				->	[self unsignedTypeForBitwiseSend: sendNode in: aTMethod].
  						[#asVoidPointer]		->	[#'void *'].
  						[#asVoidPointer]		->	[#'void *'].
  						[#asUnsignedInteger]	->	[#usqInt].
  						[#asLong]				->	[#long].
  						[#asUnsignedLong]		->	[#'unsigned long'].
  						[#signedIntToLong]		->	[#usqInt]. "c.f. generateSignedIntToLong:on:indent:"
  						[#signedIntToShort]	->	[#usqInt]. "c.f. generateSignedIntToShort:on:indent:"
  						[#cCoerce:to:]			->	[sendNode args last value].
  						[#cCoerceSimple:to:]	->	[sendNode args last value] }
  						otherwise: [#sqInt]]]
  		ifNotNil:
  			[:m|
  			m returnType ifNotNil:
  				[:type| "map fields to #usqInt"
  				((type beginsWith: 'unsigned')
  				 and: [(type includes: $:)
  				 and: [type last isDigit]])
  					ifTrue: [#usqInt]
  					ifFalse: [type]]]!

Item was added:
+ ----- Method: CCodeGenerator>>typeForDereference:in: (in category 'type inference') -----
+ typeForDereference: sendNode in: aTMethod
+ 	| type |
+ 	type := self typeFor: sendNode receiver in: aTMethod.
+ 	type last = $* ifTrue:
+ 		[^type allButLast withBlanksTrimmed].
+ 	self error: 'cannot determine type'.
+ 	^nil!

Item was changed:
  ----- Method: SpurSegmentManager>>initializeFromFreeChunks: (in category 'simulation only') -----
  initializeFromFreeChunks: freeChunks
+ 	<doNotGenerate>
  	"For testing, create a set of segments using the freeChunks as bridges."
  	self assert: (freeChunks allSatisfy: [:f| manager hasOverflowHeader: f]).
  	numSegments := freeChunks size.
  	freeChunks do:
  		[:f|
  		manager initSegmentBridgeWithBytes: (manager bytesInObject: f) at: (manager startOfObject: f).
  		self assert: (manager isSegmentBridge: f)].
  	segments := (1 to: numSegments) collect:
  					[:i| | bridge start size |
  					bridge := freeChunks at: i.
  					start := i = 1
  								ifTrue: [manager newSpaceLimit]
  								ifFalse: [manager addressAfter: (freeChunks at: i - 1)].
  					size := bridge + manager baseHeaderSize - start.
  					SpurSegmentInfo new
  						segStart: start;
  						segSize: size;
  						yourself].
  	manager setEndOfMemory: segments last segLimit.
  	segments := CArrayAccessor on: segments.
  	freeChunks with: segments object do:
  		[:bridge :segment|
  		self assert: (self isValidSegmentBridge: bridge).
  		self assert: bridge = (self bridgeFor: segment)]!



More information about the Vm-dev mailing list