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

David T. Lewis lewis at mail.msen.com
Mon Dec 27 01:49:04 UTC 2021


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