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

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

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

Name: VMMaker.oscog-eem.878
Author: eem
Time: 12 September 2014, 12:35:22.8 pm
UUID: 4165e5c9-05a2-4795-9295-8b309fa52e2d
Ancestors: VMMaker.oscog-eem.877

Make sure that the method is set on returning from a callback.

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

Item was changed:
  ----- Method: StackInterpreter>>returnAs:ThroughCallback:Context: (in category 'callback support') -----
  returnAs: returnTypeOop ThroughCallback: vmCallbackContext Context: callbackMethodContext
  "callbackMethodContext is an activation of invokeCallback:[stack:registers:jmpbuf:].
  Its sender is the VM's state prior to the callback.  Reestablish that state (via longjmp),
  and mark callbackMethodContext as dead."
  <export: true>
  <var: #vmCallbackContext type: #'VMCallbackContext *'>
  | calloutMethodContext theFP thePage |
  <var: #theFP type: #'char *'>
  <var: #thePage type: #'StackPage *'>
  ((self isIntegerObject: returnTypeOop)
  and: [self isLiveContext: callbackMethodContext]) ifFalse:
  [^false].
  calloutMethodContext := self externalInstVar: SenderIndex ofContext: callbackMethodContext.
  (self isLiveContext: calloutMethodContext) ifFalse:
  [^false].
  "We're about to leave this stack page; must save the current frame's instructionPointer."
  self push: instructionPointer.
  self externalWriteBackHeadFramePointers.
  "Mark callbackMethodContext as dead; the common case is that it is the current frame.
  We go the extra mile for the debugger."
  (self isSingleContext: callbackMethodContext)
  ifTrue: [self markContextAsDead: callbackMethodContext]
  ifFalse:
  [theFP := self frameOfMarriedContext: callbackMethodContext.
  framePointer = theFP "common case"
  ifTrue:
  [(self isBaseFrame: theFP)
  ifTrue: [stackPages freeStackPage: stackPage]
  ifFalse: "calloutMethodContext is immediately below on the same page.  Make it current."
  [instructionPointer := (self frameCallerSavedIP: framePointer) asUnsignedInteger.
  stackPointer := framePointer + (self frameStackedReceiverOffset: framePointer) + BytesPerWord.
  framePointer := self frameCallerFP: framePointer.
  self restoreCStackStateForCallbackContext: vmCallbackContext.
  "N.B. siglongjmp is defines as _longjmp on non-win32 platforms.
   This matches the use of _setjmp in ia32abicc.c."
  self siglong: vmCallbackContext trampoline jmp: (self integerValueOf: returnTypeOop).
  ^true]]
  ifFalse:
  [self externalDivorceFrame: theFP andContext: callbackMethodContext.
  self markContextAsDead: callbackMethodContext]].
  "Make the calloutMethodContext the active frame.  The case where calloutMethodContext
  is immediately below callbackMethodContext on the same page is handled above."
  (self isStillMarriedContext: calloutMethodContext)
  ifTrue:
  [theFP := self frameOfMarriedContext: calloutMethodContext.
  thePage := stackPages stackPageFor: theFP.
  "findSPOf:on: points to the word beneath the instructionPointer, but
   there is no instructionPointer on the top frame of the current page."
  self assert: thePage ~= stackPage.
  stackPointer := (self findSPOf: theFP on: thePage) - BytesPerWord.
  framePointer := theFP]
  ifFalse:
  [thePage := self makeBaseFrameFor: calloutMethodContext.
  framePointer := thePage headFP.
  stackPointer := thePage headSP].
  instructionPointer := self popStack.
+ self setMethod: (objectMemory fetchPointer: MethodIndex ofObject: calloutMethodContext).
  self setStackPageAndLimit: thePage.
  self restoreCStackStateForCallbackContext: vmCallbackContext.
  "N.B. siglongjmp is defines as _longjmp on non-win32 platforms.
   This matches the use of _setjmp in ia32abicc.c."
  self siglong: vmCallbackContext trampoline jmp: (self integerValueOf: returnTypeOop).
  "NOTREACHED"
  ^true!