VM Maker: VMMaker.oscog-eem.394.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-eem.394.mcz

commits-2
 
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.394.mcz

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

Name: VMMaker.oscog-eem.394
Author: eem
Time: 19 September 2013, 4:41:40.51 pm
UUID: ecd45400-0d67-4c39-9c8b-3210cf96a58b
Ancestors: VMMaker.oscog-eem.393

Rewrite send fault logic to do a 1st-level method lookup cache
probe after handling the send fault.  rename the handler to
handleForwardedSendFaultFor:.

Implement SMM>>byteSizeOf:.

Change the interpreter proxy API to include characterObjectOf:
and use it in FilePlugin>>primitiveDirectoryDelimitor.

Nuke unused method.

=============== Diff against VMMaker.oscog-eem.393 ===============

Item was changed:
  ----- Method: FilePlugin>>primitiveDirectoryDelimitor (in category 'directory primitives') -----
  primitiveDirectoryDelimitor
  | ascii |
  <export: true>
  ascii := self asciiDirectoryDelimiter.
+ interpreterProxy minorVersion >= 13
+ ifTrue:
+ [interpreterProxy
+ pop: 1
+ thenPush: (interpreterProxy characterObjectOf: ascii)]
+ ifFalse:
+ [(ascii >= 0 and: [ascii <= 255])
+ ifTrue:
+ [interpreterProxy
+ pop: 1
+ thenPush: (interpreterProxy
+ fetchPointer: ascii
+ ofObject: interpreterProxy characterTable)]
+ ifFalse:
+ [interpreterProxy primitiveFail]]!
- ((ascii >= 0) and: [ascii <= 255]) ifFalse:
- [^interpreterProxy primitiveFail].
- interpreterProxy
- pop: 1
- thenPush: (interpreterProxy fetchPointer: ascii ofObject: (interpreterProxy characterTable))!

Item was changed:
+ ----- Method: Spur32BitMMLESimulator>>booleanValueOf: (in category 'simulation only') -----
- ----- Method: Spur32BitMMLESimulator>>booleanValueOf: (in category 'C library simulation') -----
  booleanValueOf: obj
  "hack around the CoInterpreter/ObjectMemory split refactoring"
  ^coInterpreter booleanValueOf: obj!

Item was added:
+ ----- Method: Spur32BitMMLESimulator>>ioLoadFunction:From: (in category 'simulation only') -----
+ ioLoadFunction: functionString From: pluginString
+ "hack around the CoInterpreter/ObjectMemory split refactoring"
+ ^coInterpreter ioLoadFunction: functionString From: pluginString!

Item was removed:
- ----- Method: Spur32BitMMLESimulator>>is:KindOf: (in category 'simulation only') -----
- is: oop KindOf: classNameString
- "hack around the CoInterpreter/ObjectMemory split refactoring"
- ^coInterpreter is: oop KindOf: classNameString!

Item was removed:
- ----- Method: Spur32BitMMLESimulator>>methodArgumentCount (in category 'simulation only') -----
- methodArgumentCount
- "hack around the CoInterpreter/ObjectMemory split refactoring"
- ^coInterpreter methodArgumentCount!

Item was changed:
  ----- Method: SpurMemoryManager class>>vmProxyMinorVersion (in category 'simulation only') -----
  vmProxyMinorVersion
  "hack around the CoInterpreter/ObjectMemory split refactoring"
+ ^StackInterpreter vmProxyMinorVersion max: 13!
- ^StackInterpreter vmProxyMinorVersion!

Item was added:
+ ----- Method: SpurMemoryManager>>byteSizeOf: (in category 'object access') -----
+ byteSizeOf: oop
+ <api>
+ | format |
+ (self isImmediate: oop) ifTrue: [^0].
+ format := self formatOf: oop.
+ format < self sixtyFourBitIndexableFormat ifTrue:
+ [^(self numSlotsOf: oop) << self shiftForWord].
+ format >= self firstByteFormat ifTrue:
+ [^(self numSlotsOf: oop) << self shiftForWord - (format bitAnd: 7)].
+ format >= self firstShortFormat ifTrue:
+ [^(self numSlotsOf: oop) << self shiftForWord - ((format bitAnd: 3) << 1)].
+ format >= self firstLongFormat ifTrue:
+ [^(self numSlotsOf: oop) << self shiftForWord - ((format bitAnd: 1) << 2)].
+ ^(self numSlotsOf: oop) << self shiftForWord!

