[Vm-dev] VM Maker: VMMaker.oscog-cb.1617.mcz
Clément Bera
bera.clement at gmail.com
Wed Jan 6 15:28:04 UTC 2016
Ok.
According to my attempts, Stack and Cog Simulators are working fine (both
Spur and SqueakV3). However the VM compiled to C crashes while trying to
assign a block into an instance variable.
So something is still wrong.
2016-01-06 14:46 GMT+01:00 <commits at source.squeak.org>:
>
> Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
> http://source.squeak.org/VMMaker/VMMaker.oscog-cb.1617.mcz
>
> ==================== Summary ====================
>
> Name: VMMaker.oscog-cb.1617
> Author: cb
> Time: 6 January 2016, 2:46:27.798 pm
> UUID: 81fe5b89-69de-45b8-9b65-f2f4a8bd187d
> Ancestors: VMMaker.oscog-rmacnak.1616
>
> As Eliot ntoed, I made a dumb mistake breking instance variable stores in
> the interpreter.
>
> This commit fixes the mistake. In addition, storing into an immutable
> object in a primitive now signals a no modification error instead of
> inappropriate error.
>
> I checked and the StackVMSimulator is working fine after this commit.
> Unfortunately, the CogVMSimulator does not work in my machine, likely due
> to other bugs. I am going to check that it works and that compilation to C
> works right now.
>
> =============== Diff against VMMaker.oscog-rmacnak.1616 ===============
>
> Item was changed:
> ----- Method: CoInterpreterPrimitives>>primitiveObjectAtPut (in category
> 'object access primitives') -----
> primitiveObjectAtPut
> "Store a literal into a CompiledMethod at the given index. Defined
> for CompiledMethods only."
> | thisReceiver rawHeader realHeader index newValue |
> newValue := self stackValue: 0.
> index := self stackValue: 1.
> (objectMemory isNonIntegerObject: index) ifTrue:
> [^self primitiveFailFor: PrimErrBadArgument].
> index := objectMemory integerValueOf: index.
> thisReceiver := self stackValue: 2.
> self cppIf: IMMUTABILITY
> + ifTrue: [ (objectMemory isImmutable: thisReceiver) ifTrue:
> [ ^self primitiveFailFor: PrimErrNoModification ] ].
> - ifTrue: [ (objectMemory isImmutable: thisReceiver) ifTrue:
> [ ^self primitiveFailFor: PrimErrInappropriate ] ].
> rawHeader := self rawHeaderOf: thisReceiver.
> realHeader := (self isCogMethodReference: rawHeader)
> ifTrue: [(self cCoerceSimple:
> rawHeader to: #'CogMethod *') methodHeader]
> ifFalse: [rawHeader].
> (index > 0
> and: [index <= ((objectMemory literalCountOfMethodHeader:
> realHeader) + LiteralStart)]) ifFalse:
> [^self primitiveFailFor: PrimErrBadIndex].
> index = 1
> ifTrue:
> [((objectMemory isNonIntegerObject: newValue)
> or: [(objectMemory literalCountOfMethodHeader:
> newValue) ~= (objectMemory literalCountOfMethodHeader: realHeader)]) ifTrue:
> [^self primitiveFailFor:
> PrimErrBadArgument].
> (self isCogMethodReference: rawHeader)
> ifTrue: [(self cCoerceSimple: rawHeader
> to: #'CogMethod *') methodHeader: newValue]
> ifFalse: [objectMemory
> storePointerUnchecked: 0 ofObject: thisReceiver withValue: newValue]]
> ifFalse:
> [objectMemory storePointer: index - 1 ofObject:
> thisReceiver withValue: newValue].
> self pop: 3 thenPush: newValue!
>
> Item was changed:
> ----- Method: InterpreterPrimitives>>primitiveFloatAtPut (in category
> 'indexing primitives') -----
> primitiveFloatAtPut
> "Provide platform-independent access to 32-bit words comprising
> a Float. Map index 1 onto the most significant word and index 2
> onto the least significant word."
> | rcvr index oopToStore valueToStore |
> <var: #valueToStore type: #usqInt>
> oopToStore := self stackTop.
> valueToStore := self positive32BitValueOf: oopToStore.
> self successful ifFalse:
> [^self primitiveFailFor: PrimErrBadArgument].
> rcvr := self stackValue: 2.
> index := self stackValue: 1.
> (objectMemory isImmediateFloat: rcvr) ifTrue:
> [^self primitiveFailFor: PrimErrBadReceiver].
> self cppIf: IMMUTABILITY
> + ifTrue: [ (objectMemory isImmutable: rcvr) ifTrue: [^self
> primitiveFailFor: PrimErrNoModification] ].
> - ifTrue: [ (objectMemory isImmutable: rcvr) ifTrue: [^self
> primitiveFailFor: PrimErrBadReceiver] ].
> index = ConstOne ifTrue:
> [objectMemory storeLong32: (VMBIGENDIAN ifTrue: [0]
> ifFalse: [1])
> ofObject: rcvr
> withValue: valueToStore.
> ^self pop: 3 thenPush: oopToStore].
> index = ConstTwo ifTrue:
> [objectMemory storeLong32: (VMBIGENDIAN ifTrue: [1]
> ifFalse: [0])
> ofObject: rcvr
> withValue: valueToStore.
> ^self pop: 3 thenPush: oopToStore].
> self primitiveFailFor: ((objectMemory isIntegerObject: index)
> ifTrue:
> [PrimErrBadIndex]
> ifFalse:
> [PrimErrBadArgument])!
>
> 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:
> [^self primitiveFailFor: PrimErrInappropriate].
> self cppIf: IMMUTABILITY "isWords: ensure non immediate"
> + ifTrue: [ (objectMemory isImmutable: rcvr) ifTrue: [ ^self
> primitiveFailFor: PrimErrNoModification ] ].
> - ifTrue: [ (objectMemory isImmutable: rcvr) 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.
> self pop: 3 thenPush: valueOop "pop all; return value"
> !
>
> Item was changed:
> ----- Method: InterpreterPrimitives>>primitiveObjectAtPut (in category
> 'object access primitives') -----
> primitiveObjectAtPut
> "Store a literal into a CompiledMethod at the given index. Defined
> for CompiledMethods only."
> | thisReceiver index newValue |
> newValue := self stackValue: 0.
> index := self stackValue: 1.
> ((objectMemory isNonIntegerObject: index)
> or: [index = ConstOne and: [(objectMemory isNonIntegerObject:
> newValue)]]) ifTrue:
> [^self primitiveFailFor: PrimErrBadArgument].
> index := objectMemory integerValueOf: index.
> thisReceiver := self stackValue: 2.
> self cppIf: IMMUTABILITY
> + ifTrue: [ (objectMemory isImmutable: thisReceiver) ifTrue:
> [ ^self primitiveFailFor: PrimErrNoModification ] ].
> - ifTrue: [ (objectMemory isImmutable: thisReceiver) ifTrue:
> [ ^self primitiveFailFor: PrimErrInappropriate ] ].
> (index > 0 and: [index <= ((objectMemory literalCountOf:
> thisReceiver) + LiteralStart)]) ifFalse:
> [^self primitiveFailFor: PrimErrBadIndex].
> objectMemory storePointer: index - 1 ofObject: thisReceiver
> withValue: newValue.
> self pop: 3 thenPush: newValue!
>
> Item was changed:
> ----- Method: InterpreterPrimitives>>primitiveShortAtPut (in category
> 'sound primitives') -----
> primitiveShortAtPut
> "Treat the receiver, which can be indexible by either bytes or
> words, as an array
> of signed 16-bit values. Set the contents of the given index to
> the given value.
> Note that the index specifies the i-th 16-bit entry, not the i-th
> byte or word."
>
> | index rcvr value |
> value := self stackTop.
> index := self stackValue: 1.
> ((objectMemory isIntegerObject: value)
> and: [(objectMemory isIntegerObject: index)
> and: [value := objectMemory integerValueOf: value.
> (value >= -32768) and: [value <= 32767]]]) ifFalse:
> [^self primitiveFailFor: PrimErrBadArgument].
> rcvr := self stackValue: 2.
> (objectMemory isWordsOrBytes: rcvr) ifFalse:
> [^self primitiveFailFor: PrimErrInappropriate].
> self cppIf: IMMUTABILITY "isWordsOrBytes ensure non immediate"
> + ifTrue: [ (objectMemory isImmutable: rcvr) ifTrue: [ ^self
> primitiveFailFor: PrimErrNoModification ] ].
> - ifTrue: [ (objectMemory isImmutable: rcvr) ifTrue: [ ^self
> primitiveFailFor: PrimErrInappropriate ] ].
> index := objectMemory integerValueOf: index.
> (index >= 1 and: [index <= (objectMemory num16BitUnitsOf: rcvr)])
> ifFalse:
> [^self primitiveFailFor: PrimErrBadIndex].
> objectMemory storeShort16: index - 1 ofObject: rcvr withValue:
> value.
> self pop: 3 thenPush: (objectMemory integerObjectOf: value)!
>
> Item was changed:
> ----- Method: SpurMemoryManager>>isOopValidBecome: (in category 'become
> implementation') -----
> isOopValidBecome: oop
> "Answers 0 if the oop can be become.
> Answers an error code in the other case"
> (self isImmediate: oop) ifTrue: [^PrimErrInappropriate].
> (self isPinned: oop) ifTrue: [^PrimErrObjectIsPinned].
> self
> cppIf: IMMUTABILITY
> + ifTrue: [ (self isImmutable: oop) ifTrue:
> [^PrimErrNoModification] ].
> - ifTrue: [ (self isImmutable: oop) ifTrue:
> [^PrimErrInappropriate] ].
> ^ 0!
>
> Item was changed:
> ----- Method: StackInterpreter>>extendedStoreAndPopBytecode (in category
> 'stack bytecodes') -----
> extendedStoreAndPopBytecode
> <inline: true>
> self extendedStoreBytecodePop: true
> + "may not be reached (immutable receiver)"!
> - !
>
> Item was changed:
> ----- Method: StackInterpreter>>extendedStoreBytecode (in category
> 'stack bytecodes') -----
> extendedStoreBytecode
> <inline: true>
> + self extendedStoreBytecodePop: false
> + "may not be reached (immutable receiver)"!
> - self extendedStoreBytecodePop: false!
>
> Item was changed:
> ----- Method: StackInterpreter>>storeAndPopReceiverVariableBytecode (in
> category 'stack bytecodes') -----
> storeAndPopReceiverVariableBytecode
> "Note: This code uses
> storePointerUnchecked:ofObject:withValue: and does the
> store check explicitely in order to help the translator
> produce better code."
> | rcvr top |
> rcvr := self receiver.
> top := self internalStackTop.
> self internalPop: 1.
> + self
> + cCode: "Slang will inline currentBytecode to a constant so
> this will work in C"
> + [self fetchNextBytecode.
> + objectMemory
> + storePointerImmutabilityCheck:
> (currentBytecode bitAnd: 7)
> + ofObject: rcvr
> + withValue: top]
> + inSmalltalk: "But in Smalltalk we must use the
> currentBytecode's value, not the next.
> + We cant use the following code when generating C
> code as slang
> + won't inline currentBytecode correctly due to the
> extra temp."
> + [ | instVarIndex |
> + instVarIndex := currentBytecode bitAnd: 7.
> + self fetchNextBytecode.
> + objectMemory
> + storePointerImmutabilityCheck: instVarIndex
> + ofObject: rcvr
> + withValue: top]!
> - self fetchNextBytecode.
> - objectMemory storePointerImmutabilityCheck: (currentBytecode
> bitAnd: 7) ofObject: rcvr withValue: top.!
>
> Item was changed:
> ----- Method: StackInterpreterPrimitives>>primitiveInstVarAtPut (in
> category 'object access primitives') -----
> primitiveInstVarAtPut
> | newValue index rcvr hdr fmt totalLength fixedFields |
> newValue := self stackTop.
> index := self stackValue: 1.
> rcvr := self stackValue: 2.
> ((objectMemory isNonIntegerObject: index)
> or: [argumentCount > 2 "e.g. object:instVarAt:put:"
> and: [objectMemory isOopForwarded: rcvr]]) ifTrue:
> [^self primitiveFailFor: PrimErrBadArgument].
> + (objectMemory isImmediate: rcvr) ifTrue: [ ^ self
> primitiveFailFor: PrimErrInappropriate].
> + self
> + cppIf: IMMUTABILITY
> + ifTrue: [ (objectMemory isImmutable: rcvr) ifTrue: [ ^
> self primitiveFailFor: PrimErrNoModification] ].
> - self cppIf: IMMUTABILITY
> - ifTrue: [ (objectMemory isOopImmutable: rcvr) ifTrue:
> [^self primitiveFailFor: PrimErrInappropriate] ]
> - ifFalse: [ (objectMemory isImmediate: rcvr) ifTrue: [^self
> primitiveFailFor: PrimErrInappropriate] ].
> index := objectMemory integerValueOf: index.
> hdr := objectMemory baseHeader: rcvr.
> fmt := objectMemory formatOfHeader: hdr.
> totalLength := objectMemory lengthOf: rcvr baseHeader: hdr format:
> fmt.
> fixedFields := objectMemory fixedFieldsOf: rcvr format: fmt
> length: totalLength.
> (index >= 1 and: [index <= fixedFields]) ifFalse:
> [^self primitiveFailFor: PrimErrBadIndex].
> (fmt = objectMemory indexablePointersFormat
> and: [objectMemory isContextHeader: hdr])
> ifTrue: [self externalInstVar: index - 1 ofContext: rcvr
> put: newValue]
> ifFalse: [self subscript: rcvr with: index storing:
> newValue format: fmt].
> self pop: argumentCount + 1 thenPush: newValue!
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20160106/2697996b/attachment-0001.htm
More information about the Vm-dev
mailing list