[squeak-dev] The Trunk: Compiler-eem.214.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Sep 15 23:30:46 UTC 2011


Eliot Miranda uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-eem.214.mcz

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

Name: Compiler-eem.214
Author: eem
Time: 15 September 2011, 4:30:28.005 pm
UUID: 88e225e0-5e81-4d57-aadd-6b92a971fdd8
Ancestors: Compiler-eem.213

Compiler half of first part of changes to revive ability to
create subclasses of CompiledMethod.  Other half is
Kernel-eem.619.

=============== Diff against Compiler-eem.213 ===============

Item was added:
+ ----- Method: MethodNode>>generate:using: (in category 'code generation') -----
+ generate: trailer using: aCompiledMethodClass
+ 	"The receiver is the root of a parse tree. Answer an instance of aCompiledMethodClass.
+ 	 The argument, trailer, is arbitrary but is typically either the reference to the source code
+ 	 that is stored with every CompiledMethod, or an encoding of the method's temporary names."
+ 
+ 	| primErrNode blkSize nLits literals stack method |
+ 	self generate: trailer
+ 		using: aCompiledMethodClass
+ 		ifQuick:
+ 			[:m |
+ 			  m	literalAt: 2 put: encoder associationForClass;
+ 				properties: properties.
+ 			^m].
+ 	primErrNode := self primitiveErrorVariableName ifNotNil:
+ 						[encoder fixTemp: self primitiveErrorVariableName].
+ 	encoder supportsClosureOpcodes ifTrue:
+ 		[self ensureClosureAnalysisDone.
+ 		 encoder rootNode: self. "this is for BlockNode>>sizeCodeForClosureValue:"].
+ 	blkSize := (block sizeCodeForEvaluatedValue: encoder)
+ 				+ (primErrNode
+ 					ifNil: [0]
+ 					ifNotNil: [primErrNode sizeCodeForStore: encoder "The VM relies on storeIntoTemp: (129)"]).
+ 	method := aCompiledMethodClass
+ 				newBytes: blkSize
+ 				trailerBytes: trailer 
+ 				nArgs: arguments size
+ 				nTemps: (encoder supportsClosureOpcodes
+ 							ifTrue: [| locals |
+ 									locals := arguments,
+ 											  temporaries,
+ 											  (primErrNode
+ 												ifNil: [#()]
+ 												ifNotNil: [{primErrNode}]).
+ 									encoder
+ 										noteBlockExtent: block blockExtent
+ 										hasLocals: locals.
+ 									locals size]
+ 							ifFalse: [encoder maxTemp])
+ 				nStack: 0
+ 				nLits: (nLits := (literals := encoder allLiterals) size)
+ 				primitive: primitive.
+ 	nLits > 255 ifTrue:
+ 		[^self error: 'Too many literals referenced'].
+ 	1 to: nLits do: [:lit | method literalAt: lit put: (literals at: lit)].
+ 	encoder streamToMethod: method.
+ 	stack := ParseStack new init.
+ 	primErrNode ifNotNil: [primErrNode emitCodeForStore: stack encoder: encoder].
+ 	stack position: method numTemps.
+ 	block emitCodeForEvaluatedValue: stack encoder: encoder.
+ 	stack position ~= (method numTemps + 1) ifTrue:
+ 		[^self error: 'Compiler stack discrepancy'].
+ 	encoder methodStreamPosition ~= (method size - trailer size) ifTrue:
+ 		[^self error: 'Compiler code size discrepancy'].
+ 	method needsFrameSize: stack size - method numTemps.
+ 	method properties: properties.
+ 	^method!

Item was added:
+ ----- Method: MethodNode>>generate:using:ifQuick: (in category 'code generation') -----
+ generate: trailer using: aCompiledMethodClass ifQuick: methodBlock
+ 	| v |
+ 	(primitive = 0 and: [arguments size = 0 and: [block isQuick]]) ifFalse:
+ 		[^self].
+ 	v := block code.
+ 	v < 0 ifTrue:
+ 		[^self].
+ 	v = LdSelf ifTrue:
+ 		[^methodBlock value: (aCompiledMethodClass toReturnSelfTrailerBytes: trailer)].
+ 	(v between: LdTrue and: LdMinus1 + 3) ifTrue:
+ 		[^methodBlock value: (aCompiledMethodClass toReturnConstant: v - LdSelf trailerBytes: trailer)].
+ 	v < ((CodeBases at: LdInstType) + (CodeLimits at: LdInstType)) ifTrue:
+ 		[^methodBlock value: (aCompiledMethodClass toReturnField: v trailerBytes: trailer)].
+ 	v // 256 = 1 ifTrue:
+ 		[^methodBlock value: (aCompiledMethodClass toReturnField: v \\ 256 trailerBytes: trailer)]!




More information about the Squeak-dev mailing list