[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
|