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! |
Free forum by Nabble | Edit this page |