IRFunction.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 24 Mar 2010 07:50:55 +0000
changeset 30 1b7ff9c8c40b
parent 29 2f154b67e1e8
child 37 be8c2dd09dff
permissions -rw-r--r--
Fixed bug that caused bad code generation for closures with more than one basic blocks.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
     1
"{ Package: 'cvut:stx/goodies/newcompiler' }"
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     3
Object subclass:#IRFunction
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     4
	instanceVariableNames:'startSequence primitiveNode tempKeys tempMap numRargs properties
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
		additionalLiterals maxOrderNumber sourceMap environmentIr
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
		compiledCode'
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
	classVariableNames:''
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
	poolDictionaries:''
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
	category:'NewCompiler-IR'
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    11
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
10
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
    13
!IRFunction class methodsFor:'instance creation'!
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
    14
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
    15
new
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
    16
    ^ self basicNew initialize.
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
    17
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
    18
    "Created: / 11-06-2008 / 00:52:34 / Jan Vrany <vranyj1@fel.cvut.cz>"
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
    19
! !
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
    20
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
!IRFunction methodsFor:'accessing'!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
addLiteral: aSymbol
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
    24
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
	additionalLiterals add: aSymbol.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
addLiterals: anArray
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
    29
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    30
	additionalLiterals addAll: anArray.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    31
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    32
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
addTemps: newKeys
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
    | keys i new |
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
    keys := self tempKeys.
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
    37
    i := keys size -
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
    38
	    (self isIRMethod
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
    39
		ifTrue:[1 "zero-based (index 0 equals receiver - self)"]
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
    40
		ifFalse:[0]).
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
    new := OrderedCollection new.
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
    42
    newKeys do:
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
    43
	[:key |
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
    44
	tempMap at: key ifAbsentPut:
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
    45
	    [new add: key.
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
    46
	    i := i + 1]].
21
a5d30403049c Small improvement in IRFunction>>addTemps:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
    47
    new isEmpty ifTrue:[^self].
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
    self tempKeys: keys, new.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
21
a5d30403049c Small improvement in IRFunction>>addTemps:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
    50
    "Modified: / 12-08-2009 / 09:22:05 / Jan Vrany <vranyj1@fel.cvut.cz>"
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
29
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    53
addTempsIfNotDefined: temps
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    54
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    55
    | ir tempsToAdd |
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    56
    ir := self.
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    57
    tempsToAdd := temps asSet.
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    58
    [ ir isNil ] whileFalse: 
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    59
        [ir tempNames do:
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    60
            [:temp|
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    61
            (tempsToAdd includes:temp)
30
1b7ff9c8c40b Fixed bug that caused bad code generation for closures with more than one basic blocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 29
diff changeset
    62
                ifTrue:[tempsToAdd remove: temp]].
29
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    63
        ir := ir environmentIr].
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    64
    tempsToAdd isEmpty ifTrue:[^self].
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    65
    self addTemps: tempsToAdd
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    66
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    67
    "Created: / 23-03-2010 / 13:51:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    68
!
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    69
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
additionalLiterals
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
	^additionalLiterals.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    72
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
allInstructions
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    75
	" return irNodes as a flat collection "
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    77
	| irInstructions |
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
	irInstructions := OrderedCollection new.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
	startSequence withAllSuccessorsDo: [:seq | seq do: [:bc | irInstructions add: bc]].
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    80
	^irInstructions
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    81
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    82
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    83
allInstructionsMatching: aBlock
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    84
	" return irNodes as a flat collection "
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    85
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
	| irInstructions |
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    87
	irInstructions := OrderedCollection new.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    88
	startSequence withAllSuccessorsDo: [:seq | seq do: [:bc | (aBlock value: bc) ifTrue: [irInstructions add: bc]]].
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    89
	^irInstructions
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
allSendInstructions
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
	^self allInstructionsMatching: [:bc | bc isSend].
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    94
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    96
allSequences
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    97
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    98
	^ startSequence withAllSuccessors
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    99
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   100
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   101
allTempAccessInstructions
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   102
	^self allInstructionsMatching: [:bc | bc isTempAccess].
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   103
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   104
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   105
allTempReadInstructions
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   106
	^self allInstructionsMatching: [:bc | bc isTempRead].
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   109
allTempWriteInstructions
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   110
	^self allInstructionsMatching: [:bc | bc isTempStore].
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
29
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   113
environmentIr
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   114
    ^ environmentIr
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   115
!
2f154b67e1e8 Added addTempsIfNotDefined:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   116
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   117
ir
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
	^self.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   120
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   121
method
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   122
	^self.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   123
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   124
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   125
numArgs
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   127
	^ self numRargs
