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