ClementBera uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-cb.1944.mcz
==================== Summary ====================
Name: VMMaker.oscog-cb.1944 Author: cb Time: 6 September 2016, 5:25:54.75903 pm UUID: 8a25f110-e70d-4ba3-b7b5-c36af4934c16 Ancestors: VMMaker.oscog-cb.1943
Added assertion ensuring that when a method is jitted, the compiled code jitted is a compiled method and when a block is jitted, the compiled code jitted is a compiled block.
=============== Diff against VMMaker.oscog-cb.1943 ===============
Item was changed: ----- Method: Cogit>>cog:selector: (in category 'jit - api') ----- cog: aMethodObj selector: aSelectorOop "Attempt to produce a machine code method for the bytecode method object aMethodObj. N.B. If there is no code memory available do *NOT* attempt to reclaim the method zone. Certain clients (e.g. ceSICMiss:) depend on the zone remaining constant across method generation." <api> <returnTypeC: #'CogMethod *'> | cogMethod | <var: #cogMethod type: #'CogMethod *'> (self exclude: aMethodObj selector: aSelectorOop) ifTrue: [^nil]. "In Newspeak we support anonymous accessors and hence tolerate the same method being cogged multiple times. But only if the method class association is nil." NewspeakVM ifTrue: [(coInterpreter methodHasCogMethod: aMethodObj) ifTrue: [cogMethod := coInterpreter cogMethodOf: aMethodObj. self deny: cogMethod selector = aSelectorOop. cogMethod selector = aSelectorOop ifTrue: [^cogMethod]. (coInterpreter methodClassAssociationOf: aMethodObj) ~= objectMemory nilObject ifTrue: [self cCode: 'extern void *firstIndexableField(sqInt)'. "Slang, au natural" self warnMultiple: cogMethod selectors: aSelectorOop. ^nil]]] ifFalse: [self deny: (coInterpreter methodHasCogMethod: aMethodObj)]. + self deny: (objectMemory isCompiledMethod: (coInterpreter ultimateLiteralOf: aMethodObj)). "coInterpreter stringOf: aSelectorOop" coInterpreter compilationBreak: aSelectorOop point: (objectMemory lengthOf: aSelectorOop) isMNUCase: false. aMethodObj = breakMethod ifTrue: [self halt: 'Compilation of breakMethod']. NewspeakVM ifTrue: [cogMethod := methodZone findPreviouslyCompiledVersionOf: aMethodObj with: aSelectorOop. cogMethod ifNotNil: [(coInterpreter methodHasCogMethod: aMethodObj) not ifTrue: [self assert: (coInterpreter rawHeaderOf: aMethodObj) = cogMethod methodHeader. cogMethod methodObject: aMethodObj. coInterpreter rawHeaderOf: aMethodObj put: cogMethod asInteger]. ^cogMethod]]. "If the generators for the alternate bytecode set are missing then interpret." (coInterpreter methodUsesAlternateBytecodeSet: aMethodObj) ifTrue: [(self numElementsIn: generatorTable) <= 256 ifTrue: [^nil]. bytecodeSetOffset := 256] ifFalse: [bytecodeSetOffset := 0]. objectRepresentation ensureNoForwardedLiteralsIn: aMethodObj. methodObj := aMethodObj. methodHeader := objectMemory methodHeaderOf: aMethodObj. cogMethod := self compileCogMethod: aSelectorOop. (cogMethod asInteger between: MaxNegativeErrorCode and: -1) ifTrue: [cogMethod asInteger = InsufficientCodeSpace ifTrue: [coInterpreter callForCogCompiledCodeCompaction]. self maybeFreeCounters. "Right now no errors should be reported, so nothing more to do." "self reportError: (self cCoerceSimple: cogMethod to: #sqInt)." ^nil]. "self cCode: '' inSmalltalk: [coInterpreter printCogMethod: cogMethod. ""coInterpreter symbolicMethod: aMethodObj."" self assertValidMethodMap: cogMethod." "self disassembleMethod: cogMethod." "printInstructions := clickConfirm := true""]." ^cogMethod!
Item was changed: ----- Method: Cogit>>cogFullBlockMethod:numCopied: (in category 'jit - api') ----- cogFullBlockMethod: aMethodObj numCopied: numCopied "Attempt to produce a machine code method for the bytecode method object aMethodObj. N.B. If there is no code memory available do *NOT* attempt to reclaim the method zone. Certain clients (e.g. ceSICMiss:) depend on the zone remaining constant across method generation." <api> <option: #SistaV1BytecodeSet> <returnTypeC: #'CogMethod *'> | cogMethod | <var: #cogMethod type: #'CogMethod *'> self cCode: [] inSmalltalk: "for debugging, allow excluding methods based on selector or methodClass" [self class initializationOptions at: #DoNotJIT ifPresent: [:excluded| (excluded anySatisfy: [:exclude| aMethodObj = exclude]) ifTrue: [coInterpreter transcript nextPutAll: 'EXCLUDING '; nextPutAll: aMethodObj; nextPutAll: ' (compiled block)'; cr; flush. ^nil]]]. self deny: (coInterpreter methodHasCogMethod: aMethodObj). + self assert: (objectMemory isCompiledMethod: (coInterpreter ultimateLiteralOf: aMethodObj)). aMethodObj = breakMethod ifTrue: [self halt: 'Compilation of breakMethod']. "If the generators for the alternate bytecode set are missing then interpret." (coInterpreter methodUsesAlternateBytecodeSet: aMethodObj) ifTrue: [(self numElementsIn: generatorTable) <= 256 ifTrue: [^nil]. bytecodeSetOffset := 256] ifFalse: [bytecodeSetOffset := 0]. objectRepresentation ensureNoForwardedLiteralsIn: aMethodObj. methodObj := aMethodObj. methodHeader := objectMemory methodHeaderOf: aMethodObj. cogMethod := self compileCogFullBlockMethod: numCopied. (cogMethod asInteger between: MaxNegativeErrorCode and: -1) ifTrue: [cogMethod asInteger = InsufficientCodeSpace ifTrue: [coInterpreter callForCogCompiledCodeCompaction]. self maybeFreeCounters. "Right now no errors should be reported, so nothing more to do." "self reportError: (self cCoerceSimple: cogMethod to: #sqInt)." ^nil]. "self cCode: '' inSmalltalk: [coInterpreter printCogMethod: cogMethod. ""coInterpreter symbolicMethod: aMethodObj."" self assertValidMethodMap: cogMethod." "self disassembleMethod: cogMethod." "printInstructions := clickConfirm := true""]." ^cogMethod!
vm-dev@lists.squeakfoundation.org