10
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   128
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   129
    "Modified: / 30-03-2009 / 18:47:59 / Jan Vrany <vranyj1@fel.cvut.cz>"
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   132
numRargs
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   133
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   134
	^ numRargs
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   135
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   136
10
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   137
numVars
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   138
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   139
	^ self tempKeys size - self numRargs
10
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   140
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   141
    "Created: / 30-03-2009 / 18:37:47 / Jan Vrany <vranyj1@fel.cvut.cz>"
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   142
!
0fd549e0c784 First simple block works. See IRBuilderTest>>testBlock_blockTempArg.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   143
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   144
primitiveNode
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   145
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   146
	^ primitiveNode
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   147
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   148
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   149
properties
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   150
	^properties
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   151
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   152
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   153
properties: propDict
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   154
	properties := propDict.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   155
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   156
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   157
startSequence
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   158
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   159
	^ startSequence
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   160
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   161
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   162
tempKeys
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   163
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   164
	^ tempKeys
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   165
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   166
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   167
tempMap
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   168
    ^ tempMap
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   169
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   170
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   171
tempNames
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   172
	"All temp names in context order"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   173
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   174
	| varNames |
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   175
	varNames _ OrderedCollection new.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   176
	self tempKeys do: [:var | | name |
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   177
		name _ var asString.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   178
		"vars are unique but inlined to:do: loop vars may have the same name, so munge the names to make them different"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   179
		[varNames includes: name] whileTrue: [name _ name, 'X'].
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   180
		varNames add: name.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   181
	].
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   182
	^ varNames asArray
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   183
! !
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   184
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   185
!IRFunction methodsFor:'accessing - defaults'!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   186
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   187
defaultCompiledCodeClass
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   188
    "raise an error: must be redefined in concrete subclass(es)"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   189
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   190
    ^ self subclassResponsibility
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   191
! !
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   192
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   193
!IRFunction methodsFor:'debugging support'!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   194
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   195
inspector2TabIRCode
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   196
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   197
    ^Tools::Inspector2Tab new
28
2eab5fdb9467 - Removed IRDecompiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   198
        label: 'IR Code';
2eab5fdb9467 - Removed IRDecompiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   199
        priority: 75;
2eab5fdb9467 - Removed IRDecompiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   200
        text: self longPrintString.
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   201
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   202
    "Created: / 11-06-2008 / 01:05:16 / Jan Vrany <vranyj1@fel.cvut.cz>"
28
2eab5fdb9467 - Removed IRDecompiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   203
    "Modified: / 15-02-2010 / 13:04:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   204
! !
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   205
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   206
!IRFunction methodsFor:'decompiling'!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   207
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   208
ast
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   209
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   210
	^ IRDecompiler new decompileIR: self
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   211
! !
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   212
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   213
!IRFunction methodsFor:'initialize'!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   214
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   215
initialize
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   216
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   217
	primitiveNode := PrimitiveNode primitiveNumber: 0.
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   218
	tempKeys := OrderedCollection new.
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   219
	tempMap := Dictionary new.
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   220
	properties := Dictionary new.
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   221
	additionalLiterals := OrderedCollection new.
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   222
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   223
    "Modified: / 30-03-2009 / 11:16:15 / Jan Vrany <vranyj1@fel.cvut.cz>"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   224
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   225
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   226
numRargs: n
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   227
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   228
	numRargs _ n
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   229
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   230
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   231
primitiveNode: aPrimitiveNode
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   232
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   233
	primitiveNode _ aPrimitiveNode
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   234
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   235
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   236
startSequence: irSequence
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   237
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   238
	startSequence _ irSequence.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   239
	irSequence method: self.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   240
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   241
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   242
tempKeys: objects
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   243
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   244
	tempKeys _ objects
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   245
! !
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   246
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   247
!IRFunction methodsFor:'inlining'!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   248
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   249
addInstructionsAfter: aCollection
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   250
	| returningSeqs  lastInstr |
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   251
	aCollection ifEmpty: [^self].
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   252
	returningSeqs := self allSequences select: [:each | each last isReturn].
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   253
	lastInstr := returningSeqs last last.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   254
	lastInstr addInstructionsBefore: aCollection.
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   255
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   256
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   257
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   258
addInstructionsBefore: aCollection
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   259
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   260
	(self startSequence nextSequence first) addInstructionsBefore: aCollection.
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   261
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   262
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   263
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   264
methodForInlining
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   265
	^self removeReturnSelf removeEmptyStart.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   266
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   267
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   268
removeReturn
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   269
	self allSequences last removeLast.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   270
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   271
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   272
removeReturnSelf
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   273
	self removeReturn.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   274
	self allSequences last removeLast.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   275
