diff --git a/src/FAST-Core-Tools/FASTAbstractVariableVersionSSA.class.st b/src/FAST-Core-Tools/FASTAbstractVariableVersionSSA.class.st index a7f6a8c..6b784e7 100644 --- a/src/FAST-Core-Tools/FASTAbstractVariableVersionSSA.class.st +++ b/src/FAST-Core-Tools/FASTAbstractVariableVersionSSA.class.st @@ -34,6 +34,12 @@ FASTAbstractVariableVersionSSA >> includes: aSSAVersion [ ^ self ssaVariables includes: aSSAVersion ] +{ #category : 'testing' } +FASTAbstractVariableVersionSSA >> includesVersionOrPhi: aSSAVersionOrPhi [ + + ^ aSSAVersionOrPhi ssaVariables anySatisfy: [ :variable | self includes: variable ] +] + { #category : 'testing' } FASTAbstractVariableVersionSSA >> isPhi [ @@ -61,7 +67,7 @@ FASTAbstractVariableVersionSSA >> localDeclarationName [ { #category : 'accessing' } FASTAbstractVariableVersionSSA >> localUses [ - ^ self localDeclaration localUses select: [ :access | access ssaVersion includes: self ] + ^ self localDeclaration localUses select: [ :access | access ssaVersion includesVersionOrPhi: self ] ] { #category : 'accessing' } @@ -81,7 +87,19 @@ FASTAbstractVariableVersionSSA >> printOn: aStream [ aStream nextPut: $] ] +{ #category : 'accessing' } +FASTAbstractVariableVersionSSA >> readAccesses [ + + ^ self localUses reject: [ :access | access isVariableWriteAccess ] +] + { #category : 'accessing' } FASTAbstractVariableVersionSSA >> ssaVariables [ ^ self subclassResponsibility ] + +{ #category : 'accessing' } +FASTAbstractVariableVersionSSA >> writeAccesses [ + + ^ self localUses select: [ :access | access isVariableWriteAccess ] +] diff --git a/src/FAST-Core-Tools/FASTPyTCanBeVariable.extension.st b/src/FAST-Core-Tools/FASTPyTCanBeVariable.extension.st new file mode 100644 index 0000000..086428b --- /dev/null +++ b/src/FAST-Core-Tools/FASTPyTCanBeVariable.extension.st @@ -0,0 +1,13 @@ +Extension { #name : 'FASTPyTCanBeVariable' } + +{ #category : '*FAST-Core-Tools' } +FASTPyTCanBeVariable >> localDeclarationName [ + + self explicitRequirement +] + +{ #category : '*FAST-Core-Tools' } +FASTPyTCanBeVariable >> variableDeclarator [ + + self explicitRequirement +] diff --git a/src/FAST-Core-Tools/FASTTEntity.extension.st b/src/FAST-Core-Tools/FASTTEntity.extension.st index 409a3aa..fcbbe76 100644 --- a/src/FAST-Core-Tools/FASTTEntity.extension.st +++ b/src/FAST-Core-Tools/FASTTEntity.extension.st @@ -65,6 +65,13 @@ FASTTEntity >> isSameAsCFGCasePattern: aPattern [ ^ self sourceCode = aPattern sourceCode ] +{ #category : '*FAST-Core-Tools' } +FASTTEntity >> isVariableWriteAccess [ + "I should be implemented in order to have the SSA working well. I should return false for most nodes, and return true if I represent a node that is a write access for a variable." + + ^ self explicitRequirement +] + { #category : '*FAST-Core-Tools' } FASTTEntity >> localDeclaration [ "Used for LocalResolver" @@ -102,6 +109,15 @@ FASTTEntity >> newVersionNumber [ ifNotNil: [ :active | active version + 1 ] ] +{ #category : '*FAST-Core-Tools' } +FASTTEntity >> readAccesses [ + + | uses | + uses := self attributeAt: #localUses ifAbsent: [ Error signal: 'No local resolution done.' ]. + + ^ uses reject: #isVariableWriteAccess +] + { #category : '*FAST-Core-Tools' } FASTTEntity >> ssaName [ "Used for SSA" @@ -122,3 +138,12 @@ FASTTEntity >> ssaVersion: aSSAVersion [ self attributeAt: #ssaVersion put: aSSAVersion ] + +{ #category : '*FAST-Core-Tools' } +FASTTEntity >> writeAccesses [ + + | uses | + uses := self attributeAt: #localUses ifAbsent: [ Error signal: 'No local resolution done.' ]. + + ^ uses select: #isVariableWriteAccess +]