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]]! |
Free forum by Nabble | Edit this page |