author | Jan Vrany <jan.vrany@fit.cvut.cz> |
Wed, 11 Jun 2008 14:54:42 +0000 | |
changeset 1 | 0dd36941955f |
child 2 | 6e1de7f85d59 |
permissions | -rw-r--r-- |
1
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
1 |
"{ Package: 'stx:goodies/newcompiler' }" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
2 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
3 |
IRInterpreter subclass:#IRTranslator |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
4 |
instanceVariableNames:'pending gen currentInstr trailerBytes' |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
5 |
classVariableNames:'' |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
6 |
poolDictionaries:'' |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
7 |
category:'NewCompiler-IR' |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
8 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
9 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
10 |
IRTranslator comment:'I interpret IRMethod instructions, sending the appropriate bytecode messages to my BytecodeGenerator (gen). I hold some messages back in pending awaiting certain sequences of them that can be consolidated into single bytecode instructions, otherwise the pending messages are executed in order as if they were executed when they first appeared.' |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
11 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
12 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
13 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
14 |
!IRTranslator class methodsFor:'instance creation'! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
15 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
16 |
new |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
17 |
^ self basicNew initialize. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
18 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
19 |
"Created: / 11-06-2008 / 09:24:01 / Jan Vrany <vranyj1@fel.cvut.cz>" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
20 |
! ! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
21 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
22 |
!IRTranslator methodsFor:'initialization'! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
23 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
24 |
initialize |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
25 |
"Invoked when a new instance is created." |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
26 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
27 |
"/ please change as required (and remove this comment) |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
28 |
pending := OrderedCollection new. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
29 |
gen := IRBytecodeGenerator new. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
30 |
"/ currentInstr := nil. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
31 |
"/ trailerBytes := nil. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
32 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
33 |
"/ super initialize. -- commented since inherited method does nothing |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
34 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
35 |
"Created: / 11-06-2008 / 13:46:17 / Jan Vrany <vranyj1@fel.cvut.cz>" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
36 |
! ! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
37 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
38 |
!IRTranslator methodsFor:'instructions'! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
39 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
40 |
addLiteral: literal |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
41 |
gen addLiteral: literal. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
42 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
43 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
44 |
blockReturnTop |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
45 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
46 |
self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
47 |
gen blockReturnTop. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
48 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
49 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
50 |
goto: seqNum |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
51 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
52 |
self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
53 |
gen goto: seqNum. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
54 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
55 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
56 |
if: bool goto: seqNum1 otherwise: seqNum2 |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
57 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
58 |
self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
59 |
gen if: bool goto: seqNum1 otherwise: seqNum2. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
60 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
61 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
62 |
jumpOverBlock: blockNum to: seqNum |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
63 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
64 |
self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
65 |
gen jumpOverBlock: seqNum. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
66 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
67 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
68 |
label: seqNum |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
69 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
70 |
pending := OrderedCollection new. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
71 |
gen label: seqNum. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
72 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
73 |
"Modified: / 11-06-2008 / 10:13:28 / Jan Vrany <vranyj1@fel.cvut.cz>" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
74 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
75 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
76 |
popTop |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
77 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
78 |
"if last was storeTemp, storeInstVar storeIntoLiteralVariable then convert to storePopTemp, storePopInstVar storePopIntoLiteralVariable" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
79 |
#storeTemp: == self pendingSelector ifTrue: [ |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
80 |
^ self pendingSelector: #storePopTemp:]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
81 |
#storeInstVar: == self pendingSelector ifTrue: [ |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
82 |
^ self pendingSelector: #storePopInstVar:]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
83 |
#storeIntoLiteralVariable: == self pendingSelector ifTrue:[ |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
84 |
^self pendingSelector: #storePopIntoLiteralVariable:]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
85 |
"otherwise do normal pop" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
86 |
self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
87 |
gen popTop. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
88 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
89 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
90 |
pushBlock: irMethod |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
91 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
92 |
| meth block | |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
93 |
meth _ irMethod compiledMethodWith: trailerBytes. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
94 |
meth isBlockMethod: true. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
95 |
block _ meth createBlock: nil. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
96 |
self addPending: (Message selector: #pushLiteral: argument: block) |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
97 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
98 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
99 |
pushBlockMethod: irMethod |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
100 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
101 |
| meth | |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
102 |
meth _ irMethod compiledMethodWith: trailerBytes. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
103 |
meth isBlockMethod: true. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
104 |
self addPending: (Message selector: #pushLiteral: argument: meth) |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
105 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
106 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
107 |
pushDup |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
108 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
109 |
self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
110 |
gen pushDup. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
111 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
112 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
113 |
pushInstVar: index |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
114 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
115 |
"self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
116 |
gen pushInstVar: index." |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
117 |
self addPending: (Message selector: #pushInstVar: argument: index) |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
118 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
119 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
120 |
pushLiteral: object |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
121 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
122 |
self addPending: (Message selector: #pushLiteral: argument: object) |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
123 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
124 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
125 |
pushLiteralVariable: object |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
126 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
127 |
self addPending: (Message selector: #pushLiteralVariable: argument: object) |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
128 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
129 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
130 |
pushTemp: index |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
131 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
132 |
index = 0 ifTrue: [^ self addPending: (Message selector: #pushReceiver)]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
133 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
134 |
(self pendingMatches: { |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
135 |
[:m | m selector == #storePopTemp: and: [m argument = index]]} |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
136 |
) ifTrue: [^ self pendingSelector: #storeTemp:]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
137 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
138 |
self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
139 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
140 |
index = -2 ifTrue: [^ gen pushThisContext]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
141 |
index = -1 ifTrue: [ |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
142 |
^ gen pushThisContext; |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
143 |
pushLiteral: MethodContext myEnvFieldIndex; |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
144 |
send: #privGetInstVar:]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
145 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
146 |
gen pushTemp: index. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
147 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
148 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
149 |
remoteReturn |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
150 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
151 |
self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
152 |
gen remoteReturn. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
153 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
154 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
155 |
returnTop |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
156 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
157 |
#pushReceiver == self pendingSelector ifTrue: [ |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
158 |
self pendingSelector: #returnReceiver. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
159 |
^ self doPending |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
160 |
]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
161 |
#pushLiteral: == self pendingSelector ifTrue: [ |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
162 |
self pendingSelector: #returnConstant:. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
163 |
^ self doPending |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
164 |
]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
165 |
#pushInstVar: == self pendingSelector ifTrue: [ |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
166 |
self pendingSelector: #returnInstVar:. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
167 |
^ self doPending |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
168 |
]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
169 |
self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
170 |
gen returnTop. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
171 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
172 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
173 |
send: selector |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
174 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
175 |
"If get/set inst var, access it directly" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
176 |
| index | |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
177 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
178 |
((#(privGetInstVar: #privStoreIn:instVar:) identityIncludes: selector) and: |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
179 |
[self pendingMatches: { |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
180 |
[:m | m selector == #pushReceiver]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
181 |
[:m | m selector == #pushLiteral: and: [m argument isInteger]]}] |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
182 |
) ifTrue: [ |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
183 |
index _ self popPending argument. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
184 |
self popPending. "pop pushReceiver" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
185 |
self addPending: (Message |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
186 |
selector: (selector == #privGetInstVar: |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
187 |
ifTrue: [#pushInstVar:] ifFalse: [#storeInstVar:]) |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
188 |
argument: index). |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
189 |
(self pendingMatches: { |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
190 |
[:m | m selector == #storePopInstVar: and: [m argument = index]]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
191 |
[:m | m selector == #pushInstVar: and: [m argument = index]]} |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
192 |
) ifTrue: [ |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
193 |
self popPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
194 |
self pendingSelector: #storeInstVar:. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
195 |
]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
196 |
^ self |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
197 |
]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
198 |
"otherwise do normal send" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
199 |
self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
200 |
gen send: selector. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
201 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
202 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
203 |
send: selector toSuperOf: behavior |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
204 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
205 |
self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
206 |
gen send: selector toSuperOf: behavior. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
207 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
208 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
209 |
storeInstVar: index |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
210 |
"self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
211 |
gen storeInstVar: index" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
212 |
self addPending: (Message selector: #storeInstVar: argument: index) |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
213 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
214 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
215 |
storeIntoLiteralVariable: assoc |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
216 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
217 |
"self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
218 |
gen storeIntoLiteralVariable: assoc." |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
219 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
220 |
self addPending: (Message selector: #storeIntoLiteralVariable: argument: assoc) |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
221 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
222 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
223 |
storeTemp: index |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
224 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
225 |
index = -1 "thisEnv" ifTrue: [ |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
226 |
self doPending. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
227 |
^ gen pushThisContext; |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
228 |
pushLiteral: MethodContext myEnvFieldIndex; |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
229 |
send: #privStoreIn:instVar:]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
230 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
231 |
self addPending: (Message selector: #storeTemp: argument: index) |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
232 |
! ! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
233 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
234 |
!IRTranslator methodsFor:'interpret'! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
235 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
236 |
interpret: ir |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
237 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
238 |
ir optimize. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
239 |
gen numArgs: ir numArgs. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
240 |
ir additionalLiterals do: [:lit | gen addLiteral: lit]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
241 |
super interpret: ir. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
242 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
243 |
"Modified: / 11-06-2008 / 13:52:20 / Jan Vrany <vranyj1@fel.cvut.cz>" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
244 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
245 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
246 |
interpretAll: irSequences |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
247 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
248 |
irSequences withIndexDo: [:seq :i | seq orderNumber: i]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
249 |
super interpretAll: irSequences. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
250 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
251 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
252 |
interpretInstruction: irInstruction |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
253 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
254 |
currentInstr := irInstruction. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
255 |
super interpretInstruction: irInstruction. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
256 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
257 |
"Modified: / 11-06-2008 / 09:20:30 / Jan Vrany <vranyj1@fel.cvut.cz>" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
258 |
! ! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
259 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
260 |
!IRTranslator methodsFor:'priv pending'! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
261 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
262 |
addPending: message |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
263 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
264 |
pending addLast: currentInstr -> message |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
265 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
266 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
267 |
doPending |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
268 |
"execute pending instructions" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
269 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
270 |
| assoc | |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
271 |
[pending isEmpty] whileFalse: [ |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
272 |
assoc _ pending removeFirst. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
273 |
gen mapBytesTo: assoc key "instr". |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
274 |
assoc value "message" sendTo: gen. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
275 |
]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
276 |
gen mapBytesTo: currentInstr. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
277 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
278 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
279 |
pendingMatches: blocks |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
280 |
"Return true if each message at end of pending list satisfies its corresponding block. The number of elements tested equals the number of blocks. If not enough elements return false" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
281 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
282 |
| messages i | |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
283 |
messages _ pending collect: [:assoc | assoc value]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
284 |
blocks size > messages size ifTrue: [^ false]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
285 |
i _ messages size - blocks size. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
286 |
blocks do: [:b | |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
287 |
(b value: (messages at: (i _ i + 1))) ifFalse: [^ false]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
288 |
]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
289 |
^ true |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
290 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
291 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
292 |
pendingSelector |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
293 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
294 |
pending isEmpty ifTrue: [^ nil]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
295 |
^ pending last value "message" selector |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
296 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
297 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
298 |
pendingSelector: selector |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
299 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
300 |
pending last value "message" setSelector: selector |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
301 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
302 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
303 |
popPending |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
304 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
305 |
^ pending removeLast value "message" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
306 |
! ! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
307 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
308 |
!IRTranslator methodsFor:'private - literals'! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
309 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
310 |
indexOfLiteral: object |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
311 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
312 |
| idx | |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
313 |
idx := literalFrame identityIndexOf: object. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
314 |
idx = 0 ifTrue: |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
315 |
[literalFrame add: object. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
316 |
idx := literalFrame identityIndexOf: object]. |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
317 |
^idx |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
318 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
319 |
"Created: / 11-06-2008 / 10:56:24 / Jan Vrany <vranyj1@fel.cvut.cz>" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
320 |
! ! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
321 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
322 |
!IRTranslator methodsFor:'results'! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
323 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
324 |
compiledMethod |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
325 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
326 |
^ gen compiledMethodWith: trailerBytes |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
327 |
! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
328 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
329 |
compiledMethodUsing: aCompiledMethodClass |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
330 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
331 |
^ gen compiledMethodUsing: aCompiledMethodClass |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
332 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
333 |
"Modified: / 11-06-2008 / 14:08:02 / Jan Vrany <vranyj1@fel.cvut.cz>" |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
334 |
! ! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
335 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
336 |
!IRTranslator class methodsFor:'documentation'! |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
337 |
|
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
338 |
version |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
339 |
^'$Id$' |
0dd36941955f
Initial revision. All tests pass.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
340 |
! ! |