The Inbox: Compiler-ct.424.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

The Inbox: Compiler-ct.424.mcz

commits-2
Christoph Thiede uploaded a new version of Compiler to project The Inbox:
http://source.squeak.org/inbox/Compiler-ct.424.mcz

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

Name: Compiler-ct.424
Author: ct
Time: 26 March 2020, 5:19:54.71456 pm
UUID: 10f4405b-896c-3149-b76b-b9cd45ca5734
Ancestors: Compiler-nice.420

Fixes a bug regarding decompilation of FullBlockClosures

Sample to reproduce: [^ true] decompile should NOT return {[]}!

=============== Diff against Compiler-nice.420 ===============

Item was changed:
  ----- Method: Decompiler>>blockTo: (in category 'control') -----
  blockTo: end
+ "Decompile a range of code as in statementsTo:, but return a block node. NB: end is an exclusive index."
- "Decompile a range of code as in statementsTo:, but return a block node."
  | exprs block oldBase lastStatementOfBlockIsNil |
  oldBase := blockStackBase.
  blockStackBase := stack size.
  exprs := self statementsTo: end.
  lastStatementOfBlockIsNil := pc < method endPC and: [exprs notEmpty and: [exprs last == (constTable at: 4)]].
  lastStatementOfBlockIsNil ifTrue:
  [exprs := exprs allButLast].
  block := constructor codeBlock: exprs returns: lastReturnPc = lastPc.
  blockStackBase := oldBase.
  lastReturnPc := -1.  "So as not to mislead outer calls"
  ^block!

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 |
  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 + 1.
- 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).!


Reply | Threaded
Open this post in threaded view
|

Re: The Inbox: Compiler-ct.424.mcz

Christoph Thiede

Don't we have a test for this at the moment?


Von: Squeak-dev <[hidden email]> im Auftrag von [hidden email] <[hidden email]>
Gesendet: Donnerstag, 26. März 2020 17:20:00
An: [hidden email]
Betreff: [squeak-dev] The Inbox: Compiler-ct.424.mcz
 
Christoph Thiede uploaded a new version of Compiler to project The Inbox:
http://source.squeak.org/inbox/Compiler-ct.424.mcz

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

Name: Compiler-ct.424
Author: ct
Time: 26 March 2020, 5:19:54.71456 pm
UUID: 10f4405b-896c-3149-b76b-b9cd45ca5734
Ancestors: Compiler-nice.420

Fixes a bug regarding decompilation of FullBlockClosures

Sample to reproduce: [^ true] decompile should NOT return {[]}!

=============== Diff against Compiler-nice.420 ===============

Item was changed:
  ----- Method: Decompiler>>blockTo: (in category 'control') -----
  blockTo: end
+        "Decompile a range of code as in statementsTo:, but return a block node. NB: end is an exclusive index."
-        "Decompile a range of code as in statementsTo:, but return a block node."
         | exprs block oldBase lastStatementOfBlockIsNil |
         oldBase := blockStackBase.
         blockStackBase := stack size.
         exprs := self statementsTo: end.
         lastStatementOfBlockIsNil := pc < method endPC and: [exprs notEmpty and: [exprs last == (constTable at: 4)]].
         lastStatementOfBlockIsNil ifTrue:
                 [exprs := exprs allButLast].
         block := constructor codeBlock: exprs returns: lastReturnPc = lastPc.
         blockStackBase := oldBase.
         lastReturnPc := -1.  "So as not to mislead outer calls"
         ^block!

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 |
         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 + 1.
-        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).!