Skip to content

Commit c206944

Browse files
committed
Force null *print-circle* in :prin1 to avoid deadlocks (euslisp#465)
1 parent fa1a018 commit c206944

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

lisp/c/printer.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,7 @@ register context *ctx;
550550
register pointer x;
551551
register pointer f;
552552
register int prlevel;
553-
{ register pointer fobj;
553+
{ register pointer fobj,tmp;
554554
register int shareix=0;
555555
numunion nu;
556556

@@ -586,6 +586,13 @@ register int prlevel;
586586
else if (Spevalof(PROBJECT)!=NIL) prinxobj(ctx,x,f,fobj,prlevel-1);
587587
else if (pisarray(x) && (classof(x)==C_ARRAY)) printarray(ctx,x,f,prlevel-1);
588588
else if (Spevalof(PRSTRUCTURE)!=NIL) printstructure(ctx,x,f,fobj,prlevel-1);
589+
else if (Spevalof(PRCIRCLE)!=NIL) {
590+
// force NIL to avoid deadlocks (EusLisp/#465)
591+
// TODO: consider :prin1 objects in the initial printmark
592+
tmp=Spevalof(PRCIRCLE);
593+
pointer_update(Spevalof(PRCIRCLE),NIL);
594+
csend(ctx,x,K_PRIN1,1,f);
595+
pointer_update(Spevalof(PRCIRCLE),tmp)}
589596
else csend(ctx,x,K_PRIN1,1,f);
590597
} }
591598

0 commit comments

Comments
 (0)