Stefan,

Some changes I did.

I am adding you to a dropbox folder where I've put my sim image.
You can put yours in there as well.

There is also the issue of FileSystem :-)

Phil





On Thu, Feb 13, 2014 at 11:01 AM, Stefan Marr <[email protected]>wrote:

> Hi Ron:
>
> On 13 Feb 2014, at 10:38, Ron Teitelbaum <[email protected]> wrote:
>
> >> I think the bigger question is whether you actually want to adopt those
> > things.
> >
> > That the vm stays in sync should be a core requirement for our
> communities.
>
> I am with you on that Ron. But I need a technical solution to manage those
> things.
> Good intensions are one thing, but how do we do that?
>
> Examples: [https://github.com/pharo-project/pharo-vm/pull/18/commits]
>
> primitiveUpdateGZipCrc32
> -       self cCode:'' inSmalltalk:[zipCrcTable := CArrayAccessor on:
> GZipWriteStream crcTable].
> +       self cCode:'' inSmalltalk:[zipCrcTable := CArrayAccessor on: CRC
> crc32Table].
>
> primitiveGetAttribute
>
> -               attribute := Smalltalk getSystemAttribute: attr.
> +               attribute := Smalltalk vm getSystemAttribute: attr.
>
> CogVMSimulator>> initialize
> -       'Display has not yet been installed' asDisplayText form.
> +       'Display has not yet been installed' asMorph imageForm.
>
>
> ioRelinquishProcessorForMicroseconds
> -       Processor activeProcess == Project uiProcess ifTrue:
> +       Processor activeProcess == UIManager default uiProcess ifTrue:
>
>
> And so far, I only fixed trivial things. Still need to figure out what is
> going wrong with more recent Pharo images.
>
> Best regards
> Stefan
>
> --
> Stefan Marr
> INRIA Lille - Nord Europe
> http://stefan-marr.de/research/
>
>
>
>
>
'From Pharo2.0 of 7 March 2013 [Latest update: #20628] on 13 February 2014 at 
11:27:20 am'!

!VMClass methodsFor: 'simulation support' stamp: 'PhilippeBack 11/27/2013 
21:28'!
doOrDefer: aBlock
        <doNotGenerate>
        "Either evaluate aBlock immediately if in the uiProcess or defer aBlock 
as a UI message"
        Processor activeProcess == UIManager default uiProcess
                ifTrue: [aBlock value]
                ifFalse: [WorldState addDeferredUIMessage: aBlock]! !


!ByteString methodsFor: 'comparing' stamp: 'MrVMMaker 11/27/2013 16:54'!
findSubstring: key in: body startingAt: start matchTable: matchTable
        "Answer the index in the string body at which the substring key first 
occurs, at or beyond start.  The match is determined using matchTable, which 
can be used to effect, eg, case-insensitive matches.  If no match is found, 
zero will be returned.

        The algorithm below is not optimum -- it is intended to be translated 
to C which will go so fast that it wont matter."
        | index |
        <primitive: 'primitiveFindSubstring' module: 'MiscPrimitivePlugin'>
        
        <var: #key declareC: 'unsigned char *key'>
        <var: #body declareC: 'unsigned char *body'>
        <var: #matchTable declareC: 'unsigned char *matchTable'>

        key size = 0 ifTrue: [^ 0].
        start to: body size - key size + 1 do:
                [:startIndex |
                index := 1.
                        [(matchTable at: (body at: startIndex+index-1) 
asciiValue + 1)
                                = (matchTable at: (key at: index) asciiValue + 
1)]
                                whileTrue:
                                [index = key size ifTrue: [^ startIndex].
                                index := index+1]].
        ^ 0
! !


!StackInterpreterSimulator methodsFor: 'UI' stamp: 'PhilippeBack 11/27/2013 
21:24'!
openAsMorph
        "Open a morphic view on this simulation."
        | window localImageName |
        "localImageName := FileSystem workingDirectory localNameFor: imageName."
        window := (SystemWindow labelled: 'Simulation of ', imageName) model: 
self.

        window addMorph: (displayView := ImageMorph new image: displayForm)
                frame: (0@0 corner: [email protected]).

        transcript := Transcript.
        window addMorph: (PluggableTextMorph
                                                        on: transcript text: 
nil accept: nil
                                                        readSelection: nil 
menu: #codePaneMenu:shifted:)
                        frame: ([email protected] corner: 0.7@1).

        window addMorph: (PluggableTextMorph on: self
                                                text: #byteCountText accept: nil
                                                readSelection: nil menu: 
#utilitiesMenu:) hideScrollBarsIndefinitely
                        frame: ([email protected] corner: 1@1).

        window openInWorldExtent: (self desiredDisplayExtent
                                                                + (2 * window 
borderWidth)
                                                                + (0@window 
labelHeight)
                                                                * (1@(1/0.8))) 
rounded! !

!StackInterpreterSimulator methodsFor: 'initialization' stamp: 'PhilippeBack 
11/27/2013 22:00'!
initialize
        "Initialize the StackInterpreterSimulator when running the interpreter
         inside Smalltalk. The primary responsibility of this method is to 
allocate
         Smalltalk Arrays for variables that will be declared as 
statically-allocated
         global arrays in the translated code."

        | objectMemoryClass |

        "initialize class variables"
        objectMemory ifNotNil:
                [^self halt].

        objectMemoryClass := self class objectMemoryClass.

        objectMemoryClass initBytesPerWord: objectMemoryClass bytesPerWord.
        objectMemoryClass initialize.
        StackInterpreter initialize.

        super initialize.
        objectMemory := objectMemoryClass simulatorClass new.
        objectMemory coInterpreter: self.

        "Note: we must initialize ConstMinusOne differently for simulation,
                due to the fact that the simulator works only with +ve 32-bit 
values"
        ConstMinusOne := objectMemory integerObjectOf: -1.

        methodCache := Array new: MethodCacheSize.
        atCache := Array new: AtCacheTotalSize.
        self flushMethodCache.
        self flushAtCache.
        gcSemaphoreIndex := 0.
        externalSemaphoreSignalRequests := externalSemaphoreSignalResponses := 
#().
        externalPrimitiveTable := CArrayAccessor on: (Array new: 
MaxExternalPrimitiveTableSize).
        externalPrimitiveTableFirstFreeIndex := 0.
        primitiveTable := self class primitiveTable copy.
        pluginList := #().
        mappedPluginEntries := #().
        desiredNumStackPages := desiredEdenBytes := 0.
        "This is initialized on loading the image, but convenient for testing 
stack page values..."
        numStackPages := self defaultNumStackPages. 
        startMicroseconds := Time totalSeconds * 1000000.

        "initialize InterpreterSimulator variables used for debugging"
        byteCount := 0.
        sendCount := 0.
        quitBlock := [^ self].
        traceOn := true.
        printSends := printReturns := printFrameAtEachStep := 
printBytecodeAtEachStep := false.
        myBitBlt := BitBltSimulator new setInterpreter: self.
        transcript := Transcript.
        displayForm := (ImageMorph fromString: 'Display has not yet been 
installed') form.
        suppressHeartbeatFlag := false.
        extSemTabSize := 256.
        disableBooleanCheat := false! !

!StackInterpreterSimulator methodsFor: 'initialization' stamp: 'PhilippeBack 
11/27/2013 21:04'!
openOn: fileName extraMemory: extraBytes
        "InterpreterSimulator new openOn: 'clone.im' extraMemory: 100000"

        | f version headerSize count oldBaseAddr bytesToShift swapBytes
          hdrNumStackPages hdrEdenBytes headerFlags |
        "open image file and read the header"

        ["begin ensure block..."
        f := FileStream readOnlyFileNamed: fileName.
        imageName := f fullName.
        f binary.
        version := self nextLongFrom: f.  "current version: 16r1968 (=6504) 
vive la revolucion!!"
        (self readableFormat: version)
                ifTrue: [swapBytes := false]
                ifFalse: [(version := objectMemory byteSwapped: version) = self 
imageFormatVersion
                                        ifTrue: [swapBytes := true]
                                        ifFalse: [self error: 'incomaptible 
image format']].
        headerSize := self nextLongFrom: f swap: swapBytes.
        objectMemory setEndOfMemory: (self nextLongFrom: f swap: swapBytes).  
"first unused location in heap"
        oldBaseAddr := self nextLongFrom: f swap: swapBytes.  "object memory 
base address of image"
        objectMemory specialObjectsOop: (self nextLongFrom: f swap: swapBytes).
        objectMemory lastHash: (self nextLongFrom: f swap: swapBytes).  "Should 
be loaded from, and saved to the image header"

        savedWindowSize := self nextLongFrom: f swap: swapBytes.
        headerFlags                     := self nextLongFrom: f swap: swapBytes.
        self setImageHeaderFlagsFrom: headerFlags.
        extraVMMemory           := self nextLongFrom: f swap: swapBytes.
        hdrNumStackPages        := self nextShortFrom: f swap: swapBytes.
        "4 stack pages is small.  Should be able to run with as few as
         three. 4 should be comfortable but slow.  8 is a reasonable
         default. Can be changed via vmParameterAt: 43 put: n"
        numStackPages := desiredNumStackPages ~= 0
                                                ifTrue: [desiredNumStackPages]
                                                ifFalse: [hdrNumStackPages = 0
                                                                        ifTrue: 
[self defaultNumStackPages]
                                                                        
ifFalse: [hdrNumStackPages]].
        desiredNumStackPages := hdrNumStackPages.
        stackPages := self stackPagesClass new. "Temporary for 
computeStackZoneSize"
        "pad to word boundary.  This slot can be used for anything else that 
will fit in 16 bits.
         Preserve it to be polite to images run on Cog."
        theUnknownShort := self getShortFromFile: f swap: swapBytes.
        hdrEdenBytes            := self nextLongFrom: f swap: swapBytes.
        objectMemory edenBytes: (hdrEdenBytes = 0
                                                        ifTrue: [objectMemory 
defaultEdenBytes]
                                                        ifFalse: 
[hdrEdenBytes]).
        desiredEdenBytes := hdrEdenBytes.
        "allocate interpreter memory"
        objectMemory setMemoryLimit: objectMemory endOfMemory + extraBytes + 
objectMemory edenBytes + self interpreterAllocationReserveBytes.

        "read in the image in bulk, then swap the bytes if necessary"
        f position: headerSize.
        objectMemory memory: (Bitmap new: objectMemory memoryLimit // 4).
        count := f readInto: objectMemory memory startingAt: 1 count: 
objectMemory endOfMemory // 4.
        count ~= (objectMemory endOfMemory // 4) ifTrue: [self halt].
        ]
                ensure: [f close].

        self ensureImageFormatIsUpToDate: swapBytes.

        objectMemory initialize.
        bytesToShift := objectMemory startOfMemory - oldBaseAddr.  "adjust 
pointers for zero base address"
        UIManager default informUser: 'Relocating object pointers...'
                                during: [self initializeInterpreter: 
bytesToShift].
! !

!StackInterpreterSimulator methodsFor: 'other primitives' stamp: 'PhilippeBack 
11/27/2013 21:29'!
primitiveGetAttribute
        "Fetch the system attribute with the given integer ID. The result is a 
string, which will be empty if the attribute is not defined."

        | attr s attribute |
        attr := self stackIntegerValue: 0.
        self successful ifTrue: [
                attribute := Smalltalk vm getSystemAttribute: attr.
                attribute ifNil: [ ^self primitiveFail ].
                s := objectMemory instantiateClass: (objectMemory splObj: 
ClassByteString) indexableSize: attribute size.
                1 to: attribute size do: [ :i |
                        objectMemory storeByte: i-1 ofObject: s withValue: 
(attribute at: i) asciiValue].
                self pop: 2.  "rcvr, attr"
                self push: s]! !

!StackInterpreterSimulator methodsFor: 'I/O primitive support' stamp: 
'PhilippeBack 11/27/2013 21:29'!
ioRelinquishProcessorForMicroseconds: microseconds
        "In the simulator give an indication that we're idling and check for 
input."
        Display reverse: (0@0 extent: 16@16).
        Sensor peekEvent ifNotNil:
                [self forceInterruptCheck].
        Processor activeProcess == UIManager default uiProcess ifTrue:
                [World doOneCycle].
        microseconds >= 1000
                ifTrue: [(Delay forMilliseconds: microseconds + 999 // 1000) 
wait]
                ifFalse: [Processor yield]! !

Reply via email to