Item was added:
+ ----- Method: SpurMemoryManager>>interpreter (in category 'simulation') -----
+ interpreter
+ <doNotGenerate>
+ ^coInterpreter!

Item was changed:
  ----- Method: SpurMemoryManager>>isIntegerObject: (in category 'object testing') -----
  isIntegerObject: oop
  "This list records the valid senders of isIntegerObject: as we replace uses of
   isIntegerObject: by isImmediate: where appropriate."
  (#( DoIt
  DoItIn:
  makeBaseFrameFor:
  quickFetchInteger:ofObject:
  frameOfMarriedContext:
  objCouldBeClassObj:
  isMarriedOrWidowedContext:
  shortPrint:
  bytecodePrimAt
  bytecodePrimAtPut
  commonAt:
  commonAtPut:
  loadFloatOrIntFrom:
  positive32BitValueOf:
  primitiveExternalCall
  checkedIntegerValueOf:
  bytecodePrimAtPut
  commonAtPut:
  primitiveVMParameter
  checkIsStillMarriedContext:currentFP:
  displayBitsOf:Left:Top:Right:Bottom:
  fetchStackPointerOf:
  primitiveContextAt
  primitiveContextAtPut
  subscript:with:storing:format:
  printContext:
  compare31or32Bits:equal:
  signed64BitValueOf:
  primDigitMultiply:negative:
  digitLength:
  isNegativeIntegerValueOf:
  magnitude64BitValueOf:
+ primitiveMakePoint
+ primitiveAsCharacter
+ primitiveInputSemaphore
+ baseFrameReturn
+ primitiveExternalCall) includes: thisContext sender method selector) ifFalse:
- primitiveMakePoint) includes: thisContext sender method selector) ifFalse:
  [self halt].
  ^(oop bitAnd: 1) ~= 0!

Item was changed:
  ----- Method: StackInterpreter>>findNewMethodInClassTag: (in category 'message sending') -----
  findNewMethodInClassTag: classTag
  "Find the compiled method to be run when the current
  messageSelector is sent to the given class, setting the values
  of 'newMethod' and 'primitiveIndex'."
  | ok class |
  <inline: false>
  ok := self lookupInMethodCacheSel: messageSelector classTag: classTag.
  ok ifFalse: "entry was not found in the cache; look it up the hard way "
