VM Maker: VMMaker.oscog-eem.998.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.998.mcz

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

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

Name: VMMaker.oscog-eem.998
Author: eem
Time: 23 December 2014, 9:31:13.819 am
UUID: 20a6acb3-9a01-4219-b650-8966301ffe11
Ancestors: VMMaker.oscog-eem.997

Fix printStackReferencesTo: for CoInterpreter.
Similarly collapse printFrame: into StackInterpreter
only.  Declare as #undeclared CoInterpreter-specific
indices in StackInterpreter.

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

Item was removed:
- ----- Method: CoInterpreter>>printFrame: (in category 'debug printing') -----
- printFrame: theFP
- | thePage theSP |
- <inline: false>
- <var: #theFP type: #'char *'>
- <var: #thePage type: #'StackPage *'>
- <var: #theSP type: #'char *'>
- theFP = framePointer
- ifTrue: [theSP := stackPointer]
- ifFalse:
- [thePage := stackPages stackPageFor: theFP.
- (stackPages isFree: thePage) ifTrue:
- [self printHexPtr: theFP; print: ' is on a free page?!!'; cr.
- ^nil].
- (thePage ~= stackPage
-  and: [theFP = thePage headFP])
- ifTrue: [theSP := thePage headSP]
- ifFalse:
- [theSP := self findSPOrNilOf: theFP
- on: thePage
- startingFrom: ((thePage = stackPage
- and: [framePointer
- between: thePage realStackLimit
- and: thePage baseAddress])
- ifTrue: [framePointer]
- ifFalse: [thePage headFP])]].
- theSP isNil ifTrue:
- [self print: 'could not find sp; using bogus value'; cr.
- theSP := theFP + ((self isMachineCodeFrame: theFP)
- ifTrue: [FoxMFReceiver]
- ifFalse: [FoxIFReceiver])].
- self printFrame: theFP WithSP: theSP!

Item was changed:
  ----- Method: StackInterpreter class>>initializeFrameIndices (in category 'initialization') -----
  initializeFrameIndices
  "Format of a stack frame.  Word-sized indices relative to the frame pointer.
  Terminology
  Frames are either single (have no context) or married (have a context).
  Contexts are either single (exist on the heap), married (have a context) or widowed (had a frame that has exited).
  Stacks grow down:
 
  receiver for method activations/closure for block activations
  arg0
  ...
  argN
  caller's method ip/base frame's sender context
  fp-> saved fp
  method
  frame flags
  context (uninitialized)
  receiver
  first temp
  ...
  sp-> Nth temp
 
  frame flags holds the number of arguments (since argument temporaries are above the frame)
  the flag for a block activation
  and the flag indicating if the context field is valid (whether the frame is married).
 
  The first frame in a stack page is the baseFrame and is marked as such by a null saved fp,
  in which case the saved method ip is actually the context (possibly hybrid) beneath the base frame"
 
  | fxCallerSavedIP fxSavedFP fxMethod fxFrameFlags fxThisContext fxReceiver |
  fxCallerSavedIP := 1.
  fxSavedFP := 0.
  fxMethod := -1.
  fxFrameFlags := -2. "Can find numArgs, needed for fast temp access. args are above fxCallerSavedIP.
+ Can find ``is block'' bit
+ Can find ``has context'' bit"
- Can find ``is block'' bit
- Can find ``has context'' bit"
  fxThisContext := -3.
  fxReceiver := -4.
 
  FrameSlots := fxCallerSavedIP - fxReceiver + 1.
 
  FoxCallerSavedIP := fxCallerSavedIP * BytesPerWord.
  "In base frames the caller saved ip field holds the caller context."
  FoxCallerContext := FoxCallerSavedIP.
  FoxSavedFP := fxSavedFP * BytesPerWord.
  FoxMethod := fxMethod * BytesPerWord.
  FoxFrameFlags := fxFrameFlags * BytesPerWord.
  FoxThisContext := fxThisContext * BytesPerWord.
+ FoxReceiver := fxReceiver * BytesPerWord.
+
+ "Mark the CoInterpreter-specific offsets as #undeclared to
+ avoid including them accidentally in StackInterpreter code."
+ IFrameSlots := #undeclared.
+ MFrameSlots := #undeclared.
+ FoxIFrameFlags := #undeclared.
+ FoxIFSavedIP := #undeclared.
+ FoxIFReceiver := #undeclared.
+ FoxMFReceiver := #undeclared!
- FoxReceiver := fxReceiver * BytesPerWord!

