IRDecompiler.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 30 Oct 2014 22:42:40 +0000
changeset 45 04a50b0d540a
parent 43 c8afb8e4c3cc
permissions -rw-r--r--
Reduced dependencies to only stx:libbasic and stx:libcomp. The latter will wanish as soon as actual bytecode assemby is implemented.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41
f3898a3b378d Package renamed from cvut:stx/goodies/newcompiler to ctu:ircompiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 37
diff changeset
     1
"{ Package: 'ctu:ircompiler' }"
37
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     3
IRInterpreter subclass:#IRDecompiler
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     4
	instanceVariableNames:'stack sp scope currentInstr valueLabelMap mapEmptyStatement'
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
	classVariableNames:''
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
	poolDictionaries:''
42
acdc3ec6d152 Better class category name - IR Compiler-*
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 41
diff changeset
     7
	category:'IR Compiler-IR'
37
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
IRDecompiler comment:'I interpret IRMethod instructions and generate a Smalltalk abstract syntax tree rooted at a RBMethodNode.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    11
This is implemented like a shift-reduce parser.  Each instruction either causes a node to be pushed on the stack (shift), or causes one or more nodes to be popped and combined into a single node which is push back on the stack (reduce).  Most reduction is done at the "label: labelNum" instruction where it tries to reduce jump structures into control messages like #ifTrue:, whileFalse:, etc.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
Several pseudo nodes (RBPseudoNode and subclasses) are used to represent basic instructions that have not been reduced to real AST nodes yet.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    13
'
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
!IRDecompiler class methodsFor:'as yet unclassified'!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    18
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    19
dummySelector: numArgs
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    20
	"Answer a dummy selector with number of args"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
	| sel |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
	sel _ 'unknown'.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
	1 to: numArgs do: [:i |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
		sel _ sel, 'with:'].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
	^ sel asSymbol
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
! !
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    29
!IRDecompiler methodsFor:'accessing'!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    30
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    31
scope
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    32
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
	^scope
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
! !
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
!IRDecompiler methodsFor:'init'!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    37
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    38
addTempToScope: ir 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    39
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
	"Temp may be created only if they are not used in the method"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
	0 to: ir numRargs - 1 do: [:i | (scope 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
		rawVarAt: i 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    43
		ifNone: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    44
			scope capturedVars do: [:each | 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    45
				each index = i ifTrue:[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
					scope tempVarAt: scope capturedVars size + scope tempVars size.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
					^self]].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
			scope tempVarAt: i]) markArg]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
decompileIR: ir 
45
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    52
"/        | sequenceNode temps args goto seq value method |
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    53
"/        scope isBlockScope 
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    54
"/                ifTrue:[(scope addTemp: 'parent env') markArg]
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    55
"/                ifFalse:[(scope addTemp: 'self') markArg].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    56
"/        ir tempKeys do: [:temp | scope tempVarAt: temp].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    57
"/        0 to: ir numRargs - 1 do: [:i | (scope tempVarAt: i) markArg].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    58
"/        self interpret: ir.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    59
"/        
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    60
"/        self addTempToScope: ir.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    61
"/        self label: #return.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    62
"/        self Label: #return.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    63
"/        (self endCase: #lastReturn) ifFalse:[self Label: #return.].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    64
"/        goto := self Goto.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    65
"/        value := self ValueOrNone.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    66
"/        seq := self Sequence.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    67
"/        self removeClosureCreation: seq.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    68
"/        sp = 1 ifFalse: [stack explore. self error: 'error'].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    69
"/        value ifNotNil: [seq addNode: value].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    70
"/        sequenceNode := (self newBlock: seq return: goto) body.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    71
"/        temps := scope compactIndexTemps asArray.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    72
"/        ir tempKeys: temps.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    73
"/        args := (temps first: ir numRargs) allButFirst.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    74
"/        args := args collect: [:var | self newVar: var].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    75
"/        temps := temps allButFirst: ir numRargs.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    76
"/        sequenceNode temporaries: (temps collect: [:var | self newVar: var]), 
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    77
"/                ((scope capturedVars select:[:var | var name ~= 'self' and: [var sourceTemp == nil]]) 
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    78
"/                        collect:[:var | self newVar: var]).
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    79
"/        method := (RBMethodNode new)
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    80
"/                                selectorParts: (self 
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    81
"/                                                        newSelectorParts: (self class dummySelector: args size));
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    82
"/                                arguments: args;
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    83
"/                                body: sequenceNode;
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    84
"/                                primitiveNode: ir primitiveNode;
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    85
"/                                scope: scope.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    86
"/        sequenceNode parent: method.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    87
"/        Preferences compileBlocksAsClosures 
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    88
"/                ifFalse: [ASTFixDecompileBlockScope new visitNode: method].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    89
"/        ^ method
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    90
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    91
    "Modified: / 30-10-2014 / 22:36:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
37
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    94
removeClosureCreation: seq 
45
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    95
        ("Preferences compileBlocksAsClosures"true
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    96
                and: [seq statements size > 0]
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    97
                and: [seq statements first isClosureEnvironmentCreation]) ifTrue: [
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    98
                        seq statements removeFirst.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
    99
                        (seq statements size > 0
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   100
                                and: [seq statements first isClosureEnvironmentRegistration])
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   101
                                ifTrue: [seq statements removeFirst]].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   102
                        
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   103
        ["Preferences compileBlocksAsClosures"true
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   104
                and: [seq statements size > 0]
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   105
                and: [seq statements first isClosureRegistrationAndCreation
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   106
                        or: [seq statements first isSelfClosureRegistration]
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   107
                        or: [seq statements first isTempClosureRegistration]]]
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   108
                                        whileTrue: [seq statements removeFirst]
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   109
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   110
    "Modified: / 30-10-2014 / 22:37:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