+ [(objectMemory isForwardedClassTag: lkupClassTag) ifTrue:
+ [lkupClassTag := self handleForwardedSendFaultFor: lkupClassTag.
+ ok := self lookupInMethodCacheSel: messageSelector classTag: lkupClassTag.
+ ok ifTrue:
+ [^nil]].
+ class := objectMemory classForClassTag: classTag.
- [class := self sendFaultFor: classTag.
  self lookupMethodInClass: class.
  self addNewMethodToCache: class]!

Item was added:
+ ----- Method: StackInterpreter>>handleForwardedSendFaultFor: (in category 'message sending') -----
+ handleForwardedSendFaultFor: classTag
+ "Handle a send fault that may be due to a send to a forwarded object.
+ Unforward the receiver on the stack and answer its actual class."
+ | rcvr |
+ (objectMemory isForwardedClassTag: classTag) ifFalse:
+ [^classTag].
+
+ rcvr := self stackValue: argumentCount.
+ "should *not* be a super send, so te receiver should be forwarded."
+ self assert: (objectMemory isOopForwarded: rcvr).
+ rcvr := objectMemory followForwarded: rcvr.
+ self stackValue: argumentCount put: rcvr.
+ self followForwardedFrameContents: framePointer
+ stackPointer: stackPointer + (argumentCount + 1 * BytesPerWord). "don't repeat effort"
+ (objectMemory isPointers: (self frameReceiver: framePointer)) ifTrue:
+ [objectMemory
+ followForwardedObjectFields: (self frameReceiver: framePointer)
+ toDepth: 0].
+ ^objectMemory fetchClassTagOf: rcvr!

Item was changed:
  ----- Method: StackInterpreter>>iframeInstructionPointerForIndex:method: (in category 'frame access') -----
  iframeInstructionPointerForIndex: ip method: aMethod
  "Answer the instruction pointer for use in an interpreter frame (a pointer to a bytecode)."
+ self assert: (ip between: (objectMemory lastPointerOf: aMethod) - 1
+ and: (objectMemory lengthOf: aMethod)).
+ ^aMethod + ip + objectMemory baseHeaderSize - 2!
- self assert: (ip between: (objectMemory lastPointerOf: aMethod) and: (objectMemory lengthOf: aMethod)).
- ^aMethod + ip + BaseHeaderSize - 2!

Item was changed:
  ----- Method: StackInterpreter>>internalFindNewMethod (in category 'message sending') -----
  internalFindNewMethod
  "Find the compiled method to be run when the current messageSelector is sent to the class 'lkupClass', setting the values of 'newMethod' and 'primitiveIndex'."
  | ok |
  <inline: true>
  ok := self lookupInMethodCacheSel: messageSelector classTag: lkupClassTag.
  ok ifFalse: "entry was not found in the cache; look it up the hard way"
  [self externalizeIPandSP.
+ (objectMemory isForwardedClassTag: lkupClassTag) ifTrue:
+ [lkupClassTag := self handleForwardedSendFaultFor: lkupClassTag.
+ ok := self lookupInMethodCacheSel: messageSelector classTag: lkupClassTag.
+ ok ifTrue:
+ [^nil]].
+ lkupClass := objectMemory classForClassTag: lkupClassTag.
- lkupClass := self sendFaultFor: lkupClassTag.
  self lookupMethodInClass: lkupClass.
  self internalizeIPandSP.
  self addNewMethodToCache: lkupClass]!

Item was removed:
- ----- Method: StackInterpreter>>sendFaultFor: (in category 'message sending') -----
- sendFaultFor: classTag
- "Handle a send fault that may be due to a send to a forwarded object.
- Unforward the receiver on the stack and answer its actual class."
- | rcvr |
- (objectMemory isForwardedClassTag: classTag) ifFalse:
- [^objectMemory classForClassTag: classTag].
-
- rcvr := self stackValue: argumentCount.
- "should *not* be a super send, so te receiver should be forwarded."
- self assert: (objectMemory isOopForwarded: rcvr).
- rcvr := objectMemory followForwarded: rcvr.
- self stackValue: argumentCount put: rcvr.
- self followForwardedFrameContents: framePointer
- stackPointer: stackPointer + (argumentCount + 1 * BytesPerWord). "don't repeat effort"
- (objectMemory isPointers: (self frameReceiver: framePointer)) ifTrue:
- [objectMemory
- followForwardedObjectFields: (self frameReceiver: framePointer)
- toDepth: 0].
- ^objectMemory fetchClassOf: rcvr!

Item was changed:
  ----- Method: StackInterpreterPrimitives>>primitiveSignalAtMilliseconds (in category 'system control primitives') -----
  primitiveSignalAtMilliseconds
  "Cause the time semaphore, if one has been registered, to be
  signalled when the microsecond clock is greater than or equal to
  the given tick value. A tick value of zero turns off timer interrupts."
  | msecsObj msecs deltaMsecs sema |
  <var: #msecs type: #usqInt>
  msecsObj := self stackTop.
  sema := self stackValue: 1.
  msecs := self positive32BitValueOf: msecsObj.
  (self failed
+ or: [objectMemory isImmediate: sema]) ifTrue:
- or: [objectMemory isIntegerObject: sema]) ifTrue:
  [self primitiveFail.
  ^nil].
  (objectMemory fetchClassOfNonImm: sema) = (objectMemory splObj: ClassSemaphore)
  ifTrue:
  [objectMemory splObj: TheTimerSemaphore put: sema.
  deltaMsecs := msecs - (self ioMSecs bitAnd: MillisecondClockMask).
  deltaMsecs < 0 ifTrue:
  [deltaMsecs := deltaMsecs + MillisecondClockMask + 1].
  nextWakeupUsecs := self ioUTCMicroseconds + (deltaMsecs * 1000)]
  ifFalse:
  [objectMemory
  storePointer: TheTimerSemaphore
  ofObject: objectMemory specialObjectsOop
  withValue: objectMemory nilObject.
  nextWakeupUsecs := 0].
  self pop: 2!

Item was added:
+ ----- Method: StackInterpreterSimulator>>imageName (in category 'spur bootstrap') -----
+ imageName
+ ^imageName!

Item was added:
+ ----- Method: StackInterpreterSimulator>>imageName: (in category 'spur bootstrap') -----
+ imageName: aString
+ imageName := aString!

Item was removed:
- ----- Method: VMClass class>>emitInterpreterProxyVersionOn: (in category 'api version') -----
- emitInterpreterProxyVersionOn: aStream
- aStream
- nextPutAll: '#define VM_PROXY_MAJOR '; print: self vmProxyMajorVersion; cr;
- nextPutAll: '#define VM_PROXY_MINOR '; print: self vmProxyMinorVersion; cr; cr!