compiler/PPCASTUtilities.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Fri, 31 Jul 2015 14:07:31 +0100
changeset 514 46dd1237b20a
parent 506 e5d63143737f
child 516 3b81c9e53352
permissions -rw-r--r--
Fixed PPCSetUpBefore...Resource to work on Pharo. Few othr minor Pharo fixes.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
506
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/petitparser/compiler' }"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     3
"{ NameSpace: Smalltalk }"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     4
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
Object subclass:#PPCASTUtilities
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
	instanceVariableNames:''
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
	classVariableNames:''
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
	poolDictionaries:''
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
	category:'PetitCompiler-Support'
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
!
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    11
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
!PPCASTUtilities methodsFor:'checks'!
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    13
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
checkNodeIsFunctional: anRBBlockNode inClass: aClaas
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
    "Check whether the given node is purely functional or not. 
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
     If no, raise an erorr. If not, this method is noop.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    18
     A block is purely functional if and only if:
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    19
       (i) it does not refer to any instance or class variable or non-local variable
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    20
      (ii) all self-sends within the block are to 'purely-functional' methods
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
           (transitively)
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
     (iiI) contains no super-sends.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
    "
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
    | allDefinedVarNames allInstVarNames allClassVarNames cls |
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
    allDefinedVarNames := anRBBlockNode allDefinedVariables.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
    allInstVarNames := Set new.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
    allClassVarNames := Set new.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    29
    cls := aClaas.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    30
    [ cls notNil ] whileTrue:[ 
514
46dd1237b20a Fixed PPCSetUpBefore...Resource to work on Pharo. Few othr minor Pharo fixes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 506
diff changeset
    31
	| instanceVariables classVariables |
46dd1237b20a Fixed PPCSetUpBefore...Resource to work on Pharo. Few othr minor Pharo fixes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 506
diff changeset
    32
		
46dd1237b20a Fixed PPCSetUpBefore...Resource to work on Pharo. Few othr minor Pharo fixes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 506
diff changeset
    33
	instanceVariables := cls instanceVariables.
46dd1237b20a Fixed PPCSetUpBefore...Resource to work on Pharo. Few othr minor Pharo fixes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 506
diff changeset
    34
	classVariables := cls classVariables.
46dd1237b20a Fixed PPCSetUpBefore...Resource to work on Pharo. Few othr minor Pharo fixes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 506
diff changeset
    35
	instanceVariables notNil ifTrue:[
46dd1237b20a Fixed PPCSetUpBefore...Resource to work on Pharo. Few othr minor Pharo fixes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 506
diff changeset
    36
	    allInstVarNames addAll: instanceVariables.
46dd1237b20a Fixed PPCSetUpBefore...Resource to work on Pharo. Few othr minor Pharo fixes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 506
diff changeset
    37
	]. 
46dd1237b20a Fixed PPCSetUpBefore...Resource to work on Pharo. Few othr minor Pharo fixes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 506
diff changeset
    38
	classVariables notNil ifTrue:[
46dd1237b20a Fixed PPCSetUpBefore...Resource to work on Pharo. Few othr minor Pharo fixes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 506
diff changeset
    39
	    allClassVarNames addAll: classVariables.
46dd1237b20a Fixed PPCSetUpBefore...Resource to work on Pharo. Few othr minor Pharo fixes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 506
diff changeset
    40
	].
46dd1237b20a Fixed PPCSetUpBefore...Resource to work on Pharo. Few othr minor Pharo fixes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 506
diff changeset
    41
	cls := cls superclass.
506
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
    ].
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    43
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    44
    self withAllVariableNodesOf: anRBBlockNode  do: [ :node | 
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    45
        (allDefinedVarNames includes: node name) ifFalse:[ 
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
            (allInstVarNames includes: node name) ifTrue:[
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
                PPCCompilationError new signalWith: 'code refers to an instance variable named `',node name,'`'.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
                ^ self.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
            ].
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
            (allClassVarNames includes: node name) ifTrue:[
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
                PPCCompilationError new signalWith: 'code refers to a class variable named `',node name,'`'.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
                ^ self.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
            ].
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
            (Smalltalk includesKey: node name asSymbol) ifFalse:[ 
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    55
                PPCCompilationError new signalWith: 'code refers to an unknown variable named `',node name,'`'.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
                ^ self.                    
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    57
            ].
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    58
        ]
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    59
    ].
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
    self withAllMessageNodesOf: anRBBlockNode sentToSelfDo:[:node |
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    61
        | method |
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    62
        
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
        method := aClaas lookupSelector: node selector.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
        method isNil ifTrue:[
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
            PPCCompilationError new signalWith: 'code contains self-send to non-existent method'.        
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
            ^ self
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    67
        ].
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
        self checkNodeIsFunctional: method parseTree inClass: method methodClass.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
    ].      
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
    self withAllSuperNodesOf: anRBBlockNode do: [ :node | 
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
        PPCCompilationError new signalWith: 'code contains a super-send'.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    72
        ^ self
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
    ].
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    75
    "Created: / 27-07-2015 / 12:15:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
    "Modified: / 27-07-2015 / 14:43:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    77
