VM Maker: VMMaker-oscog-EstebanLorenzano.140.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker-oscog-EstebanLorenzano.140.mcz

commits-2
 
Esteban Lorenzano uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker-oscog-EstebanLorenzano.140.mcz

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

Name: VMMaker-oscog-EstebanLorenzano.140
Author: EstebanLorenzano
Time: 18 November 2011, 6:03:18 pm
UUID: 1961b8af-fb68-4813-89a9-67f2401441d0
Ancestors: VMMaker-oscog-EstebanLorenzano.139, VMMaker.oscog-eem.139

-merged with Eliot's 139. Everything seems to work


=============== Diff against VMMaker-oscog-EstebanLorenzano.139 ===============

Item was changed:
  ----- Method: CogMethodZone>>compactCompiledCode: (in category 'compaction') -----
  compactCompiledCode: objectHeaderValue
  | source dest bytes |
  <var: #source type: #'CogMethod *'>
  <var: #dest type: #'CogMethod *'>
  source := coInterpreter cCoerceSimple: baseAddress to: #'CogMethod *'.
  openPICList := nil.
  [source < self limitZony
  and: [source cmType ~= CMFree]] whileTrue:
  [self assert: (cogit cogMethodDoesntLookKosher: source) = 0.
  source objectHeader: objectHeaderValue.
  source cmUsageCount > 0 ifTrue:
  [source cmUsageCount: source cmUsageCount // 2].
  source cmType = CMOpenPIC ifTrue:
  [source nextOpenPIC: openPICList asUnsignedInteger.
  openPICList := source].
  source := self methodAfter: source].
  source >= self limitZony ifTrue:
  [^self halt: 'no free methods; cannot compact.'].
  dest := source.
  [source < self limitZony] whileTrue:
  [self assert: (cogit maybeFreeCogMethodDoesntLookKosher: source) = 0.
  bytes := source blockSize.
  source cmType ~= CMFree ifTrue:
  [self mem: dest mo: source ve: bytes.
  dest objectHeader: objectHeaderValue.
  dest cmType = CMMethod
  ifTrue:
  ["For non-Newspeak there should ne a one-to-one mapping metween bytecoded and
   cog methods. For Newspeak not necessarily, but only for anonymous accessors."
  self assert: ((coInterpreter rawHeaderOf: dest methodObject) asInteger = source asInteger
+ or: [(cogit noAssertMethodClassAssociationOf: dest methodObject) = objectMemory nilObject]).
- or: [(coInterpreter noAssertMethodClassAssociationOf: dest methodObject) = objectMemory nilObject]).
  "Only update the original method's header if it is referring to this CogMethod."
  (coInterpreter rawHeaderOf: dest methodObject) asInteger = source asInteger ifTrue:
  [coInterpreter rawHeaderOf: dest methodObject put: dest asInteger]]
  ifFalse:
  [dest cmType = CMOpenPIC ifTrue:
  [dest nextOpenPIC: openPICList asUnsignedInteger.
  openPICList := dest]].
  dest cmUsageCount > 0 ifTrue:
  [dest cmUsageCount: dest cmUsageCount // 2].
  dest := coInterpreter
  cCoerceSimple: dest asInteger + bytes
  to: #'CogMethod *'].
  source := coInterpreter
  cCoerceSimple: source asInteger + bytes
  to: #'CogMethod *'].
  mzFreeStart := dest asInteger.
  methodBytesFreedSinceLastCompaction := 0!

Item was removed:
- ----- Method: CogVMSimulator>>printCallStackOf: (in category 'debug printing') -----
- printCallStackOf: aContext
- self printCallStackOf: aContext currentFP: localFP!

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 assert: ((coInterpreter methodHasCogMethod: aMethodObj) not
+ or: [(self noAssertMethodClassAssociationOf: aMethodObj) = objectMemory nilObject]).
- or: [(coInterpreter noAssertMethodClassAssociationOf: aMethodObj) = objectMemory nilObject]).
  "coInterpreter stringOf: aSelectorOop"
  coInterpreter
  compilationBreak: aSelectorOop
  point: (objectMemory lengthOf: aSelectorOop).
  aMethodObj = breakMethod ifTrue: [self halt: 'Compilation of breakMethod'].
  self cppIf: 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]].
  methodObj := aMethodObj.
  cogMethod := self compileCogMethod: aSelectorOop.
  (cogMethod asInteger between: MaxNegativeErrorCode and: -1) ifTrue:
  [cogMethod asInteger >= MaxUnreportableError
  ifTrue:
  [cogMethod asInteger = InsufficientCodeSpace ifTrue:
  [coInterpreter callForCogCompiledCodeCompaction]]
  ifFalse:
  [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>>mapObjectReferencesInMachineCodeForBecome (in category 'garbage collection') -----
  mapObjectReferencesInMachineCodeForBecome
  "Update all references to objects in machine code for a become.
  Unlike incrementalGC or fullGC a method that does not refer to young
  may refer to young as a result of the become operation."
  | cogMethod hasYoungObj hasYoungObjPtr freedPIC |
  <var: #cogMethod type: #'CogMethod *'>
  hasYoungObj := false.
  hasYoungObjPtr := self cCode: [(self addressOf: hasYoungObj) asInteger]
  inSmalltalk: [CPluggableAccessor new
  setObject: nil;
  atBlock: [:obj :idx| hasYoungObj]
  atPutBlock: [:obj :idx :val| hasYoungObj := val]].
  codeModified := freedPIC := false.
  self mapObjectReferencesInGeneratedRuntime.
  cogMethod := self cCoerceSimple: methodZoneBase to: #'CogMethod *'.
  [cogMethod < methodZone limitZony] whileTrue:
  [self assert: hasYoungObj not.
  cogMethod cmType ~= CMFree ifTrue:
  [self assert: (self cogMethodDoesntLookKosher: cogMethod) = 0.
  cogMethod selector: (objectRepresentation remapOop: cogMethod selector)..
  cogMethod cmType = CMClosedPIC
  ifTrue:
  [((objectMemory isYoung: cogMethod selector)
    or: [self mapObjectReferencesInClosedPIC: cogMethod]) ifTrue:
  [freedPIC := true.
  methodZone freeMethod: cogMethod]]
  ifFalse:
  [(objectMemory isYoung: cogMethod selector) ifTrue:
  [hasYoungObj := true].
  cogMethod cmType = CMMethod ifTrue:
  [self assert: cogMethod objectHeader = objectMemory nullHeaderForMachineCodeMethod.
  cogMethod methodObject: (objectRepresentation remapOop: cogMethod methodObject).
  self assert: ((coInterpreter rawHeaderOf: cogMethod methodObject) = cogMethod asInteger
+ or: [(self noAssertMethodClassAssociationOf: cogMethod methodObject)
- or: [(coInterpreter noAssertMethodClassAssociationOf: cogMethod methodObject)
  = objectMemory nilObject]).
  (objectMemory isYoung: cogMethod methodObject) ifTrue:
  [hasYoungObj := true]].
  self mapFor: cogMethod
  performUntil: (self cppIf: NewspeakVM
  ifTrue: [#remapNSIfObjectRef:pc:hasYoung: asSymbol]
  ifFalse: [#remapIfObjectRef:pc:hasYoung: asSymbol])
  arg: hasYoungObjPtr.
  hasYoungObj
  ifTrue:
  [cogMethod cmRefersToYoung ifFalse:
  [cogMethod cmRefersToYoung: true.
  methodZone addToYoungReferrers: cogMethod].
  hasYoungObj := false]
  ifFalse: [cogMethod cmRefersToYoung: false]]].
  cogMethod := methodZone methodAfter: cogMethod].
  methodZone pruneYoungReferrers.
  freedPIC ifTrue:
  [self unlinkSendsToFree.
  codeModified := true].
  codeModified ifTrue: "After updating oops in inline caches we need to flush the icache."
  [processor flushICacheFrom: codeBase to: methodZone limitZony asInteger]!

Item was added:
+ ----- Method: CurrentImageCoInterpreterFacade>>interpretAddress (in category 'accessing') -----
+ interpretAddress
+ ^self addressForLabel: #interpret!

Item was added:
+ ----- Method: CurrentImageCoInterpreterFacade>>primitiveFailAddress (in category 'accessing') -----
+ primitiveFailAddress
+ ^self addressForLabel: #primitiveFail!

Item was changed:
  ----- Method: IA32ABIPlugin class>>simulatorClass (in category 'simulation only') -----
  simulatorClass
+ ^NewspeakVM ifFalse: [IA32ABIPluginSimulator]!
- ^IA32ABIPluginSimulator!

Item was added:
+ ----- Method: IA32ABIPluginSimulator>>longAt: (in category 'memory access') -----
+ longAt: byteAddress
+ ^interpreterProxy longAt: byteAddress!

Item was added:
+ ----- Method: IA32ABIPluginSimulator>>longAt:put: (in category 'memory access') -----
+ longAt: byteAddress put: a32BitValue
+ ^interpreterProxy longAt: byteAddress put: a32BitValue!

Item was added:
+ ----- Method: NewCoObjectMemorySimulator class>>vmProxyMajorVersion (in category 'simulation only') -----
+ vmProxyMajorVersion
+ "hack around the CoInterpreter/ObjectMemory split refactoring"
+ ^CoInterpreter vmProxyMajorVersion!

Item was added:
+ ----- Method: NewCoObjectMemorySimulator class>>vmProxyMinorVersion (in category 'simulation only') -----
+ vmProxyMinorVersion
+ "hack around the CoInterpreter/ObjectMemory split refactoring"
+ ^CoInterpreter vmProxyMinorVersion!

Item was added:
+ ----- Method: NewCoObjectMemorySimulator>>internalIsImmutable: (in category 'simulation only') -----
+ internalIsImmutable: oop
+ "hack around the CoInterpreter/ObjectMemory split refactoring"
+ ^coInterpreter internalIsImmutable: oop!

Item was added:
+ ----- Method: NewCoObjectMemorySimulator>>methodReturnValue: (in category 'simulation only') -----
+ methodReturnValue: oop
+ "hack around the CoInterpreter/ObjectMemory split refactoring"
+ ^coInterpreter methodReturnValue: oop!

Item was added:
+ ----- Method: NewCoObjectMemorySimulator>>signed32BitIntegerFor: (in category 'simulation only') -----
+ signed32BitIntegerFor: integerValue
+ "hack around the CoInterpreter/ObjectMemory split refactoring"
+ ^coInterpreter signed32BitIntegerFor: integerValue!

Item was added:
+ ----- Method: NewCoObjectMemorySimulator>>signed32BitValueOf: (in category 'simulation only') -----
+ signed32BitValueOf: oop
+ "hack around the CoInterpreter/ObjectMemory split refactoring"
+ ^coInterpreter signed32BitValueOf: oop!

Item was changed:
  ----- Method: NewspeakInterpreter>>shortPrintOop: (in category 'debug printing') -----
  shortPrintOop: oop
  <inline: false>
+ self printHex: oop.
- self printNum: oop.
  (self isIntegerObject: oop) ifTrue:
  [^self cCode: 'printf("=%ld\n", integerValueOf(oop))' inSmalltalk: [self print: (self shortPrint: oop); cr]].
  (oop between: self startOfMemory and: freeBlock) ifFalse:
  [self printHex: oop; print: ' is not on the heap'; cr.
  ^nil].
  (oop bitAnd: (BytesPerWord - 1)) ~= 0 ifTrue:
  [self printHex: oop; print: ' is misaligned'; cr.
  ^nil].
  self print: ': a(n) '.
  self printNameOfClass: (self fetchClassOf: oop) count: 5.
  self cr!

Item was changed:
  ----- Method: NewsqueakIA32ABIPlugin class>>simulatorClass (in category 'simulation only') -----
  simulatorClass
+ ^NewspeakVM ifTrue: [NewsqueakIA32ABIPluginSimulator]!
- ^NewsqueakIA32ABIPluginSimulator!

Item was changed:
+ NewsqueakIA32ABIPlugin subclass: #NewsqueakIA32ABIPluginSimulator
- IA32ABIPlugin subclass: #NewsqueakIA32ABIPluginSimulator
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
  category: 'VMMaker-Plugins-Alien'!

Item was added:
+ ----- Method: NewsqueakIA32ABIPluginSimulator>>longAt: (in category 'memory access') -----
+ longAt: byteAddress
+ ^interpreterProxy longAt: byteAddress!

Item was added:
+ ----- Method: NewsqueakIA32ABIPluginSimulator>>longAt:put: (in category 'memory access') -----
+ longAt: byteAddress put: a32BitValue
+ ^interpreterProxy longAt: byteAddress put: a32BitValue!

Item was changed:
  ----- Method: StackInterpreter>>activeProcess (in category 'process primitive support') -----
  activeProcess
  "Answer the current activeProcess."
+ <api> "useful for VM debugging"
  ^objectMemory fetchPointer: ActiveProcessIndex ofObject: self schedulerPointer!

Item was added:
+ ----- Method: StackInterpreter>>internalIsImmutable: (in category 'object format') -----
+ internalIsImmutable: oop
+ <option: #NewspeakVM>
+ <inline: true>
+ <export: true>
+ ^((objectMemory baseHeader: oop) bitAnd: ImmutabilityBit) ~= 0!

Item was changed:
  ----- Method: StackInterpreter>>longPrintOop: (in category 'debug printing') -----
  longPrintOop: oop
  <api>
  | fmt lastIndex startIP bytecodesPerLine |
  ((objectMemory isIntegerObject: oop)
  or: [(oop between: objectMemory startOfMemory and: objectMemory freeStart) not
  or: [(oop bitAnd: (BytesPerWord - 1)) ~= 0
  or: [(objectMemory isFreeObject: oop)
  or: [(fmt := objectMemory formatOf: oop) between: 5 and: 11]]]]) ifTrue:
  [^self printOop: oop].
  self printHex: oop;
  print: ': a(n) ';
  printNameOfClass: (objectMemory fetchClassOfNonInt: oop) count: 5.
  fmt > 4 ifTrue:
  [self print: ' nbytes '; printNum: (objectMemory byteSizeOf: oop)].
  self cr.
  lastIndex := 64 min: (startIP := (objectMemory lastPointerOf: oop) / BytesPerWord).
  lastIndex > 0 ifTrue:
  [1 to: lastIndex do:
  [:index| | fieldOop |
  fieldOop := objectMemory fetchPointer: index - 1 ofObject: oop.
  self space; printHex: fieldOop; space; printOopShort: fieldOop; cr]].
  (objectMemory isCompiledMethod: oop)
  ifFalse:
  [startIP > 64 ifTrue: [self print: '...'; cr]]
  ifTrue:
  [startIP := startIP * BytesPerWord + 1.
  lastIndex := objectMemory lengthOf: oop.
+ lastIndex - startIP > 104 ifTrue:
+ [lastIndex := startIP + 103].
- lastIndex - startIP > 100 ifTrue:
- [lastIndex := startIP + 100].
  bytecodesPerLine := 8.
  startIP to: lastIndex do:
  [:index| | byte |
  byte := objectMemory fetchByte: index - 1 ofObject: oop.
  self cCode: 'printf(" %02x/%-3d", byte,byte)'
  inSmalltalk: [self space; print: (byte radix: 16); printChar: $/; printNum: byte].
+ (index = lastIndex and: [(objectMemory lengthOf: oop) > index]) ifTrue:
+ [self print: '...'].
  ((index - startIP + 1) \\ bytecodesPerLine) = 0 ifTrue:
  [self cr]].
  ((lastIndex - startIP + 1) \\ bytecodesPerLine) = 0 ifFalse:
  [self cr]]!

Item was changed:
  ----- Method: StackInterpreter>>printContext: (in category 'debug printing') -----
  printContext: aContext
  | sender ip sp |
  <inline: false>
  self shortPrintContext: aContext.
  sender := objectMemory fetchPointer: SenderIndex ofObject: aContext.
  ip := objectMemory fetchPointer: InstructionPointerIndex ofObject: aContext.
  (objectMemory isIntegerObject: sender)
  ifTrue:
  [(self checkIsStillMarriedContext: aContext currentFP: framePointer)
  ifTrue: [self print: 'married (assuming framePointer valid)'; cr]
  ifFalse: [self print: 'widdowed (assuming framePointer valid)'; cr].
  self print: 'sender   '; printNum: sender; print: ' (';
  printHexPtr: (self withoutSmallIntegerTags: sender); printChar: $); cr.
  self print: 'ip       '; printNum: ip; print: ' (';
  printHexPtr: (self withoutSmallIntegerTags: ip); printChar: $); cr]
  ifFalse:
  [self print: 'sender   '; shortPrintOop: sender.
+ self print: 'ip       '.
+ ip = objectMemory nilObject
+ ifTrue: [self shortPrintOop: ip]
+ ifFalse: [self printNum: ip; print: ' ('; printNum: (objectMemory integerValueOf: ip); space; printHex: (objectMemory integerValueOf: ip); printChar: $); cr]].
- self print: 'ip       '; printNum: ip; print: ' ('; printNum: (objectMemory integerValueOf: ip); space; printHex: (objectMemory integerValueOf: ip); printChar: $); cr].
  sp := objectMemory fetchPointer: StackPointerIndex ofObject: aContext.
  sp := sp min: (objectMemory lengthOf: aContext) - ReceiverIndex.
  self print: 'sp       '; printNum: sp; print: ' ('; printNum: (objectMemory integerValueOf: sp); printChar: $); cr.
  self print: 'method   '; shortPrintOop: (objectMemory fetchPointer: MethodIndex ofObject: aContext).
  self print: 'closure  '; shortPrintOop: (objectMemory fetchPointer: ClosureIndex ofObject: aContext).
  self print: 'receiver '; shortPrintOop: (objectMemory fetchPointer: ReceiverIndex ofObject: aContext).
  sp := objectMemory integerValueOf: sp.
  1 to: sp do:
  [:i|
  self print: '       '; printNum: i; space; shortPrintOop: (objectMemory fetchPointer: ReceiverIndex + i ofObject: aContext)]!