! !
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   276
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   277
!IRFunction methodsFor:'instructions - helpers'!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   278
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   279
pushTemp: tempName in: irFunction level: level
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   280
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   281
    | index kind |
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   282
    index := tempMap
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   283
		at: tempName
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   284
		ifAbsent:
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   285
		    [environmentIr
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   286
			ifNil:[self error:'No such temp: ', tempName]
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   287
			ifNotNil:[^environmentIr pushTemp: tempName in: irFunction level: level + 1]].
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   288
    kind := (index <= self numArgs)
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   289
		ifTrue: [self tempArgKindForLevel: level]
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   290
		ifFalse:[
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   291
		    index := index - self numArgs.
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   292
		    self tempVarKindForLevel: level
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   293
		].
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   294
    ^IRInstruction pushTemp: index kind: kind level: level
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   295
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   296
    "Created: / 30-03-2009 / 11:54:14 / Jan Vrany <vranyj1@fel.cvut.cz>"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   297
    "Modified: / 30-03-2009 / 13:59:14 / Jan Vrany <vranyj1@fel.cvut.cz>"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   298
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   299
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   300
storeTemp: tempName in: irFunction level: level
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   301
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   302
    | index kind |
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   303
    index := tempMap
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   304
		at: tempName
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   305
		ifAbsent:
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   306
		    [environmentIr
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   307
			ifNil:[self error:'No such temp: ', tempName]
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   308
			ifNotNil:[^environmentIr storeTemp: tempName in: irFunction level: level + 1]].
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   309
    kind := (index <= self numArgs)
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   310
		ifTrue: [self tempArgKindForLevel: level]
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   311
		ifFalse:[
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   312
		    index := index - self numArgs.
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   313
		    self tempVarKindForLevel: level
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   314
		].
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   315
    ^IRInstruction storeTemp: index kind: kind level: level
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   316
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   317
    "Created: / 30-03-2009 / 11:57:05 / Jan Vrany <vranyj1@fel.cvut.cz>"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   318
    "Modified: / 30-03-2009 / 13:59:25 / Jan Vrany <vranyj1@fel.cvut.cz>"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   319
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   320
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   321
tempArgKindForLevel: level
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   322
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   323
    ^self subclassResponsibility
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   324
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   325
    "Created: / 30-03-2009 / 11:58:15 / Jan Vrany <vranyj1@fel.cvut.cz>"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   326
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   327
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   328
tempVarKindForLevel: level
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   329
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   330
    ^self subclassResponsibility
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   331
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   332
    "Created: / 30-03-2009 / 11:58:25 / Jan Vrany <vranyj1@fel.cvut.cz>"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   333
! !
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   334
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   335
!IRFunction methodsFor:'mapping'!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   336
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   337
sourceMap
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   338
    "Return a mapping from bytecode pcs to source code ranges"
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   339
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   340
    |start map|
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   341
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   342
    "Besides getting start position, make sure bytecodeIndices are filled in"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   343
    start := self compiledCode initialPC - 1.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   344
    map := OrderedCollection new.
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   345
    self allSequences do:[:seq |
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   346
	seq do:[:instr |
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   347
	    |node|
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   348
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   349
	    ((node := instr sourceNode) notNil
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   350
		and:[
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   351
		    node debugHighlightStart notNil
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   352
			and:[ node debugHighlightStop notNil and:[ instr bytecodeIndex notNil ] ]
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   353
		])
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   354
		    ifTrue:[
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   355
			map add:instr bytecodeIndex + start
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   356
				    -> (node debugHighlightStart to:node debugHighlightStop)
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   357
		    ]
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   358
	]
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   359
    ].
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   360
    ^ map
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   361
! !
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   362
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   363
!IRFunction methodsFor:'optimizing'!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   364
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   365
absorbConstantConditionalJumps
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   366
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   367
	startSequence absorbConstantConditionalJumps: IdentitySet new
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   368
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   369
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   370
absorbJumpsToSingleInstrs
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   371
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   372
	startSequence absorbJumpToSingleInstr: IdentitySet new
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   373
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   374
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   375
absorbSinglePredecessor
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   376
	| predecessor |
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   377
	startSequence
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   378
		detectSinglePredecessor: (predecessor := IdentityDictionary new)
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   379
		seen: IdentitySet new.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   380
	startSequence collapseSinglePredecessor: predecessor seen: IdentitySet new
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   381
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   382
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   383
maxOrderNumber
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   384
	maxOrderNumber ifNil: [
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   385
		maxOrderNumber := self startSequence orderNumber.
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   386
		self startSequence withAllSuccessorsDo: [:seq | maxOrderNumber := maxOrderNumber max: seq orderNumber].
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   387
	].
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   388
	^ maxOrderNumber.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   389
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   390
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   391
newSeq
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   392
	maxOrderNumber _ self maxOrderNumber  +1.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   393
	^ IRSequence new  orderNumber:maxOrderNumber
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   394
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   395
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   396
optimize
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   397
	self removeEmptyStart.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   398
	self absorbJumpsToSingleInstrs.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   399
	self absorbConstantConditionalJumps.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   400
	self absorbJumpsToSingleInstrs
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   401
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   402
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   403
removeEmptyStart
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   404
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   405
	startSequence size = 1 ifTrue: [
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   406
		"startSeq is just unconditional jump, forget it"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   407
		startSequence _ startSequence last destination].
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   408
! !
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   409
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   410
!IRFunction methodsFor:'printing'!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   411
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   412
longPrintOn: stream
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   413
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   414
	IRPrinter new
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   415
		indent: 0;
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   416
		stream: stream;
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   417
		interpret: self
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   418
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   419
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   420
longPrintString
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   421
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   422
    | s |
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   423
    s := String new writeStream.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   424
    self longPrintOn: s.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   425
    ^s contents.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   426
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   427
    "Created: / 11-06-2008 / 01:05:53 / Jan Vrany <vranyj1@fel.cvut.cz>"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   428