! !
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
!PPCASTUtilities methodsFor:'enumerating'!
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    80
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    81
withAllMessageNodesOf: anRBProgramNode do: aBlock
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    82
    "Enumerate all chilren of `anRBProgramNode` (including itself)
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    83
     and evaluate `aBlock` for each message node."
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    84
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    85
    self withAllNodesOf: anRBProgramNode suchThat: [ :node | node isMessage ] do: aBlock.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    87
    "Created: / 18-06-2015 / 22:02:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    88
    "Modified (comment): / 27-07-2015 / 11:26:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    89
!
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
withAllMessageNodesOf: anRBProgramNode sentToSelfDo: aBlock
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
    "Enumerate all chilren of `anRBProgramNode` (including itself)
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
     and evaluate `aBlock` for each message node which sends a message
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    94
     to self (i.e., for self-sends)."
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    96
    self withAllNodesOf: anRBProgramNode suchThat: [ :node | node isMessage and:[node receiver isSelf ] ] do: aBlock.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    97
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    98
    "Created: / 27-07-2015 / 14:41:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    99
!
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   100
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   101
withAllNodesOf: node suchThat: predicate do: action
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   102
    "Enumerate all chilren of `node` (including itself)
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   103
     and evaluate `aBlock` for each node for which `predicate` returns true."
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   104
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   105
    (predicate value: node) ifTrue:[ 
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   106
        action value: node.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
    ].
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
    node children do:[:each | 
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   109
        self withAllNodesOf: each suchThat: predicate do: action
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   110
    ].
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
    "Created: / 18-06-2015 / 22:02:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   113
    "Modified (comment): / 27-07-2015 / 11:26:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   114
!
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   115
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   116
withAllSelfNodesOf: anRBProgramNode do: aBlock
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   117
    "Enumerate all chilren of `anRBProgramNode` (including itself)
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
     and evaluate `aBlock` for each `self` node."
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   120
    self withAllNodesOf: anRBProgramNode suchThat: [ :node | node isSelf ] do: aBlock.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   121
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   122
    "Created: / 18-06-2015 / 22:02:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   123
    "Modified (comment): / 27-07-2015 / 11:26:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   124
!
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   125
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
withAllSuperNodesOf: anRBProgramNode do: aBlock
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   127
    "Enumerate all chilren of `anRBProgramNode` (including itself)
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   128
     and evaluate `aBlock` for each `super` node."
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
    self withAllNodesOf: anRBProgramNode suchThat: [ :node | node isSuper ] do: aBlock.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   132
    "Created: / 27-07-2015 / 14:42:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   133
!
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   134
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   135
withAllVariableNodesOf: anRBProgramNode do: aBlock
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   136
    "Enumerate all chilren of `anRBProgramNode` (including itself)
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   137
     and evaluate `aBlock` for each variable node.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   138
     This is a replacement for Smalltalk/X's RBProgramNode>>variableNodesDo:
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   139
     which is not present in Pharo"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   140
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   141
    self withAllNodesOf: anRBProgramNode suchThat: [ :node | node isVariable and:[node isSelf not and:[node isSuper not]]] do: aBlock.
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   142
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   143
    "Created: / 18-06-2015 / 22:02:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   144
    "Modified (comment): / 27-07-2015 / 11:27:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   145
! !
e5d63143737f Added static analysis of blocks when inlining. Allow inlining only when block is functional
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   146