VM Maker: VMMaker.oscog-eem.2832.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-eem.2832.mcz

commits-2
 
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2832.mcz

==================== Summary ====================

Name: VMMaker.oscog-eem.2832
Author: eem
Time: 30 September 2020, 8:11:43.302713 pm
UUID: bc601167-a7f8-41d3-8621-eb8313bbc4ad
Ancestors: VMMaker.oscog-eem.2831

Comment an interesting policy choice in externalInstVar:ofContext:.
Fix a slip in the new IA32ABI copy into primitive

=============== Diff against VMMaker.oscog-eem.2831 ===============

Item was changed:
  ----- Method: CoInterpreter>>externalInstVar:ofContext: (in category 'frame access') -----
  externalInstVar: offset ofContext: aContext
  "Fetch an instance variable from a maybe married context.
  If the context is still married compute the value of the
  relevant inst var from the spouse frame's state.
 
  If the context is single but has a negative instruction pointer
  recognise that the instruction pointer is actually into machine
  code and convert it to the corresponding bytecode pc."
  <inline: false>
  | value |
 
  self assert: (objectMemory isContext: aContext).
  self assert: offset <= (ReceiverIndex + (self checkStackPointerForMaybeMarriedContext: aContext)).
  "method, closureOrNil & receiver need no special handling; only
  sender, pc & stackp have to be computed for married contexts."
  (self isReadMediatedContextInstVarIndex: offset) ifFalse:
  [^objectMemory fetchPointer: offset ofObject: aContext].
 
  self externalWriteBackHeadFramePointers.
  (self isStillMarriedContext: aContext) ifTrue:
  [^self fetchPointer: offset ofMarriedContext: aContext].
 
  value := objectMemory fetchPointer: offset ofObject: aContext.
+ "Why not update the slot to refer to the mapped pc?  We're damned if we do, and damned if
+ we don't.  If it is and the context is live and is returned to, then the pc will be mapped back
+ to machine code.  If we don't then the mapping will be repeated on every access.  What we
+ need are stats that show whether or not a read here predicts one or other outcome with any
+ certainty.  For now, we keep it as it has been for a long time and do not update the slot."
  (offset = InstructionPointerIndex
    and: [(objectMemory isIntegerObject: value)
    and: [value signedIntFromLong < 0]]) ifTrue:
  [^self mustMapMachineCodePC: (objectMemory integerValueOf: value) context: aContext].
  ^value!

Item was changed:
  ----- Method: IA32ABIPlugin>>primAlienCopyInto (in category 'primitives-accessing') -----
  primAlienCopyInto
  "Copy some number of bytes from the receiver starting at the first index into some destination
  object starting at the second index.  The  destination may be an Aliens or a bit-indexable object.
  The primitive will have the following signature:
  <Alien>
  primCopyFrom: start <Integer>
  to: stop <Integer>
  into: destination <Alien | indexableByteSubclass et al>
  startingAt: destStart <Integer> ^<self>
  <primitive: 'primitiveAlienReplace' error: errorCode module: 'IA32ABI'>
  "
  <export: true>
  | alien start stop dest destStart src totalLength destAddr myLength |
  alien := interpreterProxy stackValue: 4.  "Unchecked!!"
  start := interpreterProxy stackIntegerValue: 3.
  stop := interpreterProxy stackIntegerValue: 2.
  dest := interpreterProxy stackValue: 1.
  destStart := interpreterProxy stackIntegerValue: 0.
 
  (interpreterProxy failed
  or: [(interpreterProxy isWordsOrBytes: dest) not]) ifTrue:
  [^interpreterProxy primitiveFailFor: PrimErrBadArgument].
 
  myLength := self sizeField: alien.
  src := (self startOfData: alien withSize: myLength) + start - 1.
 
  (self isAlien: dest)
  ifTrue:
  [totalLength := self sizeField: dest.
+ destAddr := (self startOfData: dest withSize: totalLength) + destStart - 1.
- destAddr := (self startOfData: dest withSize: totalLength) + start - 1.
  totalLength = 0 "no bounds checks for zero-sized (pointer) Aliens"
  ifTrue: [totalLength := stop]
  ifFalse: [totalLength := totalLength abs]]
  ifFalse:
  [totalLength := interpreterProxy byteSizeOf: dest.
+ destAddr := (self startOfByteData: dest) + destStart - 1].
- destAddr := (self startOfByteData: dest) + start - 1].
 
  ((start >= 1 and: [start - 1 <= stop and: [stop <= myLength abs]])
  and: [stop - start + 1 <= totalLength]) ifFalse:
  [^interpreterProxy primitiveFailFor: PrimErrBadIndex].
 
  (interpreterProxy isOopImmutable: dest) ifTrue:
  [^interpreterProxy primitiveFailFor: PrimErrNoModification].
 
  "Use memmove to allow source and desition to overlap"
  self memmove: destAddr asVoidPointer _: src asVoidPointer _: stop - start + 1.
 
  interpreterProxy methodReturnReceiver!