[Vm-dev] VM Maker: VMMaker.oscog-dtl.3123.mcz

David T. Lewis lewis at mail.msen.com
Sat Jan 1 21:07:30 UTC 2022


Hi Eliot,

I put VMMaker.oscog-dtl.3124 in the VMM inbox, which includes your
recommendations along with a few unit tests to cover the format number
handling.

Dave

On Sun, Dec 26, 2021 at 08:49:04PM -0500, David T. Lewis wrote:
>  
> Thanks Eliot,
> 
> I will do an update in the VMM inbox in the next day or so.
> 
> Dave
> 
> 
> On Sun, Dec 26, 2021 at 01:26:03PM -0800, Eliot Miranda wrote:
> >  
> > Hi Dave,
> > 
> > On Sun, Dec 26, 2021 at 12:35 PM David T. Lewis <lewis at mail.msen.com> wrote:
> > 
> > >
> > > My apologies, I intended this for the VMMaker inbox. I will move it there
> > > now.
> > 
> > 
> > no problem.
> > 
> > On Sun, Dec 26, 2021 at 12:23 PM <commits at source.squeak.org> wrote:
> > 
> > >
> > > David T. Lewis uploaded a new version of VMMaker to project VM Maker:
> > > http://source.squeak.org/VMMaker/VMMaker.oscog-dtl.3123.mcz
> > >
> > > ==================== Summary ====================
> > >
> > > Name: VMMaker.oscog-dtl.3123
> > > Author: dtl
> > > Time: 26 December 2021, 12:55:15.357105 pm
> > > UUID: a0d4db62-a6ac-4d9c-ba51-5eec2ce0c415
> > > Ancestors: VMMaker.oscog-eem.3122
> > >
> > > Support image formats 68533 and 7033. Let the image inform the VM that
> > > alternate bytecodes either are or are not in use, and remember the setting
> > > when writing or reading the image format number in a shapshot file header.
> > > Also support testing the current value of multipleBytecodeSetsActive, and
> > > listing the encoder names of supported bytecode sets.
> > >
> > 
> > This is cool. But let me suggest...
> > 
> > > Item was added:
> > > + ----- Method: InterpreterPrimitives>>primitiveBytecodeSetsAvailable (in
> > > category 'other primitives') -----
> > > + primitiveBytecodeSetsAvailable
> > > +       "Answer the encoder names for the supported bytecode sets."
> > > +       <export: true>
> > > +       | encoderNames |
> > > +       argumentCount >0 ifTrue:
> > > +               [^self primitiveFailFor: PrimErrBadNumArgs].
> > > +       encoderNames := self instantiateClass: self classArray
> > > indexableSize: 3.
> > > +       self storePointer: 0 ofObject: encoderNames withValue:
> > > (objectMemory stringForCString: 'EncoderForV3').
> > > +       self storePointer: 1 ofObject: encoderNames withValue:
> > > (objectMemory stringForCString: 'EncoderForV3PlusClosures').
> > > +       self storePointer: 2 ofObject: encoderNames withValue:
> > > (objectMemory stringForCString: 'EncoderForSistaV1').
> > > +       self pop: 1 thenPush: encoderNames.
> > > + !
> > >
> > 
> > use self methodReturnValue: encoderNames instead of self pop: 1 thenPush:
> > encoderNames.
> > 
> > Item was added:
> > > + ----- Method: InterpreterPrimitives>>primitiveMultipleBytecodeSetsActive
> > > (in category 'other primitives') -----
> > > + primitiveMultipleBytecodeSetsActive
> > > +       "Given one boolean parameter, set multipleBytecodeSetsActive to
> > > inform
> > > +        the VM that alternate bytecode sets such as SistaV1 are now in
> > > use and
> > > +       that the image format number should be updated accordingly. With
> > > zero
> > > +       parameters, answer the current value of
> > > multipleBytecodeSetsActive."
> > > +
> > > +       <export: true>
> > > +       argumentCount >1 ifTrue:
> > > +               [^self primitiveFailFor: PrimErrBadNumArgs].
> > > +       argumentCount = 1
> > > +               ifTrue: [self stackTop = objectMemory trueObject
> > > +                       ifTrue: [self cppIf: MULTIPLEBYTECODESETS
> > > +                               ifTrue: [multipleBytecodeSetsActive :=
> > > true]
> > > +                               ifFalse: [^self primitiveFailFor:
> > > PrimErrUnsupported]]
> > > +                       ifFalse: [self stackTop = objectMemory falseObject
> > > +                               ifTrue: [multipleBytecodeSetsActive :=
> > > false]
> > > +                               ifFalse:[^self primitiveFailFor:
> > > PrimErrBadArgument]]].
> > > +       multipleBytecodeSetsActive
> > > +               ifTrue: [self pop: argumentCount + 1 thenPush:
> > > objectMemory trueObject]
> > > +               ifFalse: [self pop: argumentCount + 1 thenPush:
> > > objectMemory falseObject].
> > 
> > + !
> > >
> > 
> > use self methodReturnBool: multipleBytecodeSetsActive instead of the last
> > three lines.
> > 
> > Item was changed:
> > >   InterpreterPrimitives subclass: #StackInterpreter
> > > (excessive size, no diff calculated)
> > >
> > > Item was changed:
> > >   ----- Method: StackInterpreter class>>initializeMiscConstants (in
> > > category 'initialization') -----
> > >   initializeMiscConstants
> > >
> > >         super initializeMiscConstants.
> > >         STACKVM := true.
> > >
> > >         "These flags identify a GC operation (& hence a reason to leak
> > > check),
> > >          or just operations the leak checker can be run for."
> > >         GCModeFull := 1.                                "stop-the-world
> > > global GC"
> > >         GCModeNewSpace := 2.            "Spur's scavenge, or V3's
> > > incremental"
> > >         GCModeIncremental := 4.         "incremental global gc (Dijkstra
> > > tri-colour marking); as yet unimplemented"
> > >         GCModeBecome := 8.                      "v3 post-become
> > > sweeping/Spur forwarding"
> > >         GCCheckImageSegment := 16.      "just a flag for leak checking
> > > image segments"
> > >         GCCheckFreeSpace := 32.         "just a flag for leak checking
> > > free space; Spur only"
> > >         GCCheckShorten := 64.           "just a flag for leak checking
> > > object shortening operations; Spur only"
> > >         GCCheckPrimCall := 128.         "just a flag for leak checking
> > > external primitive calls"
> > >
> > >         StackPageTraceInvalid := -1.
> > >         StackPageUnreached := 0.
> > >         StackPageReachedButUntraced := 1.
> > >         StackPageTraced := 2.
> > >
> > >         DumpStackOnLowSpace := 0.
> > >         MillisecondClockMask := 16r1FFFFFFF.
> > >         "Note: The external primitive table should actually be dynamically
> > > sized but for the sake of inferior platforms (e.g., Mac :-) who cannot
> > > allocate memory in any reasonable way, we keep it static (and cross our
> > > fingers...)"
> > >         MaxExternalPrimitiveTableSize := 4096. "entries"
> > >
> > >         MaxJumpBuf := 32. "max. callback depth"
> > >         FailImbalancedPrimitives := InitializationOptions at:
> > > #FailImbalancedPrimitives ifAbsentPut: [true].
> > >         EnforceAccessControl := InitializationOptions at:
> > > #EnforceAccessControl ifAbsent: [true].
> > >
> > >         ReturnToInterpreter := 1. "setjmp/longjmp code."
> > >
> > >         "Because of a hack with callbacks in the non-threaded VM they must
> > > not conflct with the VM's tag bits."
> > >         DisownVMForFFICall := 16.
> > > +       DisownVMForThreading := 32.
> > > +
> > > +       "The multiple bytecodes active bit in the image format number"
> > > +       MultipleBytecodeSetsBitmask := 512.
> > > -       DisownVMForThreading := 32
> > >   !
> > >
> > > Item was changed:
> > >   ----- Method: StackInterpreter>>readableFormat: (in category 'image
> > > save/restore') -----
> > >   readableFormat: imageVersion
> > >         "Anwer true if images of the given format are readable by this
> > > interpreter.
> > >          Allows a virtual machine to accept selected older image formats."
> > >         <api>
> > > +       ^ (self imageFormatVersion = (imageVersion bitAnd: ( -1 -
> > > MultipleBytecodeSetsBitmask))) "Ignore multiple bytecode support identifier"
> > > +               or: [objectMemory hasSpurMemoryManagerAPI not "No
> > > compatibility version for Spur as yet"
> > > -       ^imageVersion = self imageFormatVersion "Float words in
> > > platform-order"
> > > -          or: [objectMemory hasSpurMemoryManagerAPI not "No compatibility
> > > version for Spur as yet"
> > >                         and: [imageVersion = self
> > > imageFormatCompatibilityVersion]] "Float words in BigEndian order"!
> > >
> > 
> > Can we write this as
> >     is the image version a Spur version? if so...
> >         insist on exact match
> >     is the image a priori version? If so...
> >         filter the acceptable matches
> >     otherwise
> >         fail for unrecognised version
> > ?
> > 
> > 'cuz this way is more readable/commentable/extensible in the long run.
> > 
> > Item was changed:
> > >   ----- Method: StackInterpreter>>writeImageFileIO (in category 'image
> > > save/restore') -----
> > >   writeImageFileIO
> > >         "Write the image header and heap contents to imageFile for
> > > snapshot. c.f. writeImageFileIOSimulation.
> > >          The game below is to maintain 64-bit alignment for all
> > > putLong:toFile: occurrences."
> > >         <inline: #never>
> > >         | imageName headerStart headerSize f imageBytes bytesWritten
> > > sCWIfn okToWrite |
> > >
> > ...
> > 
> > > +       multipleBytecodeSetsActive
> > > +               ifTrue: [self putWord32: (self imageFormatVersion bitOr:
> > > MultipleBytecodeSetsBitmask) toFile: f]
> > > +               ifFalse: [self putWord32: self imageFormatVersion toFile:
> > > f].
> > >
> > 
> > why not extract this to e.g. self imageFormatVersionForSnapshot?
> > 
> > -       self putWord32: self imageFormatVersion toFile: f.
> > >         self putWord32: headerSize toFile: f.
> > 
> > ...
> > 
> > _,,,^..^,,,_
> > best, Eliot
> 


More information about the Vm-dev mailing list