NEXT;
}
+VM_DEFINE_INSTRUCTION (cons_mark, "cons-mark", 0, 0, 0)
+{
+ POP_CONS_MARK ();
+ NEXT;
+}
+
VM_DEFINE_INSTRUCTION (vector_mark, "vector-mark", 0, 0, 0)
{
POP_LIST_MARK ();
(return-object! loc obj))
((<ghil-quasiquote> env loc exp)
- (let loop ((x exp))
+ (let loop ((x exp) (in-car? #f))
(cond
((list? x)
(push-call! #f 'mark '())
- (for-each loop x)
+ (for-each (lambda (x) (loop x #t)) x)
(push-call! #f 'list-mark '()))
((pair? x)
- (loop (car x))
- (loop (cdr x))
- (push-code! #f (make-glil-call 'cons 2)))
+ (push-call! #f 'mark '())
+ (loop (car x) #t)
+ (loop (cdr x) #f)
+ (push-call! #f 'cons-mark '()))
((record? x)
(record-case x
((<ghil-unquote> env loc exp)
(comp-push exp))
((<ghil-unquote-splicing> env loc exp)
+ (if (not in-car?)
+ (error "unquote-splicing in the cdr of a pair" exp))
(comp-push exp)
(push-call! #f 'list-break '()))))
((constant? x)