... | ... |
@@ -208,12 +208,18 @@ static int |
208 | 208 |
writeopcode(char *w) |
209 | 209 |
{ |
210 | 210 |
Uint8 res; |
211 |
- if(jsrlast && scmp(w, "JMP2r", 5)) { /* combine JSR2 JMP2r */ |
|
212 |
- p.data[p.ptr - 1] = findopcode("JMP2"); |
|
213 |
- return jsrlast--; |
|
211 |
+ /* tail-call optimization */ |
|
212 |
+ if(scmp(w, "JMP2r", 5)) { |
|
213 |
+ if(jsrlast) { |
|
214 |
+ p.data[p.ptr - 1] = jsrlast == 2 ? findopcode("JMP2") : findopcode("JMP"); |
|
215 |
+ jsrlast = 0; |
|
216 |
+ return 1; |
|
217 |
+ } |
|
214 | 218 |
} |
215 | 219 |
res = writebyte(findopcode(w)); |
216 | 220 |
if(scmp(w, "JSR2", 4)) |
221 |
+ jsrlast = 2; |
|
222 |
+ else if(scmp(w, "JSR", 3)) |
|
217 | 223 |
jsrlast = 1; |
218 | 224 |
return res; |
219 | 225 |
} |