Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.140.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.140 Author: eem Time: 9 December 2011, 4:15:07.432 pm UUID: 2487009c-2c13-4609-b89e-77f0e195f433 Ancestors: VMMaker.oscog-eem.139
Stop the backward jump compilation variables being localised to interpret. If this happens the unoptimized debug VM can behave very differently to the optimized VMs. Use definedAsMacro in tryToInlineMethodsIn: instead of accessing properties directly (i.e. as other senders of definedAsMacro).
=============== Diff against VMMaker.oscog-eem.139 ===============
Item was changed: ----- Method: CoInterpreter>>longUnconditionalJump (in category 'jump bytecodes') ----- longUnconditionalJump | offset switched | offset := (((currentBytecode bitAnd: 7) - 4) * 256) + self fetchByte. localIP := localIP + offset. "backward jump means we're in a loop. - check for possible interrupts. - check for long-running loops and JIT if appropriate." offset < 0 ifTrue: [localSP < stackLimit ifTrue: [self externalizeIPandSP. switched := self checkForEventsMayContextSwitch: true. self returnToExecutive: true postContextSwitch: switched. self browserPluginReturnIfNeeded. self internalizeIPandSP]. method = lastBackwardJumpMethod ifTrue: [(backwardJumpCount := backwardJumpCount - 1) <= 0 ifTrue: [(self methodWithHeaderShouldBeCogged: (self headerOf: method)) ifTrue: [self externalizeFPandSP. + self resetBackwardJumpVariables. "only to force variables to be global" self attemptToSwitchToMachineCode: (self oopForPointer: localIP) - offset - method - BaseHeaderSize - 1] ifFalse: "don't ask if one should compile a second time..." [backwardJumpCount := 1 bitShift: BytesPerWord * 8 - 2]]] ifFalse: [lastBackwardJumpMethod := method. backwardJumpCount := minBackwardJumpCountForCompile]]. self fetchNextBytecode!
Item was added: + ----- Method: CoInterpreter>>resetBackwardJumpVariables (in category 'jump bytecodes') ----- + resetBackwardJumpVariables + "Reference these variables from outside interpret to avoid them being localised to interpret. + Oh the hacks we commit for Slang..." + <cmacro: '() /* nada */'> + <inline: #false> + lastBackwardJumpMethod := lastBackwardJumpMethod. + backwardJumpCount := backwardJumpCount!
Item was changed: ----- Method: TMethod>>tryToInlineMethodsIn: (in category 'inlining') ----- tryToInlineMethodsIn: aCodeGen "Expand any (complete) inline methods called by this method. Set the complete bit when all inlining has been done. Return true if something was inlined."
| stmtLists didSomething newStatements sendsToInline | + self definedAsMacro ifTrue: - (properties includesKey: #cmacro:) ifTrue: [complete := true. ^false]. didSomething := false. sendsToInline := Dictionary new: 100. parseTree nodesDo: [ :n | (self inlineableFunctionCall: n in: aCodeGen) ifTrue: [sendsToInline at: n put: (self inlineFunctionCall: n in: aCodeGen)]] unless: "Don't inline the arguments to asserts to keep the asserts readable" [:n| n isSend and: [#(cCode:inSmalltalk: assert:) includes: n selector]].
sendsToInline isEmpty ifFalse: [didSomething := true. parseTree := parseTree replaceNodesIn: sendsToInline].
didSomething ifTrue: [writtenToGlobalVarsCache := nil. ^didSomething].
stmtLists := self statementsListsForInlining. stmtLists do: [ :stmtList | newStatements := OrderedCollection new: 100. stmtList statements do: [ :stmt | (self inlineCodeOrNilForStatement: stmt in: aCodeGen) ifNil: [newStatements addLast: stmt] ifNotNil: [:inlinedStmts| didSomething := true. newStatements addAllLast: inlinedStmts]]. stmtList setStatements: newStatements asArray].
didSomething ifTrue: [writtenToGlobalVarsCache := nil. ^didSomething].
complete ifFalse: [self checkForCompleteness: stmtLists in: aCodeGen. complete ifTrue: [ didSomething := true ]]. "marking a method complete is progress" ^didSomething!
vm-dev@lists.squeakfoundation.org