Nicolas Cellier uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-nice.417.mcz ==================== Summary ==================== Name: Compiler-nice.417 Author: nice Time: 11 March 2020, 10:18:30.802676 pm UUID: dabc222a-b8c1-4a9e-9495-938c11b4f17b Ancestors: Compiler-eem.416 Fix decompilation of FullBlockClosure Some Closure with complex jump flow (optimized ifTrue: etc...) will alter some of the states required to decompile the method and fool the backward return detection logic. There are so many states to be saved, that the most reasonable thing to do is to decompile the block in a shallowCopy, and simply re-initialize the states that should not be shared. Note that this is un-necessary for all the immediate or immutable values, which are not shared states with the shallowCopy, so we don't have to care for most of them. Same changes could eventually apply to V3 closure, but if it ain't broken don't fix it: it's touchy and it would be necessary to test that in a non SistaV1 which is superfluous... Last little detail: don't invoke super method:pc: there is a single implementation and self will do the work. =============== Diff against Compiler-eem.416 =============== Item was changed: ----- Method: Decompiler>>decompile:in:method:using: (in category 'public access') ----- decompile: aSelector in: aClass method: aMethod using: aConstructor | block node | constructor := aConstructor. method := aMethod. self initSymbols: aClass. "create symbol tables" method isQuick ifTrue: [block := self quickMethod] ifFalse: [stack := OrderedCollection new: method frameSize. lastJumpIfPcStack := OrderedCollection new. caseExits := OrderedCollection new. statements := OrderedCollection new: 20. numLocalTemps := 0. + self method: method pc: method initialPC. - super method: method pc: method initialPC. "skip primitive error code store if necessary" (method primitive ~= 0 and: [self skipCallPrimitive; willStore]) ifTrue: [pc := pc + (method encoderClass bytecodeSize: self firstByte). tempVars := tempVars asOrderedCollection]. block := self blockTo: method endPC + 1. stack isEmpty ifFalse: [self error: 'stack not empty']]. node := constructor codeMethod: aSelector block: block tempVars: tempVars primitive: method primitive class: aClass. method primitive > 0 ifTrue: [node removeAndRenameLastTempIfErrorCode]. ^node preen! Item was changed: ----- Method: Decompiler>>doClosureCopy:copiedValues: (in category 'control') ----- doClosureCopy: aCompiledBlock copiedValues: blockCopiedValues + "implementation note: must be invoked on a copy because it modifies states" + | savedPC blockArgs blockTemps blockTempsOffset block mark | - | savedTemps savedTempVarCount savedNumLocalTemps savedMethod savedPC - blockArgs blockTemps blockTempsOffset block | - savedTemps := tempVars. - savedTempVarCount := tempVarCount. - savedNumLocalTemps := numLocalTemps. numLocalTemps := aCompiledBlock numTemps - aCompiledBlock numArgs - blockCopiedValues size. blockTempsOffset := aCompiledBlock numArgs + blockCopiedValues size. (blockStartsToTempVars notNil "implies we were intialized with temp names." and: [blockStartsToTempVars includesKey: aCompiledBlock]) ifTrue: [tempVars := blockStartsToTempVars at: aCompiledBlock] ifFalse: [blockArgs := (1 to: aCompiledBlock numArgs) collect: [:i| (constructor codeTemp: i - 1 named: 't', (tempVarCount + i) printString) beBlockArg]. blockTemps := (1 to: numLocalTemps) collect: [:i| constructor codeTemp: i + blockTempsOffset - 1 named: 't', (tempVarCount + i + aCompiledBlock numArgs) printString]. tempVars := blockArgs, blockCopiedValues, blockTemps]. tempVarCount := tempVarCount + aCompiledBlock numArgs + numLocalTemps. + lastJumpIfPcStack := OrderedCollection new. + caseExits := OrderedCollection new. + statements := OrderedCollection new: 20. + savedPC := pc. + self method: (method := aCompiledBlock) pc: aCompiledBlock initialPC. + mark := stack size. + block := self blockTo: aCompiledBlock endPC. + mark = stack size ifFalse: [self error: 'block did alter the stack']. + ^((constructor + codeArguments: (tempVars copyFrom: 1 to: aCompiledBlock numArgs) + temps: (tempVars copyFrom: blockTempsOffset + 1 to: blockTempsOffset + numLocalTemps) + block: block) + pc: aCompiledBlock -> savedPC; "c.f. BytecodeEncoder>>pc" + yourself).! - savedMethod := self method. savedPC := pc. - super method: (method := aCompiledBlock) pc: aCompiledBlock initialPC. - block := [self blockTo: aCompiledBlock endPC] - ensure: [super method: (method := savedMethod) pc: savedPC]. - stack addLast: ((constructor - codeArguments: (tempVars copyFrom: 1 to: aCompiledBlock numArgs) - temps: (tempVars copyFrom: blockTempsOffset + 1 to: blockTempsOffset + numLocalTemps) - block: block) - pc: aCompiledBlock -> pc; "c.f. BytecodeEncoder>>pc" - yourself). - tempVars := savedTemps. - tempVarCount := savedTempVarCount. - numLocalTemps := savedNumLocalTemps! Item was changed: ----- Method: Decompiler>>pushFullClosure:numCopied: (in category 'instruction decoding') ----- pushFullClosure: aCompiledBlock numCopied: numCopied | copiedValues | copiedValues := ((1 to: numCopied) collect: [:ign| stack removeLast]) reversed. + stack addLast: (self shallowCopy doClosureCopy: aCompiledBlock copiedValues: copiedValues)! - self doClosureCopy: aCompiledBlock copiedValues: copiedValues! |
Hi Nicolas, nice, thank you! On Wed, Mar 11, 2020 at 2:18 PM <[hidden email]> wrote: Nicolas Cellier uploaded a new version of Compiler to project The Trunk: _,,,^..^,,,_ best, Eliot |
Free forum by Nabble | Edit this page |