Item was changed:
  ----- Method: StackInterpreter>>shortPrintContext: (in category 'debug printing') -----
  shortPrintContext: aContext
+ | home theFP |
- | home |
  <inline: false>
+ <var: #theFP type: #'char *'>
  (self isContext: aContext) ifFalse:
  [self printHex: aContext; print: ' is not a context'; cr.
  ^nil].
  home := self findHomeForContext: aContext.
+ self printHex: aContext.
- self printNum: aContext.
  (self isMarriedOrWidowedContext: aContext)
+ ifTrue: [(self checkIsStillMarriedContext: aContext currentFP: framePointer)
+ ifTrue:
+ [(self isMachineCodeFrame: (theFP := self frameOfMarriedContext: aContext))
+ ifTrue: [self print: ' M (']
+ ifFalse: [self print: ' I ('].
+ self printHex: theFP; print: ') ']
+ ifFalse:
+ [self print: ' w ']]
- ifTrue: [((self checkIsStillMarriedContext: aContext currentFP: framePointer)
- and: [self isMachineCodeFrame: (self frameOfMarriedContext: aContext)])
- ifTrue: [self print: ' m ']
- ifFalse: [self print: ' i ']]
  ifFalse: [self print: ' s '].
  self printActivationNameFor: (objectMemory fetchPointer: MethodIndex ofObject: home)
  receiver: (objectMemory fetchPointer: ReceiverIndex ofObject: home)
  isBlock: home ~= aContext
  firstTemporary: (objectMemory fetchPointer: 0 + CtxtTempFrameStart ofObject: home).
  self cr!

