From 00f5c7a6e059e0840869ff8b3bcb1640779d848b Mon Sep 17 00:00:00 2001 From: Marcus Denker Date: Thu, 25 Feb 2021 14:21:13 +0100 Subject: [PATCH 1/2] This fixes a decompile problem: when a super is in a full block on the class side, the decompiler can not create an intermediate variable for it. This PR adds a test and a workaround for that problem. This is one of the 3 problems shown by https://github.com/pharo-project/pharo/issues/7952 --- .../FBDDecompilerTest.class.st | 14 +++++++++++++- .../FBDExamples.class.st | 7 +++++++ src/Flashback-Decompiler/FBDASTBuilder.class.st | 7 +++++-- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/Flashback-Decompiler-Tests/FBDDecompilerTest.class.st b/src/Flashback-Decompiler-Tests/FBDDecompilerTest.class.st index 603795be4aa..27f53f77696 100644 --- a/src/Flashback-Decompiler-Tests/FBDDecompilerTest.class.st +++ b/src/Flashback-Decompiler-Tests/FBDDecompilerTest.class.st @@ -13,6 +13,12 @@ FBDDecompilerTest >> checkCorrectDecompilation: aSelector [ self checkCorrectMethodDecompilation: (self getMethod: aSelector) ] +{ #category : #verification } +FBDDecompilerTest >> checkCorrectDecompilationClassSide: aSelector [ + + self checkCorrectMethodDecompilation: (self getMethodClassSide: aSelector) +] + { #category : #verification } FBDDecompilerTest >> checkCorrectMethodDecompilation: originalMethod [ @@ -66,6 +72,12 @@ FBDDecompilerTest >> getMethod: selector [ ^ self exampleClass >> selector ] +{ #category : #private } +FBDDecompilerTest >> getMethodClassSide: selector [ + + ^ self exampleClass class >> selector +] + { #category : #tests } FBDDecompilerTest >> test2Loops [ @@ -803,7 +815,7 @@ FBDDecompilerTest >> testSuper [ { #category : #tests } FBDDecompilerTest >> testSuperCallInBlock [ - self checkCorrectDecompilation: #superCallInBlock + self checkCorrectDecompilationClassSide: #superCallInBlock ] { #category : #tests } diff --git a/src/Flashback-Decompiler-Tests/FBDExamples.class.st b/src/Flashback-Decompiler-Tests/FBDExamples.class.st index 1ee01307680..5c515fd0233 100644 --- a/src/Flashback-Decompiler-Tests/FBDExamples.class.st +++ b/src/Flashback-Decompiler-Tests/FBDExamples.class.st @@ -14,6 +14,13 @@ Class { #category : #'Flashback-Decompiler-Tests-Examples' } +{ #category : #examples } +FBDExamples class >> superCallInBlock [ + + ^ [ super yourself ] value + +] + { #category : #examples } FBDExamples >> doubleRemoteAnidatedBlocks [ diff --git a/src/Flashback-Decompiler/FBDASTBuilder.class.st b/src/Flashback-Decompiler/FBDASTBuilder.class.st index 8cda9dd4987..33504e9690a 100644 --- a/src/Flashback-Decompiler/FBDASTBuilder.class.st +++ b/src/Flashback-Decompiler/FBDASTBuilder.class.st @@ -20,8 +20,11 @@ FBDASTBuilder class >> newFor: class [ ] { #category : #constructor } -FBDASTBuilder >> codeAnyLitInd: anAssociation [ - ^ (RBVariableNode named: anAssociation key) +FBDASTBuilder >> codeAnyLitInd: anAssociation [ + | varName | + "class binding on the class side has nil as key" + varName := anAssociation key ifNil: [ 'class binding' ] ifNotNil: [ anAssociation key ]. + ^ (RBVariableNode named: varName) binding: anAssociation; yourself ] From 95ba88ad7e2d1f6c1fdcadac24e36e9b5801e00a Mon Sep 17 00:00:00 2001 From: Marcus Denker Date: Thu, 25 Feb 2021 14:22:55 +0100 Subject: [PATCH 2/2] make testSuperCallInBlockClassSide its own test --- src/Flashback-Decompiler-Tests/FBDDecompilerTest.class.st | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Flashback-Decompiler-Tests/FBDDecompilerTest.class.st b/src/Flashback-Decompiler-Tests/FBDDecompilerTest.class.st index 27f53f77696..6a30fd6be7a 100644 --- a/src/Flashback-Decompiler-Tests/FBDDecompilerTest.class.st +++ b/src/Flashback-Decompiler-Tests/FBDDecompilerTest.class.st @@ -815,6 +815,12 @@ FBDDecompilerTest >> testSuper [ { #category : #tests } FBDDecompilerTest >> testSuperCallInBlock [ + self checkCorrectDecompilation: #superCallInBlock +] + +{ #category : #tests } +FBDDecompilerTest >> testSuperCallInBlockClassSide [ + self checkCorrectDecompilationClassSide: #superCallInBlock ]