- changed status to resolved
Fault compilation
Issue #46
resolved
This type of code is compiled wrongly;
(define (prob k l)
((k (let loop ((l l) (r '()))
(if (null? l)
(reverse! r)
(loop (cdr l) (cons (car l) r)))))
(cons 'a 'b)))
(prob (lambda (l) (lambda (p) p)) '(1 2 3))
;; -> should be '(a . b) but SEGV
The compiled code is
;; size: 33
;; 0: CONST_PUSH a
;; 2: CONST b
;; 4: CONS_PUSH
;; 5: FRAME 25
;; 7: LREF_PUSH(1)
;; 8: CONST_PUSH ()
;; 10: LREF(8) ** <-- should be LREF(9) **
;; 11: BNNULL 8 ; (if (null? l) (reverse! r) (lo ...
;; 13: FRAME 4
;; 15: LREF_PUSH(9)
;; 16: GREF_CALL(1) #<identifier reverse!#user (0x804027e0):0>; (reverse! r)
;; 18: JUMP 8
;; 20: LREF_CDR_PUSH(8)
;; 21: LREF_CAR_PUSH(8)
;; 22: LREF(9)
;; 23: CONS_PUSH
;; 24: SHIFTJ(2 8)
;; 25: JUMP -16
;; 27: LEAVE(2)
;; 28: PUSH
;; 29: LREF(0)
;; 30: CALL(1)
;; 31: TAIL_CALL(1)
;; 32: RET
The index 10 is wrong. This is because compiler doesn't consider how many argument already pushed to calculate offset of frame.
Comments (1)
-
reporter - Log in to comment
Added dummy lvar consideration to normal-call (Fixes
#46)→ <<cset 8f8107706f17>>