From 63e55ac81391f0a01d910c5dda8bcc6bab513976 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Tue, 1 Jan 2013 14:47:54 -0800 Subject: [PATCH] compiler.cfg.liveness: Break the infinite loop--add the base-pointer as f to start with, and replace it with the real one if there's not a circular chain. Fixes #22 again. --- basis/compiler/cfg/liveness/liveness.factor | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/basis/compiler/cfg/liveness/liveness.factor b/basis/compiler/cfg/liveness/liveness.factor index 5cc9456d56..1ad89800eb 100644 --- a/basis/compiler/cfg/liveness/liveness.factor +++ b/basis/compiler/cfg/liveness/liveness.factor @@ -98,10 +98,15 @@ M: ##sub lookup-base-pointer* M: vreg-insn lookup-base-pointer* 2drop f ; +! Can't use cache here because of infinite recursion inside +! the quotation passed to cache : lookup-base-pointer ( vreg -- vregs/f ) - base-pointers get [ - dup ?leader insn-of lookup-base-pointer* - ] cache ; + base-pointers get ?at [ + f over base-pointers get set-at + [ dup ?leader insn-of lookup-base-pointer* ] keep + dupd base-pointers get set-at + ] unless ; + :: visit-derived-root ( vreg derived-roots gc-roots -- ) vreg lookup-base-pointer :> base