37
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   113
scope: aLexicalScope
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   114
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   115
	scope := aLexicalScope
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   116
! !
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   117
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
!IRDecompiler methodsFor:'instructions'!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   120
goto: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   121
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   122
	self stackPush: (RBPseudoGotoNode new destination: seqNum).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   123
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   124
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   125
if: bool goto: seqNum1 otherwise: seqNum2
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   127
	self stackPush: (RBPseudoIfNode new
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   128
		boolean: bool;
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
		destination: seqNum1;
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
		otherwise: seqNum2)
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   132
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   133
label: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   134
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   135
	stack isEmpty ifTrue: [  "start"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   136
		^ stack addLast: (RBPseudoLabelNode new destination: seqNum)].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   137
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   138
	self captureEmptyStatement.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   139
	"Reduce jump structures to one of the following if possible"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   140
	[	(self endBlock: seqNum) or: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   141
		 (self endAndOr: seqNum) or: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   142
		  (self endAndOr2: seqNum) or: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   143
		   (self endIfThen: seqNum) or: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   144
		    (self endIfThen2: seqNum) or:[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   145
		      (self endIfThenElse: seqNum) or: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   146
		       (self endCase: seqNum) or: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   147
		        (self endToDo: seqNum) or: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   148
		         (self endWhile: seqNum) or: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   149
			     (self endWhile2: seqNum) or: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   150
			      (self endIfNil: seqNum)]]]]]]]]]]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   151
	] whileTrue.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   152
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   153
	stack addLast: (RBPseudoLabelNode new destination: seqNum).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   154
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   155
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   156
popTop
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   157
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   158
	| value |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   159
	stack last ifNil: [^ stack removeLast].  "pop no-op from #simplifyTempAssign:"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   160
	[stack last isLabel 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   161
		and: [(stack atLast:2) isGoto] 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   162
		and: [stack last destination = (stack atLast: 2) destination]]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   163
			whileTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   164
				stack removeLast.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   165
				stack removeLast].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   166
	stack last isValue ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   167
		(stack atLast: 2) isSequence ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   168
			value := stack removeLast.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   169
			^ stack last addNode: value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   170
		] ifFalse: [(stack atLast: 2) isPseudo ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   171
			value := stack removeLast.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   172
			^ stack addLast: (RBSequenceNode statements: {value}).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   173
		]].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   174
	].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   175
	stack addLast: RBPseudoPopNode new
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   176
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   177
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   178
pushBlock: irMethod
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   179
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   180
	self block: irMethod env: nil
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   181
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   182
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   183
pushBlockMethod: irMethod
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   184
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   185
	"block will recognized when send: #createBlock:"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   186
	self pushLiteral: irMethod
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   187
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   188
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   189
pushDup
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   190
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   191
	stack addLast: RBPseudoDupNode new
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   192
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   193
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   194
pushInstVar: index
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   195
	
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   196
	self stackPush: (self newVar: (scope instanceScope instVar: index))
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   197
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   198
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   199
pushLiteral: object
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   200
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   201
	self stackPush: (self newLiteral: object).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   202
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   203
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   204
pushLiteralVariable: object
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   205
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   206
	| var |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   207
	var := scope lookupVar: object key asString.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   208
	self stackPush: (self newVar: var)
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   209
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   210
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   211
pushTemp: tempIndex
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   212
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   213
	| var |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   214
	var := scope basicTempVarAt: tempIndex.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   215
	var isTemp ifTrue: [var cantBeCapture].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   216
	self stackPush: (self newVar: var).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   217
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   218
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   219
remoteReturn
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   220
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   221
	stack removeLast.  "pop home context free var"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   222
	self goto: #return.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   223
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   224
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   225
returnTop
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   226
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   227
	self goto: #return.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   228
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   229
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   230
send: selector numArgs: numArgs
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   231
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   232
        | args rcvr |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   233
        selector = #caseError ifTrue:[^self stackPush: (RBPseudoSendNode new selector: selector)].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   234
        args := OrderedCollection new.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   235
        [       selector numArgs timesRepeat: [args addFirst: self Value].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   236
                rcvr := self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   237
        ] on: Abort do: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   238
                [self stackPush: (RBPseudoSendNode new selector: selector).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   239
                ^self cascade] on: Abort do:[^false]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   240
        ].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   241
45
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   242
        "Preferences compileBlocksAsClosures"true
