[Vm-dev] VM Maker: VMMaker.oscog-eem.400.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Sep 21 14:51:24 UTC 2013
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.400.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.400
Author: eem
Time: 21 September 2013, 7:46:26.362 am
UUID: 3481cf9c-80d0-47db-b5c4-07102f7ea255
Ancestors: VMMaker.oscog-eem.399
Make the Inflate/DeflatePlugin simulate.
Simplify loadColorMapShiftOrMaskFrom: & others; isWords:,
isBytes: et al check for immediates already.
Add printHexnp: for unpadded hex printing & use in longPrintOop:.
Add a print stack call stack to print less stack :)
=============== Diff against VMMaker.oscog-eem.399 ===============
Item was changed:
----- Method: BitBltSimulation>>loadColorMapShiftOrMaskFrom: (in category 'interpreter interface') -----
loadColorMapShiftOrMaskFrom: mapOop
<returnTypeC:'void *'>
mapOop = interpreterProxy nilObject ifTrue:[^nil].
- (interpreterProxy isIntegerObject: mapOop)
- ifTrue:[interpreterProxy primitiveFail. ^nil].
((interpreterProxy isWords: mapOop)
and:[(interpreterProxy slotSizeOf: mapOop) = 4])
ifFalse:[interpreterProxy primitiveFail. ^nil].
^interpreterProxy firstIndexableField: mapOop!
Item was added:
+ ----- Method: InflatePlugin class>>simulatorClass (in category 'simulation') -----
+ simulatorClass
+ "For running from Smalltalk - answer a class that can be used to simulate the receiver,
+ or nil if you want the primitives in this module to always fail, causing simulation to fall
+ through to the Smalltalk code. By default every non-TestInterpreterPlugin can simulate itself."
+
+ ^DeflatePlugin!
Item was changed:
----- Method: InflatePlugin>>primitiveInflateDecompressBlock (in category 'primitives') -----
primitiveInflateDecompressBlock
"Primitive. Inflate a single block."
| oop rcvr |
<export: true>
+ interpreterProxy methodArgumentCount = 2 ifFalse:
+ [^interpreterProxy primitiveFail].
- interpreterProxy methodArgumentCount = 2 ifFalse:[^interpreterProxy primitiveFail].
"distance table"
+ oop := interpreterProxy stackValue: 0.
+ (interpreterProxy isWords: oop) ifFalse:
+ [^interpreterProxy primitiveFail].
- oop := interpreterProxy stackObjectValue: 0.
- interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy isWords: oop)
- ifFalse:[^interpreterProxy primitiveFail].
zipDistTable := interpreterProxy firstIndexableField: oop.
zipDistTableSize := interpreterProxy slotSizeOf: oop.
"literal table"
+ oop := interpreterProxy stackValue: 1.
+ (interpreterProxy isWords: oop) ifFalse:
+ [^interpreterProxy primitiveFail].
- oop := interpreterProxy stackObjectValue: 1.
- interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy isWords: oop)
- ifFalse:[^interpreterProxy primitiveFail].
zipLitTable := interpreterProxy firstIndexableField: oop.
zipLitTableSize := interpreterProxy slotSizeOf: oop.
"Receiver (InflateStream)"
+ rcvr := interpreterProxy stackValue: 2.
+ (interpreterProxy isPointers: rcvr) ifFalse:
+ [^interpreterProxy primitiveFail].
- rcvr := interpreterProxy stackObjectValue: 2.
- interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy isPointers: rcvr)
- ifFalse:[^interpreterProxy primitiveFail].
(interpreterProxy slotSizeOf: rcvr) < 9
ifTrue:[^interpreterProxy primitiveFail].
"All the integer instvars"
zipReadLimit := interpreterProxy fetchInteger: 2 ofObject: rcvr.
zipState := interpreterProxy fetchInteger: 3 ofObject: rcvr.
zipBitBuf := interpreterProxy fetchInteger: 4 ofObject: rcvr.
zipBitPos := interpreterProxy fetchInteger: 5 ofObject: rcvr.
zipSourcePos := interpreterProxy fetchInteger: 7 ofObject: rcvr.
zipSourceLimit := interpreterProxy fetchInteger: 8 ofObject: rcvr.
interpreterProxy failed ifTrue:[^nil].
zipReadLimit := zipReadLimit - 1.
zipSourcePos := zipSourcePos - 1.
zipSourceLimit := zipSourceLimit - 1.
"collection"
oop := interpreterProxy fetchPointer: 0 ofObject: rcvr.
+ (interpreterProxy isBytes: oop) ifFalse:
+ [^interpreterProxy primitiveFail].
- (interpreterProxy isIntegerObject: oop)
- ifTrue:[^interpreterProxy primitiveFail].
- (interpreterProxy isBytes: oop)
- ifFalse:[^interpreterProxy primitiveFail].
zipCollection := interpreterProxy firstIndexableField: oop.
zipCollectionSize := interpreterProxy byteSizeOf: oop.
"source"
oop := interpreterProxy fetchPointer: 6 ofObject: rcvr.
+ (interpreterProxy isBytes: oop) ifFalse:
+ [^interpreterProxy primitiveFail].
- (interpreterProxy isIntegerObject: oop)
- ifTrue:[^interpreterProxy primitiveFail].
- (interpreterProxy isBytes: oop)
- ifFalse:[^interpreterProxy primitiveFail].
zipSource := interpreterProxy firstIndexableField: oop.
"do the primitive"
self zipDecompressBlock.
+ interpreterProxy failed ifFalse: "store modified values back"
+ [interpreterProxy storeInteger: 2 ofObject: rcvr withValue: zipReadLimit + 1.
- interpreterProxy failed ifFalse:[
- "store modified values back"
- interpreterProxy storeInteger: 2 ofObject: rcvr withValue: zipReadLimit + 1.
interpreterProxy storeInteger: 3 ofObject: rcvr withValue: zipState.
interpreterProxy storeInteger: 4 ofObject: rcvr withValue: zipBitBuf.
interpreterProxy storeInteger: 5 ofObject: rcvr withValue: zipBitPos.
interpreterProxy storeInteger: 7 ofObject: rcvr withValue: zipSourcePos + 1.
+ interpreterProxy pop: 2]!
- interpreterProxy pop: 2.
- ].!
Item was changed:
----- Method: InterpreterPrimitives>>primitiveIntegerAt (in category 'sound primitives') -----
primitiveIntegerAt
"Return the 32bit signed integer contents of a words receiver"
| index rcvr sz addr value intValue |
<var: #intValue type: 'int'>
index := self stackIntegerValue: 0.
self successful ifFalse:
[^self primitiveFailFor: PrimErrBadArgument].
rcvr := self stackValue: 1.
+ (objectMemory isWords: rcvr) ifFalse:
- ((objectMemory isIntegerObject: rcvr)
- or: [(objectMemory isWords: rcvr) not]) ifTrue:
[^self primitiveFailFor: PrimErrInappropriate].
sz := objectMemory lengthOf: rcvr. "number of fields"
((index >= 1) and: [index <= sz]) ifFalse:
[^self primitiveFailFor: PrimErrBadIndex].
+ "4 = 32 bits / 8"
+ addr := rcvr + objectMemory baseHeaderSize + (index - 1 * 4). "for zero indexing"
+ value := objectMemory intAt: addr.
- addr := rcvr + BaseHeaderSize + (index - 1 * BytesPerWord). "for zero indexing"
- value := self intAt: addr.
self pop: 2. "pop rcvr, index"
"push element value"
(objectMemory isIntegerValue: value)
ifTrue: [self pushInteger: value]
ifFalse: [intValue := value. "32 bit int may have been stored in 32 or 64 bit sqInt"
self push: (self signed32BitIntegerFor: intValue)] "intValue may be sign extended to 64 bit sqInt"!
Item was changed:
----- Method: InterpreterPrimitives>>primitiveIntegerAtPut (in category 'sound primitives') -----
primitiveIntegerAtPut
"Return the 32bit signed integer contents of a words receiver"
| index rcvr sz addr value valueOop |
<var: 'value' type: 'int'>
valueOop := self stackValue: 0.
index := self stackIntegerValue: 1.
value := self signed32BitValueOf: valueOop.
self successful ifFalse:
[^self primitiveFailFor: PrimErrBadArgument].
rcvr := self stackValue: 2.
+ (objectMemory isWords: rcvr) ifFalse:
- ((objectMemory isIntegerObject: rcvr)
- or: [(objectMemory isWords: rcvr) not]) ifTrue:
[^self primitiveFailFor: PrimErrInappropriate].
sz := objectMemory lengthOf: rcvr. "number of fields"
(index >= 1 and: [index <= sz]) ifFalse:
[^self primitiveFailFor: PrimErrBadIndex].
+ "4 = 32 bits / 8"
+ addr := rcvr + objectMemory baseHeaderSize + (index - 1 * 4). "for zero indexing"
+ value := objectMemory intAt: addr put: value.
- addr := rcvr + BaseHeaderSize + (index - 1 * BytesPerWord). "for zero indexing"
- value := self intAt: addr put: value.
self pop: 3 thenPush: valueOop "pop all; return value"
!
Item was added:
+ ----- Method: Spur32BitMMLESimulator>>intAt:put: (in category 'memory access') -----
+ intAt: byteAddress put: a32BitValue
+ ^self longAt: byteAddress put: (a32BitValue bitAnd: 16rFFFFFFFF)!
Item was added:
+ ----- Method: Spur32BitMMLESimulator>>storeInteger:ofObject:withValue: (in category 'simulation only') -----
+ storeInteger: fieldIndex ofObject: objectPointer withValue: integerValue
+ "hack around the CoInterpreter/ObjectMemory split refactoring"
+ ^coInterpreter storeInteger: fieldIndex ofObject: objectPointer withValue: integerValue!
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."
| sel |
sel := thisContext sender method selector.
(#( DoIt
DoItIn:
on:do: "from the debugger"
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
primDigitCompare:
isLiveContext:
numPointerSlotsOf:
fileValueOf:
loadBitBltDestForm
fetchIntOrFloat:ofObject:ifNil:
fetchIntOrFloat:ofObject:
loadBitBltSourceForm
loadPoint:from:
primDigitAdd:
primDigitSubtract:
+ positive64BitValueOf:
+ digitBitLogic:with:opIndex:
+ signed32BitValueOf:) includes: sel) ifFalse:
- positive64BitValueOf:) includes: sel) ifFalse:
[self halt].
^(oop bitAnd: 1) ~= 0!
Item was changed:
----- Method: StackInterpreter>>longPrintOop: (in category 'debug printing') -----
longPrintOop: oop
<api>
| class fmt lastIndex startIP bytecodesPerLine column |
((objectMemory isImmediate: oop)
or: [(objectMemory addressCouldBeObj: oop) not
or: [(oop bitAnd: objectMemory allocationUnit - 1) ~= 0
or: [(objectMemory isFreeObject: oop)
or: [objectMemory isForwarded: oop]]]]) ifTrue:
[^self printOop: oop].
class := objectMemory fetchClassOfNonImm: oop.
self printHex: oop;
print: ': a(n) '; printNameOfClass: class count: 5;
print: ' ('; printHex: class; print: ')'.
fmt := objectMemory formatOf: oop.
+ self print: ' format '; printHexnp: fmt.
- self print: ' format '; printHex: fmt.
fmt > objectMemory lastPointerFormat ifTrue:
[self print: ' nbytes '; printNum: (objectMemory byteLengthOf: oop)].
objectMemory printHeaderTypeOf: oop.
+ self print: ' hash '; printHexnp: (objectMemory rawHashBitsOf: oop).
- self print: ' hash '; printHex: (objectMemory rawHashBitsOf: oop).
self cr.
(fmt between: objectMemory firstLongFormat and: objectMemory firstCompiledMethodFormat - 1) ifTrue:
[^self].
"this is nonsense. apologies."
startIP := (objectMemory lastPointerOf: oop) + BytesPerOop - objectMemory baseHeaderSize / BytesPerOop.
lastIndex := 256 min: startIP.
lastIndex > 0 ifTrue:
[1 to: lastIndex do:
[:i| | fieldOop |
fieldOop := objectMemory fetchPointer: i - 1 ofObject: oop.
self space; printNum: i - 1; space; printHex: fieldOop; space.
(i = 1 and: [objectMemory isCompiledMethod: oop])
ifTrue: [self printMethodHeaderOop: fieldOop]
ifFalse: [self printOopShort: fieldOop].
self cr]].
(objectMemory isCompiledMethod: oop)
ifFalse:
[startIP > 64 ifTrue: [self print: '...'; cr]]
ifTrue:
[startIP := startIP * BytesPerWord + 1.
lastIndex := objectMemory lengthOf: oop.
lastIndex - startIP > 100 ifTrue:
[lastIndex := startIP + 100].
bytecodesPerLine := 8.
column := 1.
startIP to: lastIndex do:
[:index| | byte |
column = 1 ifTrue:
[self cCode: 'printf("0x%08x: ", oop+BaseHeaderSize+index-1)'
inSmalltalk: [self print: (oop+BaseHeaderSize+index-1) hex; print: ': ']].
byte := objectMemory fetchByte: index - 1 ofObject: oop.
self cCode: 'printf(" %02x/%-3d", byte,byte)'
inSmalltalk: [self space; print: (byte radix: 16); printChar: $/; printNum: byte].
column := column + 1.
column > bytecodesPerLine ifTrue:
[column := 1. self cr]].
column = 1 ifFalse:
[self cr]]!
Item was changed:
----- Method: StackInterpreter>>printCallStackOf: (in category 'debug printing') -----
+ printCallStackOf: aContextOrProcessOrFrame
- printCallStackOf: aContextOrProcess
<api>
| context |
<inline: false>
<var: #theFP type: #'char *'>
+ (stackPages couldBeFramePointer: aContextOrProcessOrFrame) ifTrue:
+ [^self printCallStackFP: (self cCoerceSimple: aContextOrProcessOrFrame to: #'char *')].
+ ((objectMemory isContext: aContextOrProcessOrFrame) not
+ and: [(objectMemory lengthOf: aContextOrProcessOrFrame) > MyListIndex
- ((objectMemory isContext: aContextOrProcess) not
- and: [(objectMemory lengthOf: aContextOrProcess) > MyListIndex
and: [objectMemory isContext: (objectMemory
fetchPointer: SuspendedContextIndex
+ ofObject: aContextOrProcessOrFrame)]]) ifTrue:
- ofObject: aContextOrProcess)]]) ifTrue:
[^self printCallStackOf: (objectMemory
fetchPointer: SuspendedContextIndex
+ ofObject: aContextOrProcessOrFrame)].
+ context := aContextOrProcessOrFrame.
- ofObject: aContextOrProcess)].
- context := aContextOrProcess.
[context = objectMemory nilObject] whileFalse:
[(self isMarriedOrWidowedContext: context)
ifTrue:
[(self checkIsStillMarriedContext: context currentFP: framePointer) ifFalse:
[self shortPrintContext: context.
^nil].
context := self shortReversePrintFrameAndCallers: (self frameOfMarriedContext: context)]
ifFalse:
[context := self printContextCallStackOf: context]]!
Item was added:
+ ----- Method: StackInterpreter>>printHexnp: (in category 'debug printing') -----
+ printHexnp: n
+ "Print n in hex, in the form '0x1234', unpadded"
+ self print: '0x%x' f: n!
Item was added:
+ ----- Method: StackInterpreter>>printStackCallStack (in category 'debug printing') -----
+ printStackCallStack
+ <doNotGenerate>
+ | theFP context |
+ theFP := localFP.
+ [context := self shortReversePrintFrameAndCallers: theFP.
+ ((self isMarriedOrWidowedContext: context)
+ and: [self checkIsStillMarriedContext: context currentFP: localFP]) ifFalse:
+ [^nil].
+ theFP := self frameOfMarriedContext: context] repeat!
Item was added:
+ ----- Method: StackInterpreterSimulator>>printHexnp: (in category 'debug printing') -----
+ printHexnp: anInteger
+
+ traceOn ifTrue:
+ [transcript nextPutAll: (anInteger storeStringBase: 16)]!
Item was changed:
----- Method: StackInterpreterSimulator>>utilitiesMenu: (in category 'UI') -----
utilitiesMenu: aMenuMorph
aMenuMorph
add: 'toggle transcript' action: #toggleTranscript;
addLine;
add: 'print ext head frame' action: #printExternalHeadFrame;
add: 'print int head frame' action: #printHeadFrame;
add: 'short print ext frame & callers' action: [self shortPrintFrameAndCallers: framePointer];
add: 'short print int frame & callers' action: [self shortPrintFrameAndCallers: localFP];
add: 'long print ext frame & callers' action: [self printFrameAndCallers: framePointer SP: stackPointer];
add: 'long print int frame & callers' action: [self printFrameAndCallers: localFP SP: localSP];
add: 'print frame...' action: [(self promptHex: 'print frame') ifNotNil: [:fp| self printFrame: fp]];
add: 'print call stack' action: #printCallStack;
+ add: 'print stack call stack' action: #printStackCallStack;
add: 'print call stack of...' action: [(self promptHex: 'context or process oop') ifNotNil: [:obj| self printCallStackOf: obj]];
add: 'print all stacks' action: #printAllStacks;
+ add: 'write back local ptrs' action: [stackPointer := localSP. framePointer := localFP. instructionPointer := localIP.
+ self writeBackHeadFramePointers];
addLine;
add: 'print oop...' action: [(self promptHex: 'print oop') ifNotNil: [:oop| self printOop: oop]];
add: 'long print oop...' action: [(self promptHex: 'print oop') ifNotNil: [:oop| self longPrintOop: oop]];
addLine;
add: 'inspect object memory' target: objectMemory action: #inspect;
add: 'inspect cointerpreter' action: #inspect;
addLine;
add: 'set break count...' action: [|s| s := UIManager default request: 'break count (dec)'.
s notEmpty ifTrue: [breakCount := Integer readFrom: s readStream]];
add: 'set break selector...' action: [|s| s := UIManager default request: 'break selector'.
s notEmpty ifTrue: [self setBreakSelector: s]];
add: (printSends
ifTrue: ['no print sends']
ifFalse: ['print sends'])
action: [self ensureDebugAtEachStepBlock.
printSends := printSends not];
"currently printReturns does nothing"
"add: (printReturns
ifTrue: ['no print returns']
ifFalse: ['print returns'])
action: [self ensureDebugAtEachStepBlock.
printReturns := printReturns not];"
add: (printBytecodeAtEachStep
ifTrue: ['no print bytecode each bytecode']
ifFalse: ['print bytecode each bytecode'])
action: [self ensureDebugAtEachStepBlock.
printBytecodeAtEachStep := printBytecodeAtEachStep not];
add: (printFrameAtEachStep
ifTrue: ['no print frame each bytecode']
ifFalse: ['print frame each bytecode'])
action: [self ensureDebugAtEachStepBlock.
printFrameAtEachStep := printFrameAtEachStep not].
^aMenuMorph!
More information about the Vm-dev
mailing list