Item was changed:
  ----- Method: StackInterpreter>>shortPrintFrame: (in category 'debug printing') -----
  shortPrintFrame: theFP
  <inline: false>
  <var: #theFP type: #'char *'>
  | rcvr |
+ (stackPages couldBeFramePointer: theFP) ifFalse:
+ [self print: 'invalid frame pointer'; cr.
- theFP = 0 ifTrue:
- [self print: 'null fp'; cr.
  ^nil].
  rcvr := self frameReceiver: theFP.
  self printHexPtr: theFP.
  self space.
  self printActivationNameFor: (self frameMethod: theFP)
  receiver: rcvr
  isBlock: (self frameIsBlockActivation: theFP)
  firstTemporary: (self temporary: 0 in: theFP).
  self space.
  self shortPrintOop: rcvr "shortPrintOop: adds a cr"!

Item was changed:
  ----- Method: StackInterpreter>>shortPrintFrame:AndNCallers: (in category 'debug printing') -----
  shortPrintFrame: theFP AndNCallers: n
  <api>
  <inline: false>
  <var: #theFP type: #'char *'>
+ (n ~= 0 and: [stackPages couldBeFramePointer: theFP]) ifTrue:
- (n > 0 and: [stackPages couldBeFramePointer: theFP]) ifTrue:
  [self shortPrintFrame: theFP.
  self shortPrintFrame: (self frameCallerFP: theFP) AndNCallers: n - 1]!

Item was removed:
- ----- Method: StackInterpreterSimulator>>printCallStackOf: (in category 'debug printing') -----
- printCallStackOf: aContext
- self printCallStackOf: aContext currentFP: localFP!

Item was added:
+ ----- Method: StackToRegisterMappingCogit>>isValidFramelessRegister: (in category 'testing') -----
+ isValidFramelessRegister: reg
+ "Answer if the receiver is valid in a frameless method."
+ ^reg = ReceiverResultReg or: [reg = Arg0Reg]!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>ssFlushUpThroughReceiverVariable: (in category 'simulation stack') -----
  ssFlushUpThroughReceiverVariable: slotIndex
+ "Any occurrences on the stack of the value being stored (which is the top of stack)
+ must be flushed, and hence any values colder than them stack."
- "Any occurrences on the stack of the value being stored must
- be flushed, and hence any values colder than them stack."
  <var: #desc type: #'CogSimStackEntry *'>
+ simStackPtr - 1 to: (simSpillBase max: 0) by: -1 do:
- simStackPtr to: (simSpillBase max: 0) by: -1 do:
  [:index| | desc |
  desc := self simStackAt: index.
  (desc type = SSBaseOffset
  and: [desc register = ReceiverResultReg
  and: [desc offset = (objectRepresentation slotOffsetOfInstVarIndex: slotIndex)]]) ifTrue:
  [self ssFlushTo: index.
  ^self]]!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>ssFlushUpThroughTemporaryVariable: (in category 'simulation stack') -----
  ssFlushUpThroughTemporaryVariable: tempIndex
+ "Any occurrences on the stack of the value being stored (which is the top of stack)
+ must be flushed, and hence any values colder than them stack."
- "Any occurrences on the stack of the value being stored must
- be flushed, and hence any values colder than them stack."
  <var: #desc type: #'CogSimStackEntry *'>
+ simStackPtr - 1 to: simSpillBase by: -1 do:
- simStackPtr to: simSpillBase by: -1 do:
  [:index| | desc |
  desc := self simStackAt: index.
  (desc type = SSBaseOffset
  and: [desc register = FPReg
  and: [desc offset = (self frameOffsetOfTemporary: tempIndex)]]) ifTrue:
  [self ssFlushTo: index.
  ^self]]!

Item was changed:
  ----- Method: VMMaker>>logDateAndTime (in category 'UI access') -----
  logDateAndTime
+ | now |
+ "do it this way since Time now includes milliseconds in some versions."
+ now := Time dateAndTimeNow.
+ logger print: now first; space; print: now last; cr; flush!
- logger print: Date today; space; print: Time now; cr; flush.!