Hi Dave,
On Sat, Jan 1, 2022 at 1:07 PM David T. Lewis lewis@mail.msen.com wrote:
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.
Cool. The definition and initialization of the new StackInterpreter multipleBytecodeSetsActive inst var is missing. I'm assuming it is an inst var. How should it be initialized? From MULTIPLEBYTECODESETS or left false by default?
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@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@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