! !
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   429
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   430
!IRFunction methodsFor:'testing'!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   431
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   432
isIRClosure
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   433
    ^ false
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   434
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   435
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   436
isIRMethod
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   437
    ^ false
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   438
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   439
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   440
isSend
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   441
	^false.
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   442
! !
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   443
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   444
!IRFunction methodsFor:'translating'!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   445
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   446
bytecodes
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   447
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   448
	|translator|
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   449
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   450
	^ compiledCode isNil
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   451
	    ifTrue:[
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   452
		translator := IRTranslator new.
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   453
		translator interpret: self.
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   454
		translator bytecodes
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   455
	    ]
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   456
	    ifFalse: [compiledCode byteCode].
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   457
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   458
    "Rewrited due to compilation error: Fatal: [bytecodes 10] block not prescanned inline "
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   459
"/        ^ compiledCode
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   460
"/            ifNotNil:
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   461
"/                [compiledCode byteCode]
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   462
"/            ifNil:
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   463
"/                [IRTranslator new
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   464
"/                    interpret: self;
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   465
"/                    bytecodes]
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   466
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   467
    "Created: / 03-11-2008 / 08:38:02 / Jan Vrany <vranyj1@fel.cvut.cz>"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   468
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   469
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   470
compiledCode
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   471
    ^ compiledCode
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   472
	ifNil:[ self compiledCodeUsing:self defaultCompiledCodeClass ]
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   473
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   474
    "Created: / 30-03-2009 / 16:34:33 / Jan Vrany <vranyj1@fel.cvut.cz>"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   475
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   476
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   477
compiledCodeUsing:aCompiledCodeClass
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   478
    ^ compiledCode := (IRTranslator new)
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   479
		interpret:self;
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   480
		compiledCodeUsing:aCompiledCodeClass
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   481
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   482
    "Created: / 11-06-2008 / 11:06:28 / Jan Vrany <vranyj1@fel.cvut.cz>"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   483
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   484
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   485
literals
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   486
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   487
	^(IRTranslator new
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   488
	    interpret: self;
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   489
	    literals)
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   490
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   491
    "Created: / 03-11-2008 / 09:08:23 / Jan Vrany <vranyj1@fel.cvut.cz>"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   492
!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   493
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   494
setCompiledCode:aCompiledCode
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   495
    compiledCode := aCompiledCode
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   496
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   497
    "Created: / 11-06-2008 / 11:05:57 / Jan Vrany <vranyj1@fel.cvut.cz>"
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   498
! !
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   499
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   500
!IRFunction class methodsFor:'documentation'!
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   501
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   502
version
23
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   503
    ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRFunction.st,v 1.4 2009/10/08 11:59:08 fm Exp $'
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   504
!
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   505
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   506
version_CVS
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   507
    ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRFunction.st,v 1.4 2009/10/08 11:59:08 fm Exp $'
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   508
!
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   509
377bc46cad12 Moved to package cvut:stx/goodies/newcompiler to be in sync with eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21
diff changeset
   510
version_SVN
26
db19d89eef60 Added version_SVN to all classes
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   511
    ^ '$Id$'
9
04518c7fb91c Initial support for closures.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   512
! !