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

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

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

Name: VMMaker.oscog-eem.2738
Author: eem
Time: 3 April 2020, 3:59:56.137049 pm
UUID: f6958436-d66a-477c-bbcb-4b6586462abe
Ancestors: VMMaker.oscog-eem.2737

CoInterpreter: small tweak for VMMaker.oscog-eem.2737.  On every entry to interpret avoid checking CReturnAddress and simply assign it.  Once set its value never changes, so an unchecked write will be faster and takes less code.

Simulation: make the simulator's close method a little more robust.

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

Item was changed:
  ----- Method: CoInterpreter>>interpret (in category 'interpreter shell') -----
  interpret
  "This is the main interpreter loop.
  In a pure interpreter it loops forever, fetching and executing bytecodes.
  With the Cogit JIT executing code as well, the interpreter is reentered from machine code
  whenever the machine code wants to interpret a method instead of executing its machine
  code.  Entry into the interpreter is done via a ''jump call'' in machine code that uses
  CFramePointer and CStackPointer to find the base of the C stack (set in CoInterpreter>>
  enterSmalltalkExecutiveImplementation) and substitutes CReturnAddress as the return
  address in the code so it always appears that interpret has been called from
  CoInterpreter>>enterSmalltalkExecutiveImplementation, which may be important to,
  for example, C exception handling inside the VM.
 
  When running in the context of a browser plugin VM the interpreter must return control
  to the browser periodically. This should done only when the state of the currently running
  Squeak thread is safely stored in the object heap. Since this is the case at the moment
  that a check for interrupts is performed, that is when we return to the browser if it is time
  to do so. Interrupt checks happen quite frequently."
 
  <inline: false>
  "If stacklimit is zero then the stack pages have not been initialized."
  stackLimit = 0 ifTrue:
  [^self initStackPagesAndInterpret].
+ "An unchecked write is probably faster, so instead of
+ CReturnAddress ifNil:
+ [CReturnAddress := self cCoerceSimple: self getReturnAddress to: #usqIntptr_t]
+ we have simply"
+ self assert: (CReturnAddress isNil or: [CReturnAddress = self getReturnAddress]).
+ CReturnAddress := self cCoerceSimple: self getReturnAddress to: #usqIntptr_t.
- CReturnAddress ifNil:
- [CReturnAddress := self cCoerceSimple: self getReturnAddress to: #usqIntptr_t].
  "record entry time when running as a browser plug-in"
  self browserPluginInitialiseIfNeeded.
  self internalizeIPandSP.
  self initExtensions.
  self fetchNextBytecode.
  [true] whileTrue: [self dispatchOn: currentBytecode in: BytecodeTable].
  localIP := localIP - 1.  "undo the pre-increment of IP before returning"
  self externalizeIPandSP.
  ^nil!

Item was changed:
  ----- Method: CogVMSimulator>>close (in category 'initialization') -----
  close  "close any files that ST may have opened, etc"
  pluginList do: [:assoc| | plugin | plugin := assoc value. plugin ~~ self ifTrue: [plugin close]].
  "Ugh; at least some of this code belongs in the UI..."
  World submorphs do:
  [:submorph|
  (submorph model isVMObjectInspector
  and: [submorph model coInterpreter == self]) ifTrue:
  [submorph delete].
  (submorph model isDebugger
+ and: [(submorph model interruptedProcess suspendedContext ifNotNil:
+ [:sctxt|
+ sctxt findContextSuchThat:
- and: [(submorph model interruptedProcess suspendedContext findContextSuchThat:
  [:ctxt|
  (ctxt receiver == cogit
  and: [ctxt selector == #simulateCogCodeAt:])
  or: [ctxt receiver == self
+ and: [ctxt selector == #interpret]]]]) notNil]) ifTrue:
- and: [ctxt selector == #interpret]]]) notNil]) ifTrue:
  [submorph model windowIsClosing.
  submorph delete]]!

Item was changed:
  ----- Method: CogVMSimulator>>interpret (in category 'interpreter shell') -----
  interpret
  "This is the main interpreter loop. It normally loops forever, fetching and executing bytecodes.
  When running in the context of a web browser plugin VM, however, it must return control to the
  web browser periodically. This should done only when the state of the currently running Squeak
  thread is safely stored in the object heap. Since this is the case at the moment that a check for
  interrupts is performed, that is when we return to the browser if it is time to do so.  Interrupt
  checks happen quite frequently.
 
  Override for simulation to insert bytecode breakpoint support."
 
  "If stacklimit is zero then the stack pages have not been initialized."
  stackLimit = 0 ifTrue:
  [^self initStackPagesAndInterpret].
+
+ "An unchecked write is probably faster, so instead of
+ CReturnAddress ifNil:
+ [CReturnAddress := self cCoerceSimple: self getReturnAddress to: #usqIntptr_t]
+ we have simply"
+ self assert: (CReturnAddress isNil or: [CReturnAddress = self getReturnAddress]).
+ CReturnAddress := self cCoerceSimple: self getReturnAddress to: #usqIntptr_t.
+
- CReturnAddress ifNil:
- [CReturnAddress := self cCoerceSimple: self getReturnAddress to: #usqIntptr_t].
  self useCogitBreakBlockIfNone.
  "record entry time when running as a browser plug-in"
  self browserPluginInitialiseIfNeeded.
  self internalizeIPandSP.
  self initExtensions.
  self fetchNextBytecode.
  [true] whileTrue:
  [self assertValidExecutionPointers.
  atEachStepBlock value. "N.B. may be nil"
  self dispatchOn: currentBytecode in: BytecodeTable.
  self incrementByteCount].
  localIP := localIP - 1.  "undo the pre-increment of IP before returning"
  self externalizeIPandSP.
  ^nil
  !

Item was changed:
  ----- Method: StackInterpreterSimulator>>close (in category 'initialization') -----
  close  "close any files that ST may have opened, etc"
  pluginList do: [:assoc| | plugin | plugin := assoc value. plugin ~~ self ifTrue: [plugin close]].
  "Ugh; at least some of this code belongs in the UI..."
  World submorphs do:
  [:submorph|
  (submorph model isVMObjectInspector
  and: [submorph model coInterpreter == self]) ifTrue:
  [submorph delete].
  (submorph model isDebugger
+ and: [(submorph model interruptedProcess suspendedContext ifNotNil:
+ [:sctxt|
+ sctxt findContextSuchThat:
- and: [(submorph model interruptedProcess suspendedContext findContextSuchThat:
  [:ctxt|
  ctxt receiver == self
+ and: [ctxt selector == #run]]]) notNil]) ifTrue:
- and: [ctxt selector == #run]]) notNil]) ifTrue:
  [submorph model windowIsClosing.
  submorph delete]]!