Item was changed:
  ----- Method: StackInterpreter>>printFrame: (in category 'debug printing') -----
  printFrame: theFP
  | thePage theSP |
  <inline: false>
  <var: #theFP type: #'char *'>
  <var: #thePage type: #'StackPage *'>
  <var: #theSP type: #'char *'>
  theFP = framePointer
  ifTrue: [theSP := stackPointer]
  ifFalse:
  [thePage := stackPages stackPageFor: theFP.
  (stackPages isFree: thePage) ifTrue:
  [self printHexPtr: theFP; print: ' is on a free page?!!'; cr.
  ^nil].
+ (thePage ~= stackPage
+  and: [theFP = thePage headFP])
+ ifTrue: [theSP := thePage headSP]
+ ifFalse:
+ [theSP := self findSPOrNilOf: theFP
+ on: thePage
+ startingFrom: ((thePage = stackPage
+ and: [framePointer
+ between: thePage realStackLimit
+ and: thePage baseAddress])
+ ifTrue: [framePointer]
+ ifFalse: [thePage headFP])]].
+ theSP ifNil:
- theSP := self findSPOrNilOf: theFP
- on: thePage
- startingFrom: ((thePage = stackPage
- and: [framePointer < thePage headFP])
- ifTrue: [framePointer]
- ifFalse: [thePage headFP])].
- theSP isNil ifTrue:
  [self print: 'could not find sp; using bogus value'; cr.
+ theSP := self frameReceiverOffset: theFP].
- theSP := theFP + FoxReceiver].
  self printFrame: theFP WithSP: theSP!

Item was changed:
  ----- Method: StackInterpreter>>printStackReferencesTo: (in category 'object memory support') -----
  printStackReferencesTo: oop
  <api>
  <var: #thePage type: #'StackPage *'>
  <var: #theSP type: #'char *'>
  <var: #theFP type: #'char *'>
  <var: #callerFP type: #'char *'>
  0 to: numStackPages - 1 do:
  [:i| | thePage theSP theFP callerFP |
  thePage := stackPages stackPageAt: i.
  thePage isFree ifFalse:
  [theSP := thePage headSP.
+ theFP := thePage headFP.
- theFP := thePage  headFP.
  "Skip the instruction pointer on top of stack of inactive pages."
  thePage = stackPage ifFalse:
  [theSP := theSP + objectMemory wordSize].
+ [[theSP <= (self frameReceiverOffset: theFP)] whileTrue:
- [[theSP <= (theFP + FoxReceiver)] whileTrue:
  [oop = (stackPages longAt: theSP) ifTrue:
  [self print: 'FP: '; printHexnp: theFP; print: ' @ '; printHexnp: theSP; cr].
  theSP := theSP + objectMemory wordSize].
+  (self frameHasContext: theFP) ifTrue:
- (self frameHasContext: theFP) ifTrue:
  [oop = (self frameContext: theFP) ifTrue:
  [self print: 'FP: '; printHexnp: theFP; print: ' CTXT'; cr]].
+  oop = (self frameMethod: theFP) ifTrue:
- oop = (self frameMethod: theFP) ifTrue:
  [self print: 'FP: '; printHexnp: theFP; print: ' MTHD'; cr].
+  (callerFP := self frameCallerFP: theFP) ~= 0]
+ whileTrue:
+ [theSP := (theFP + FoxCallerSavedIP) + objectMemory wordSize.
+ theFP := callerFP].
+ theSP := theFP + FoxCallerSavedIP. "a.k.a. FoxCallerContext"
- (callerFP := self frameCallerFP: theFP) ~= 0] whileTrue:
- [theSP := (theFP + FoxCallerSavedIP) + objectMemory wordSize.
- theFP := callerFP].
- theSP := theFP + FoxCallerContext. "a.k.a. FoxCallerSavedIP"
  [theSP <= thePage baseAddress] whileTrue:
  [oop = (stackPages longAt: theSP) ifTrue:
  [self print: 'FP: '; printHexnp: theFP; print: ' @ '; printHexnp: theSP; cr].
  theSP := theSP + objectMemory wordSize]]]!