37
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   243
                        ifTrue: [ (rcvr isLiteral and: [selector = #createBlock:]) ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   244
                                         ^ self block: rcvr value env: args first]]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   245
                        ifFalse: [ (selector = #blockCopy:) ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   246
                                         ^ self stackPush: (RBPseudoSendNode new selector: selector; arguments: args)]].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   247
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   248
        self stackPush: (self simplify: (RBMessageNode new
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   249
                receiver: rcvr
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   250
                selectorParts: (self newSelectorParts: selector)
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   251
                arguments: args)).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   252
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   253
    "Created: / 01-12-2008 / 19:40:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
45
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   254
    "Modified: / 30-10-2014 / 22:38:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
37
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   255
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   256
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   257
send: selector numArgs: numArgs toSuperOf: behavior
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   258
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   259
        | args rcvr |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   260
        args := OrderedCollection new.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   261
        selector numArgs timesRepeat: [args addFirst: self Value].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   262
        rcvr := self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   263
        (rcvr isVariable and: [rcvr name = 'self']) ifFalse: [self patternError].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   264
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   265
        rcvr identifierToken: (SqueakToken value: 'super' start: 0).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   266
        self stackPush: (RBMessageNode new
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   267
                receiver: rcvr
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   268
                selectorParts: (self newSelectorParts: selector)
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   269
                arguments: args).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   270
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   271
    "Created: / 01-12-2008 / 19:45:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   272
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   273
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   274
storeIntoLiteralVariable: association
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   275
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   276
	| var |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   277
	var := scope lookupVar: association key asString.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   278
	self stackPush: (self simplifyTempAssign:
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   279
		(RBAssignmentNode variable: (self newVar: (var markWrite)) value: self Value))
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   280
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   281
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   282
storeTemp: tempIndex
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   283
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   284
	| var |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   285
	var := scope basicTempVarAt: tempIndex.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   286
	var isCaptured ifFalse: [var cantBeCapture].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   287
	var isTemp ifTrue:[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   288
		var isArg: false].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   289
	self stackPush: (self simplifyTempAssign:
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   290
		(RBAssignmentNode variable: (self newVar: (var markWrite)) value: self Value)).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   291
! !
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   292
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   293
!IRDecompiler methodsFor:'interpret'!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   294
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   295
interpretInstruction: irInstruction
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   296
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   297
	currentInstr := irInstruction.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   298
	super interpretInstruction: irInstruction.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   299
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   300
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   301
interpretSequence: instructionSequence
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   302
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   303
	super interpretSequence: instructionSequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   304
	"currentInstr := nil."
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   305
! !
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   306
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   307
!IRDecompiler methodsFor:'old blocks'!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   308
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   309
blockReturnTop
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   310
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   311
	self goto: #return.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   312
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   313
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   314
endBlock: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   315
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   316
	| blockSeq block goto startBlock |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   317
	[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   318
		goto := self GotoOrReturn: seqNum.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   319
		(goto isRet 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   320
			or:[goto mapInstr notNil 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   321
				and: [goto mapInstr isBlockReturnTop]]) ifFalse: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   322
		sp = 0 ifTrue: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   323
		blockSeq := self Sequence2.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   324
		startBlock := self Label.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   325
		block := self Block.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   326
		(goto isRet not
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   327
			and:[goto mapInstr notNil] 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   328
			and: [goto mapInstr isBlockReturnTop]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   329
			and: [block successor ~= seqNum]) ifTrue:[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   330
				self stackPush: block.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   331
				self stackPush: startBlock.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   332
				self stackPush: blockSeq. 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   333
				self stackPush: goto.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   334
				self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   335
		self Send.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   336
	] on: Abort do: [^ false].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   337
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   338
	self stackPush: (self newBlock: blockSeq return: goto).	
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   339
	stack last arguments: block arguments.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   340
	"No extra scope is need if we don't use any temporaries and arguments.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   341
	so we remove them"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   342
	(stack last arguments isEmpty and: [stack last body temporaries isEmpty])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   343
		ifTrue:[ASTReplaceVariableScope replace: stack last scope: scope outerScope ].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   344
	scope := scope outerScope.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   345
	currentInstr := nil.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   346
	self goto: block successor.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   347
	^ true
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   348
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   349
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   350
jumpOverBlock: seqNum1  to: seqNum2
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   351
	| numArgs args oldscope pseudoBlock |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   352
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   353
	oldscope := scope.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   354
	self scope: (scope newBlockScope).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   355
	oldscope tempVarAt: 0.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   356
	(scope addObjectTemp: (oldscope tempVarAt: 0)).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   357
	numArgs := stack last arguments first value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   358
	self stackPush: (pseudoBlock := RBPseudoBlockNode new).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   359
	
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   360
	args := OrderedCollection new.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   361
	numArgs timesRepeat: [ | var instr |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   362
		instr :=  currentInstr blockSequence removeFirst.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   363
 		var := oldscope tempVarAt: instr number.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   364
		args add: (self newVar: var).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   365
		var isUnused ifTrue: [oldscope removeTempFromOldBlock: var].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   366
		scope addObjectTemp: var.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   367
		currentInstr blockSequence first isPop 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   368
			ifFalse: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   369
				currentInstr blockSequence sequence addFirst: (IRInstruction pushTemp: var index)]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   370
			ifTrue:[currentInstr blockSequence removeFirst].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   371
		
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   372
	].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   373
	args := args reverse.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   374
	pseudoBlock
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   375
		block: seqNum1;
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   376
		successor: seqNum2;
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   377
		arguments: args
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   378
	
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   379
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   380
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   381
storeInstVar: number
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   382
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   383
	| var |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   384
	var := scope  instanceScope instVar: number.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   385
	self stackPush: (RBAssignmentNode variable: (self newVar: var)  value:  self Value)
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   386
! !
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   387
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   388
!IRDecompiler methodsFor:'priv instructions'!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   389
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   390
addReturn: statements from: goto
45
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   391
"/    |  |
37
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   392
45
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   393
    self error: 'IRDecompiler is an unfinished code'.    
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   394
"/    statements last isReturn ifTrue:[^self].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   395
"/    ret := RBReturnNode value: statements last.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   396
"/    Preferences compileBlocksAsClosures ifTrue:[
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   397
"/            scope isHome ifFalse: [ret homeBinding: scope outerEnvScope thisEnvVar]].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   398
"/    goto mapInstr sourceNode: ret.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   399
"/    statements atLast: 1 put: ret.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   400
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   401
    "Modified: / 30-10-2014 / 22:35:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
37
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   402
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   403
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   404
block: method env: envRefNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   405
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   406
	self stackPush: (IRDecompiler new
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   407
		scope: (scope newBlockScope "capturedVars: vars");
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   408
		decompileIR: method ir)
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   409
		asBlock
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   410
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   411
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   412
cascade
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   413
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   414
	| messages selector args rcvr |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   415
	messages := OrderedCollection new.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   416
	"last message"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   417
	selector _ self Send selector.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   418
	args := OrderedCollection new.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   419
	selector numArgs timesRepeat: [args addFirst: self Value].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   420
	messages addFirst: selector -> args.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   421
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   422
	"rest of messages"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   423
	[(rcvr := self ValueOrNone) isNil] whileTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   424
		self Pop.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   425
		selector := self Send selector.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   426
		args := OrderedCollection new.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   427
		selector numArgs timesRepeat: [args addFirst: self Value].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   428
		self Dup.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   429
		messages addFirst: selector -> args.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   430
	].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   431
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   432
	messages := messages collect: [:assoc |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   433
		RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   434
			receiver: rcvr
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   435
			selector: assoc key
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   436
			arguments: assoc value].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   437
	self stackPush: (RBCascadeNode messages: messages).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   438
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   439
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   440
endAndOr2: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   441
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   442
	| goto seq p if2 test else o if1 seqValue elseTest otherwise |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   443
	[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   444
		goto _ self Goto.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   445
		seqValue _ self ValueOrNone.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   446
		seq _ self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   447
		p _ self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   448
		if2 _ self IfGoto: seqNum otherwise: p.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   449
		elseTest _ self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   450
		else _ self SequenceBackTo: goto destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   451
		o _ self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   452
		o = goto destination ifTrue: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   453
		if1 _ self IfGoto: seqNum otherwise: o.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   454
		test _ self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   455
	] on: Abort do: [^ false].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   456
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   457
	if1 boolean = if2 boolean 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   458
		ifFalse: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   459
			otherwise := RBSequenceNode statements: #().
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   460
			otherwise addNode: (self newLiteral: if2 boolean).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   461
			self stackPush: (RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   462
				receiver: test 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   463
				selector: (if2 boolean ifTrue: [#ifTrue:ifFalse:] ifFalse: [#ifFalse:ifTrue:]) 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   464
				arguments: {self newBlock: (else addNode: elseTest).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   465
					self newBlock: otherwise}).]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   466
		ifTrue:[self stackPush: (RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   467
			receiver: test
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   468
			selector: (if2 boolean ifTrue: [#or:] ifFalse: [#and:])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   469
			arguments: {self newBlock: (else addNode: elseTest)})].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   470
	stack addLast: if2.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   471
	self label: p.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   472
	stack addLast: seq.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   473
	seqValue ifNotNil: [stack addLast: seqValue].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   474
	stack addLast: goto.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   475
	^ true
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   476
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   477
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   478
endAndOr: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   479
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   480
	| o test branches if body block sel1 sel2 if2 |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   481
	branches := OrderedCollection new.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   482
	[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   483
		(if2 := self If) otherwise = seqNum ifFalse: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   484
		[	test := self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   485
			body := self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   486
			branches add: {body. test}.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   487
			o := self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   488
			(if := self If) otherwise = o ifFalse: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   489
			if destination = seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   490
		] whileFalse: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   491
			if boolean = if2 boolean ifFalse: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   492
			if destination = if2 destination ifFalse: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   493
		].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   494
		if boolean = if2 boolean ifTrue: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   495
		test := self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   496
	] on: Abort do: [^ false].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   497
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   498
	if boolean
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   499
		ifTrue: [sel1 := #or:. sel2 := #and:]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   500
		ifFalse: [sel1 := #and:. sel2 := #or:].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   501
	block := self newBlock: (branches first first addNode: branches first second).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   502
	branches allButFirstDo: [:pair |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   503
		block := self newBlock: (pair first addNode: (RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   504
				receiver: pair second
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   505
				selector: sel2
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   506
				arguments: {block})).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   507
	].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   508
	self stackPush: (RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   509
		receiver: test
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   510
		selector: sel1
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   511
		arguments: {block}).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   512
	stack addLast: if2.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   513
	^ true
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   514
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   515
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   516
endCase: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   517
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   518
	| otherwiseGoto goto node otherwiseValue otherwiseSeq n branchValue branchSeq f caseValue caseSeq rcvr branches message seqEnd afterOterwise seq afterOterwiseValue |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   519
	branches := OrderedCollection new.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   520
	[	"otherwise"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   521
		otherwiseGoto := self Goto.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   522
		node := self stackDown.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   523
		node isSequence ifTrue: [(node statements size = 1 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   524
			and:[node statements first isSend] 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   525
			and: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   526
				node := node statements first. 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   527
				node selector == #caseError]) ifFalse: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   528
					otherwiseSeq := node] ].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   529
		(node isPop or: [node isSend and: [node selector == #caseError]]) ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   530
			node isPop ifTrue: [node := self Send].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   531
			node selector == #caseError ifFalse: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   532
		] ifFalse: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   533
			sp := sp + 1.  "stackUp"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   534
			
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   535
			seqNum == #lastReturn 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   536
				ifFalse: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   537
					otherwiseValue := self ValueOrNone.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   538
					otherwiseSeq := self Sequence]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   539
				ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   540
					afterOterwiseValue := self ValueOrNone.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   541
					otherwiseSeq := RBSequenceNode statements: #().
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   542
					afterOterwise := self SequenceOtherwise].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   543
		].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   544
		n := self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   545
		"last case branch"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   546
		seqNum == #lastReturn 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   547
			ifFalse: [goto := self GotoOrReturn: seqNum]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   548
			ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   549
				seqEnd := n.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   550
				goto := self GotoOrReturn: n.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   551
				otherwiseGoto := goto].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   552
		branchValue := self ValueOrNone.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   553
		branchSeq := self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   554
		(stack at: sp) isPop ifTrue: [self stackDown].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   555
		f := self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   556
		
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   557
		"last case"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   558
		self IfGoto: n otherwise: f.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   559
		self Send selector == #= ifFalse: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   560
		caseValue := self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   561
		caseSeq := self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   562
		otherwiseSeq ifNil: [self Dup].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   563
		branches addFirst: ({caseSeq. caseValue} -> {branchSeq. branchValue. goto}).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   564
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   565
		[(rcvr := self ValueOrNone) isNil] whileTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   566
			"case branch"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   567
			n := self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   568
			seqNum == #lastReturn 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   569
				ifFalse: [goto := self GotoOrReturn: seqNum]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   570
				ifTrue: [goto := self GotoOrReturn: seqEnd].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   571
			branchValue := self ValueOrNone.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   572
			branchSeq := self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   573
			self Pop.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   574
			f := self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   575
			"case"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   576
			self IfGoto: n otherwise: f.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   577
			self Send selector == #= ifFalse: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   578
			caseValue := self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   579
			caseSeq := self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   580
			self Dup.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   581
			branches addFirst: ({caseSeq. caseValue} -> {branchSeq. branchValue. goto}).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   582
		].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   583
	] on: Abort do: [^ false].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   584
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   585
	branches := branches collect: [:assoc |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   586
		assoc key second
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   587
			ifNotNil: [assoc key first addNode: assoc key second].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   588
		assoc value second
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   589
			ifNotNil: [assoc value first addNode: assoc value second].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   590
		RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   591
			receiver: (self newBlock: assoc key first return: nil)
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   592
			selector: #->
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   593
			arguments:
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   594
				{self newBlock: assoc value first return: assoc value third}
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   595
	].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   596
	message := otherwiseSeq
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   597
		ifNil: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   598
			RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   599
				receiver: rcvr
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   600
				selector: #caseOf:
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   601
				arguments: {RBArrayNode statements: branches}]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   602
		ifNotNil: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   603
			otherwiseValue
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   604
				ifNotNil: [otherwiseSeq addNode: otherwiseValue].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   605
			RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   606
				receiver: rcvr
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   607
				selector: #caseOf:otherwise:
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   608
				arguments: 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   609
					{RBArrayNode statements: branches.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   610
					self newBlock: otherwiseSeq return: otherwiseGoto}.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   611
		].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   612
	self stackPush: message.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   613
	seqNum == #lastReturn ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   614
		self popTop.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   615
		seq := self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   616
		afterOterwise ifNotNil:[seq statements addAllLast: afterOterwise statements].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   617
		self stackPush: seq.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   618
		afterOterwiseValue ifNotNil:[self stackPush: afterOterwiseValue].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   619
		branchValue := 1].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   620
	branchValue ifNil: [self popTop].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   621
	self stackPush: otherwiseGoto.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   622
	^ true
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   623
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   624
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   625
endIfNil: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   626
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   627
	| goto branch o if rcvr value |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   628
	[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   629
		goto := self Goto.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   630
		value := self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   631
		branch := self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   632
		self Pop.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   633
		o := self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   634
		if := self IfGoto: seqNum otherwise: o.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   635
		self Send selector == #== ifFalse: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   636
		(self Value isLiteral: [:v | v isNil]) ifFalse: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   637
		self Dup.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   638
		rcvr := self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   639
	] on: Abort do: [^ false].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   640
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   641
	branch addNode: value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   642
	self stackPush: (RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   643
		receiver: rcvr
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   644
		selector: (if boolean ifTrue: [#ifNotNil:] ifFalse: [#ifNil:])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   645
		arguments: {self newBlock: branch return: goto}).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   646
	self goto: seqNum.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   647
	^ true
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   648
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   649
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   650
endIfThen2: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   651
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   652
	| goto branch o if test value gotoNum branch2 |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   653
	[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   654
		goto := self Goto.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   655
		(goto mapInstr ~= nil 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   656
			and: [goto mapInstr isJump]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   657
			and: [goto mapInstr destination size = 1]  
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   658
			and: [goto mapInstr destination last isJump]) 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   659
				ifTrue: [gotoNum := goto 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   660
					mapInstr destination last destination orderNumber]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   661
				ifFalse:[self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   662
		(currentInstr ~= nil 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   663
			and: [currentInstr isJump] 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   664
			and: [currentInstr destination orderNumber = goto destination])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   665
				ifFalse: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   666
		value := self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   667
		branch := self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   668
		o := self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   669
		seqNum = gotoNum 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   670
			ifFalse:[if := self IfGoto: gotoNum otherwise: o]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   671
			ifTrue:[self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   672
		test := self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   673
	] on: Abort do: [^ false].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   674
	
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   675
	value ifNotNil: [branch addNode: value].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   676
	branch2 := RBSequenceNode statements: #().
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   677
	branch2 addNode: (self newLiteral: if boolean).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   678
	self stackPush: (self simplify: (RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   679
		receiver: test
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   680
		selector: (if boolean ifTrue: [#ifFalse:ifTrue:] ifFalse: [#ifTrue:ifFalse:])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   681
		arguments: {self newBlock: branch return: goto.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   682
			self newBlock: branch2})).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   683
	self goto: goto destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   684
	^true
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   685
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   686
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   687
endIfThen3: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   688
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   689
	| goto branch o if test value |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   690
	[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   691
		goto := self Goto.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   692
		(goto destination == seqNum or: [self isExplicitReturn: goto])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   693
			ifFalse: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   694
		goto isRet ifTrue: [value := self Value].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   695
		branch := self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   696
		o := self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   697
		if := self If.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   698
		((if destination = seqNum 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   699
			or: [if destination = (mapEmptyStatement at: seqNum ifAbsent:[seqNum])])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   700
				and: [if otherwise = o])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   701
			ifFalse:[self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   702
		test := self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   703
	] on: Abort do: [^ false].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   704
	
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   705
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   706
	value ifNotNil: [branch addNode: value].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   707
	self stackPush: (self simplify: (RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   708
		receiver: test
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   709
		selector: (if boolean ifTrue: [#ifFalse:] ifFalse: [#ifTrue:])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   710
		arguments: {self newBlock: branch return: goto})).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   711
	self popTop.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   712
	self goto: seqNum.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   713
	^ true
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   714
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   715
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   716
endIfThen: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   717
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   718
	| goto branch o if test value |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   719
	[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   720
		goto := self Goto.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   721
		(goto destination == seqNum or: [self isExplicitReturn: goto])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   722
			ifFalse: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   723
		goto isRet ifTrue: [value := self Value].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   724
		branch := self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   725
		o := self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   726
		if := self IfGoto: seqNum otherwise: o.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   727
		test := self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   728
	] on: Abort do: [^ false].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   729
	
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   730
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   731
	value ifNotNil: [branch addNode: value].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   732
	self stackPush: (self simplify: (RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   733
		receiver: test
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   734
		selector: (if boolean ifTrue: [#ifFalse:] ifFalse: [#ifTrue:])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   735
		arguments: {self newBlock: branch return: goto})).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   736
	self popTop.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   737
	self goto: seqNum.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   738
	^ true
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   739
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   740
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   741
endIfThenElse: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   742
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   743
	| goto2 else d goto1 then o if test value2 value1 |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   744
	[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   745
		goto2 := self Goto.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   746
		value2 := self ValueOrNone.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   747
		else := self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   748
		d := self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   749
		goto1 := self Goto.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   750
		((self isExplicitReturn: goto2) or: [goto2 destination == goto1 destination]) ifFalse: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   751
		value1 := self ValueOrNone.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   752
		then := self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   753
		o := self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   754
		if := self IfGoto: d otherwise: o.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   755
		test := self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   756
	] on: Abort do: [^ false].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   757
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   758
	value2 ifNotNil: [else addNode: value2].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   759
	value1 ifNotNil: [then addNode: value1].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   760
	(self isExplicitReturn: goto1) ifTrue:[self addReturn: then statements from: goto1].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   761
	(self isExplicitReturn: goto2) ifTrue:[self addReturn: else statements from: goto2].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   762
	self stackPush: (self simplify: (else isEmpty
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   763
		ifTrue: [RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   764
			receiver: test
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   765
			selector: (if boolean ifTrue: [#ifFalse:] ifFalse: [#ifTrue:])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   766
			arguments: {self newBlock: then return: goto1}]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   767
		ifFalse: [RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   768
			receiver: test
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   769
			selector: (if boolean
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   770
				ifTrue: [#ifFalse:ifTrue:]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   771
				ifFalse: [#ifTrue:ifFalse:])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   772
			arguments: {
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   773
				self newBlock: then return: goto1.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   774
				self newBlock: else return: goto2}])).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   775
	value1 ifNil: [self popTop].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   776
	currentInstr := goto1 mapInstr.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   777
	self stackPush: goto1.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   778
	(else statements isEmpty and:
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   779
	 [stack anySatisfy: [:n | n isIf and: [n destination = d]]]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   780
	) ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   781
		self label: d.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   782
		currentInstr := goto2 mapInstr.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   783
		self stackPush: goto2.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   784
	].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   785
	^ true
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   786
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   787
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   788
endToDo: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   789
45
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   790
        | start limit incr iter step loopBlock o if test limitExpr init |
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   791
        [
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   792
                start := self Goto destination.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   793
                limit := self Value.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   794
                incr := self Assignment.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   795
                iter := incr variable.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   796
                (incr value isMessage and:
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   797
                 [incr value selector == #+ and:
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   798
                  [incr value receiver isVariable and: 
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   799
                   [incr value receiver binding == iter binding]]]
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   800
                ) ifFalse: [self abort].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   801
                step := incr value arguments first.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   802
                loopBlock := self Sequence.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   803
                o := self Label destination.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   804
                if := self IfGoto: seqNum otherwise: o.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   805
                test := self Value.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   806
                (test isMessage and:
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   807
                 [(test selector == #<= or: [test selector == #>=]) and:
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   808
                  [(valueLabelMap at: test arguments first ifAbsent: [self abort]) destination = start]]
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   809
                ) ifFalse: [self abort].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   810
                limitExpr := test arguments first.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   811
                limitExpr isAssignment ifTrue: [
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   812
                        (limitExpr variable binding index == limit binding index 
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   813
                                and:[limitExpr variable binding scope == limit binding scope]) ifFalse: [self abort].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   814
                        limitExpr := limitExpr value.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   815
                ].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   816
                init := test receiver.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   817
                (init isAssignment and: [init variable binding == iter binding])
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   818
                        ifFalse: [self abort].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   819
        ] on: Abort do: [^ false].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   820
        limit isVariable 
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   821
                ifTrue:[scope 
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   822
                        removeTemp: limit binding 
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   823
                        ifAbsent:["Preferences compileBlocksAsClosures"true
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   824
                                ifFalse:[scope removeTempFromOldBlock: limit]]].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   825
        loopBlock := self newBlock: loopBlock.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   826
        loopBlock arguments: {iter}.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   827
        self stackPush: ((step isLiteral: [:c | c = 1])
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   828
                ifTrue: [RBMessageNode
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   829
                                receiver: init value
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   830
                                selector: #to:do:
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   831
                                arguments: {limitExpr. loopBlock}]
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   832
                ifFalse: [RBMessageNode
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   833
                                receiver: init value
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   834
                                selector: #to:by:do:
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   835
                                arguments: {limitExpr. step. loopBlock}]).
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   836
        self popTop.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   837
        self goto: seqNum.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   838
        ^ true
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   839
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   840
    "Modified: / 30-10-2014 / 22:37:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
37
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   841
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   842
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   843
endWhile2: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   844
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   845
	| start loopBlock if test sequence o goto previousStack |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   846
	[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   847
		stack := (previousStack := stack) copy.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   848
		start := (goto := self Goto) destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   849
		self stackPush: goto.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   850
		[self endIfThen3: start] whileTrue.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   851
		start :=  self Goto destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   852
		loopBlock _ self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   853
		o _ self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   854
		if _ self IfGoto: seqNum otherwise: o.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   855
		test _ self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   856
		sequence _ self SequenceBackTo: start.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   857
		self Label: start.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   858
		sp _ sp + 1.  "stackUp"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   859
	] on: Abort do: [stack := previousStack. ^ false].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   860
	loopBlock isEmpty
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   861
		ifTrue:[self stackPush: (self simplify: (RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   862
			receiver: (self newBlock: (sequence addNode: test))
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   863
			selector: (if boolean ifTrue: [#whileFalse] ifFalse: [#whileTrue])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   864
			arguments: #()))]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   865
		ifFalse:[self stackPush: (self simplify: (RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   866
			receiver: (self newBlock: (sequence addNode: test))
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   867
			selector: (if boolean ifTrue: [#whileFalse:] ifFalse: [#whileTrue:])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   868
			arguments: {self newBlock: loopBlock}))].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   869
	self popTop.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   870
	self goto: seqNum.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   871
	^ true
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   872
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   873
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   874
endWhile: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   875
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   876
	| start loopBlock if test sequence o |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   877
	[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   878
		start _ self Goto destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   879
		loopBlock _ self Sequence.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   880
		o _ self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   881
		if _ self IfGoto: seqNum otherwise: o.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   882
		test _ self Value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   883
		sequence _ self SequenceBackTo: start.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   884
		self Label: start.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   885
		sp _ sp + 1.  "stackUp"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   886
	] on: Abort do: [^ false].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   887
	loopBlock isEmpty
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   888
		ifTrue:[self stackPush: (self simplify: (RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   889
			receiver: (self newBlock: (sequence addNode: test))
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   890
			selector: (if boolean ifTrue: [#whileFalse] ifFalse: [#whileTrue])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   891
			arguments: #()))]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   892
		ifFalse:[self stackPush: (self simplify: (RBMessageNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   893
			receiver: (self newBlock: (sequence addNode: test))
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   894
			selector: (if boolean ifTrue: [#whileFalse:] ifFalse: [#whileTrue:])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   895
			arguments: {self newBlock: loopBlock}))].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   896
	self popTop.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   897
	self goto: seqNum.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   898
	^ true
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   899
! !
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   900
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   901
!IRDecompiler methodsFor:'private'!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   902
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   903
captureEmptyStatement
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   904
	| by replace node |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   905
	
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   906
	[by := self Goto destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   907
	replace := self Label destination.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   908
	replace = 0 ifTrue: [self abort]] 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   909
			on: Abort
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   910
			do: [^ false].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   911
	mapEmptyStatement at: by put: replace.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   912
	sp := nil.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   913
	^ true
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   914
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   915
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   916
fixInnerFreeVar: aRcvrTemp
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   917
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   918
	| scopeInnerFreeVar |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   919
	scopeInnerFreeVar := scope outerScope.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   920
	[aRcvrTemp scope = scopeInnerFreeVar] whileFalse:[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   921
		scopeInnerFreeVar hasInnerFreeVars: true.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   922
		scopeInnerFreeVar := scopeInnerFreeVar outerScope].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   923
	aRcvrTemp scope hasInnerFreeVars: true
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   924
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   925
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   926
initialize
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   927
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   928
	stack := OrderedCollection new.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   929
	scope := nil parseScope newMethodScope.  "in case never set"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   930
	valueLabelMap := IdentityDictionary new.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   931
	mapEmptyStatement := IdentityDictionary new
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   932
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   933
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   934
isExplicitReturn: goto
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   935
45
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   936
        "Preferences compileBlocksAsClosures"true
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   937
                ifTrue:[^ goto isRet 
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   938
                        and: [goto mapInstr notNil] 
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   939
                        and: [goto mapInstr isRemote or: [scope isBlockScope not]]]
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   940
                ifFalse: [^goto isRet and: [goto mapInstr isBlockReturnTop not]]
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   941
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   942
    "Modified: / 30-10-2014 / 22:37:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
37
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   943
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   944
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   945
mapNode: node
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   946
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   947
	currentInstr ifNil: [^ self].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   948
	node isPseudo
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   949
		ifTrue: [node mapInstr: currentInstr]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   950
		ifFalse: [currentInstr sourceNode: node]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   951
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   952
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   953
newBlock: sequence
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   954
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   955
	^ self newBlock: sequence return: nil
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   956
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   957
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   958
newBlock: sequence return: goto
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   959
45
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   960
        | statements block |
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   961
        statements := sequence statements.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   962
        (goto notNil and: [self isExplicitReturn: goto]) ifTrue: [
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   963
                self addReturn: statements from: goto
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   964
        ].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   965
        sequence statements: statements.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   966
        block := RBBlockNode body: sequence.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   967
        sequence parent: block.
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   968
        "Preferences compileBlocksAsClosures"true ifFalse: [block scope: scope].
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   969
        ^block
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   970
04a50b0d540a Reduced dependencies to only stx:libbasic and stx:libcomp.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 43
diff changeset
   971
    "Modified: / 30-10-2014 / 22:37:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
37
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   972
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   973
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   974
newLiteral: literal
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   975
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   976
	^ RBLiteralNode value: literal
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   977
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   978
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   979
newSelectorParts: selector
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   980
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   981
	^ selector keywords collect: [:word |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   982
		RBLiteralToken value: word]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   983
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   984
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   985
newVar: semVar
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   986
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   987
	^ RBVariableNode new
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   988
		identifierToken: (RBIdentifierToken value: semVar name start: 0);
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   989
		binding: semVar
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   990
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   991
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   992
simplify: mess
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   993
	"mess is a messageNode.  If it is a message created by the compiler convert it back to its normal form"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   994
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   995
	| rcvr var |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   996
"	(mess selector == #value and: [mess receiver isLiteral]) ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   997
		^ self newVar: (GlobalVar new assoc: mess receiver value; scope: scope)
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   998
	]."
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   999
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1000
	(mess selector = #privSetInHolder: and: [mess arguments first isLiteral]) ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1001
		^ RBAssignmentNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1002
			variable: (self newVar: (GlobalVar new assoc: mess arguments first value; scope: scope) markWrite)
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1003
			value: mess receiver
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1004
	].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1005
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1006
	(mess selector = #privGetInstVar: and:
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1007
	 [mess arguments first isLiteral and:
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1008
	  [mess receiver isVariable]]) ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1009
		rcvr := mess receiver binding.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1010
		rcvr == scope receiverVar ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1011
			^ self newVar: (scope receiverVarAt: mess arguments first value)].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1012
		(rcvr isContextVar and: [mess arguments first value == 5]) ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1013
			var := scope tempVarAt: -1.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1014
			^self newVar: var].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1015
		(rcvr isCaptured and:[rcvr sourceTemp = rcvr scope receiverVar])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1016
			ifTrue:[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1017
				self fixInnerFreeVar: rcvr.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1018
				^self newVar: (rcvr scope receiverVarAt: mess arguments first value)].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1019
		rcvr isEnv ifTrue: [^self newVar: (rcvr scope captureVarAt: mess arguments first value)]].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1020
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1021
	(mess selector = #privStoreIn:instVar: and:
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1022
	 [mess arguments last isLiteral and:
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1023
	  [mess arguments first isVariable]]) ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1024
		rcvr := mess arguments first binding.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1025
		(mess receiver name = 'self' and: [rcvr isEnv]) 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1026
			ifTrue:[scope captureSelf: mess arguments last value. 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1027
				^mess].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1028
		rcvr == scope  receiverVar ifTrue: [^ RBAssignmentNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1029
				variable: (self newVar: (scope receiverVarForAssignmentAt: mess arguments last value) markWrite) 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1030
				value: mess receiver].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1031
		(rcvr isCaptured and:[rcvr sourceTemp = rcvr scope receiverVar])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1032
			ifTrue:[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1033
				self fixInnerFreeVar: rcvr.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1034
				^RBAssignmentNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1035
					variable: (self newVar: (rcvr scope receiverVarForAssignmentAt: mess arguments last value) markWrite) 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1036
					value: mess receiver].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1037
		mess isClosureEnvironmentRegistration
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1038
			ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1039
				scope captureSelf: mess arguments last value.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1040
				^mess].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1041
		rcvr isEnv ifTrue:[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1042
			mess receiver isTemp 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1043
				ifTrue:[var := (scope 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1044
					captureVarAt: mess arguments last value  
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1045
					sourceTemp: mess receiver binding) markWrite.]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1046
				ifFalse:[var := (scope 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1047
					captureVarAt: mess arguments last value sourceTemp: ((TempVar new)
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1048
								name: (scope captureVarName: mess arguments last value);
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1049
								index: mess arguments last value;
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1050
								scope: self;
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1051
								cantBeCapture)) markWrite
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1052
					].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1053
			^ RBAssignmentNode
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1054
				variable: (self newVar: var)
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1055
				value: mess receiver]].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1056
	^mess
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1057
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1058
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1059
simplifyTempAssign: assignment
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1060
	"If it is a assignment created by the compiler convert it back to its normal form"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1061
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1062
	| mess |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1063
	((mess := assignment value) isMessage and: 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1064
	 [mess selector = #wrapInTempHolder and:
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1065
	  [mess receiver isLiteral: [:v | v isNil]]]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1066
	) ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1067
		^ nil  "no-op"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1068
	].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1069
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1070
	^ assignment
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1071
! !
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1072
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1073
!IRDecompiler methodsFor:'stack'!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1074
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1075
Assignment
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1076
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1077
	| node |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1078
	(node := self stackDown) isAssignment ifTrue: [^ node].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1079
	self abort
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1080
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1081
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1082
Block
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1083
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1084
	| node |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1085
	(node := self stackDown) isBlock ifTrue: [^ node].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1086
	self abort
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1087
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1088
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1089
Dup
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1090
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1091
	| node |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1092
	(node := self stackDown) isDup ifTrue: [^ node].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1093
	self abort
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1094
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1095
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1096
Goto
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1097
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1098
	| node |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1099
	(node := self stackDown) isGoto ifTrue: [^ node].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1100
	self abort
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1101
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1102
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1103
Goto: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1104
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1105
	| goto |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1106
	(goto := self Goto) destination = seqNum ifTrue: [^ goto].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1107
	self abort
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1108
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1109
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1110
GotoOrReturn: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1111
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1112
	| goto |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1113
	goto := self Goto.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1114
	(goto destination = seqNum or: [goto isRet]) ifTrue: [^ goto].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1115
	self abort
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1116
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1117
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1118
If
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1119
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1120
	| node |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1121
	(node := self stackDown) isIf ifTrue: [^ node].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1122
	self abort
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1123
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1124
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1125
IfGoto: seqNum otherwise: seqNum2
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1126
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1127
	| if |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1128
	((if := self If) destination = seqNum and: [if otherwise = seqNum2])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1129
		ifTrue: [^ if].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1130
	self abort
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1131
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1132
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1133
Label
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1134
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1135
	| node |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1136
	(node := self stackDown) isLabel ifTrue: [^ node].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1137
	self abort
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1138
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1139
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1140
Label: seqNum
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1141
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1142
	| label |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1143
	(label := self Label) destination = seqNum ifTrue: [^ label].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1144
	self abort
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1145
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1146
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1147
Pop
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1148
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1149
	| node |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1150
	(node := self stackDown) isPop ifTrue: [^ node].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1151
	self abort
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1152
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1153
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1154
Send
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1155
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1156
	| node |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1157
	(node := self stackDown) isPseudoSend ifTrue: [^ node].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1158
	self abort
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1159
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1160
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1161
Sequence
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1162
	| node seq i goto |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1163
	seq := RBSequenceNode statements: #().
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1164
	i := self spIndex.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1165
	[node := stack at: i.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1166
	node isSequence 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1167
		ifTrue: 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1168
			[seq addNodesFirst: node statements.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1169
			node := stack at: (i := i - 1)].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1170
	(node isLabel and: [i > 1]) 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1171
		ifFalse: 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1172
			[sp := i.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1173
			^ seq].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1174
	goto := stack at: (i := i - 1).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1175
	goto isGoto and: [goto destination = node destination]] 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1176
			whileTrue: [i := i - 1].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1177
	sp := i + 1.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1178
	^ seq
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1179
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1180
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1181
Sequence2
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1182
	| node seq i block temps label |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1183
	seq := RBSequenceNode statements: #().
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1184
	i := self spIndex.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1185
	node := stack at: i.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1186
	[(node isLabel and: [(stack at: i - 1) isGoto] and:[node destination = (stack at: i - 1) destination])
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1187
		ifTrue:[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1188
			i := i - 2.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1189
			node := stack at: i].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1190
	(node isLabel not and: [i > 1])] whileTrue: 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1191
			[
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1192
			node isSequence 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1193
				ifTrue: [seq addNodesFirst: node statements]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1194
				ifFalse: [seq addNodeFirst: node].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1195
			i := i - 1.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1196
			node := stack at: i].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1197
	sp := i.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1198
	label := self Label.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1199
	block := self Block.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1200
	self stackPush: block.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1201
	self stackPush: label.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1202
	"Add the temporaries find"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1203
	temps := scope tempVars asArray allButFirst.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1204
	temps := temps select: [:each | ((block arguments 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1205
							collect: [:var | var binding])  includes: each) not].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1206
	seq temporaries: (temps collect: [:var | self newVar: var]).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1207
	^ seq
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1208
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1209
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1210
SequenceBackTo: labelNum 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1211
	| node seq i goto |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1212
	seq := RBSequenceNode statements: #().
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1213
	i := self spIndex.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1214
	[node := stack at: i.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1215
	node isSequence 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1216
		ifTrue: 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1217
			[seq addNodesFirst: node statements.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1218
			node := stack at: (i := i - 1)].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1219
	(node isLabel and: [i > 1]) 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1220
		ifFalse: 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1221
			[sp := i.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1222
			^ seq].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1223
	node destination = labelNum 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1224
		ifTrue: 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1225
			[sp := i.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1226
			^ seq].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1227
	goto := stack at: (i := i - 1).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1228
	goto isGoto and: [goto destination = node destination]] 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1229
			whileTrue: [i := i - 1].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1230
	sp := i + 1.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1231
	^ seq
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1232
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1233
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1234
SequenceOtherwise
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1235
	| node seq i |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1236
	seq := RBSequenceNode statements: #().
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1237
	i := self spIndex.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1238
	node := stack at: i.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1239
	node isSequence ifTrue: [
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1240
			seq addNodesFirst: node statements.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1241
			self stackDown]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1242
		ifFalse:[node isLabel ifFalse:[self abort]].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1243
	^ seq
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1244
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1245
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1246
Value
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1247
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1248
	| node |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1249
	node := self ValueOrNone.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1250
	node ifNil: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1251
	^ node
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1252
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1253
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1254
ValueOrNone
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1255
	| node i label |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1256
	i := self spIndex.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1257
	[node := stack at: i.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1258
	node isValue 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1259
		ifTrue: 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1260
			[label ifNotNil: [valueLabelMap at: node put: label].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1261
			sp := i - 1.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1262
			^ node].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1263
	(node isLabel and: [i > 1]) ifFalse: [^ nil].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1264
	label := node.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1265
	node := stack at: (i := i - 1).
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1266
	node isGoto and: [node destination = label destination]] 
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1267
			whileTrue: [i := i - 1].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1268
	^ nil
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1269
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1270
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1271
abort
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1272
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1273
	| spWas |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1274
	spWas := sp.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1275
	sp := nil.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1276
	Abort signal
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1277
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1278
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1279
fixStack
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1280
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1281
	sp ifNotNil: [stack removeLast: (stack size - sp)].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1282
	sp := nil.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1283
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1284
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1285
spIndex
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1286
	^ sp ifNil: [sp := stack size]
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1287
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1288
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1289
stackDown
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1290
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1291
	| node |
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1292
	sp ifNil: [sp _ stack size].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1293
	sp = 0 ifTrue: [self abort].
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1294
	node _ stack at: sp.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1295
	sp _ sp - 1.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1296
	^ node
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1297
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1298
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1299
stackPush: node
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1300
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1301
	self fixStack.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1302
	stack addLast: node.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1303
	node ifNil: [^ self].  "no op"
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1304
	self mapNode: node.
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1305
! !
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1306
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1307
!IRDecompiler class methodsFor:'documentation'!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1308
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1309
version_CVS
41
f3898a3b378d Package renamed from cvut:stx/goodies/newcompiler to ctu:ircompiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 37
diff changeset
  1310
    ^ 'Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRDecompiler.st,v 1.3 2009/10/08 12:04:20 fm Exp '
37
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1311
!
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1312
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1313
version_SVN
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1314
    ^ '$Id::                                                                                                                        $'
be8c2dd09dff Build files regenerated
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
  1315
! !
42
acdc3ec6d152 Better class category name - IR Compiler-*
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 41
diff changeset
  1316