return (SCM_NIMP (s) && SCM_CELL_TYPE (s) == unpure_pure_container_tag);
}
+bool
+is_unchanging_unpure_pure_container (SCM s)
+// A container that has the same callback for both 'pure' and 'unpure' lookups
+// and which ignores the 'start' and 'end' columnns.
+// Such a callback will give the same answer for tentative or final layouts.
+{
+ LY_ASSERT_TYPE (is_unpure_pure_container, s, 1);
+ SCM pure_part = SCM_SMOB_OBJECT_2 (s);
+ return (SCM_UNBNDP (pure_part));
+}
+
SCM
unpure_pure_container_unpure_part (SCM smob)
{
{
scm_puts ("#<unpure-pure-container ", port);
scm_display (unpure_pure_container_unpure_part (s), port);
- scm_puts (" ", port);
- scm_display (unpure_pure_container_pure_part (s), port);
+ if (!SCM_UNBNDP (SCM_SMOB_OBJECT_2 (s)))
+ {
+ scm_puts (" ", port);
+ scm_display (unpure_pure_container_pure_part (s), port);
+ }
scm_puts (" >", port);
return 1;
}
SCM
-pure_mark (SCM pure)
+pure_mark (SCM smob)
{
- scm_gc_mark (unpure_pure_container_unpure_part (pure));
- scm_gc_mark (unpure_pure_container_pure_part (pure));
- return pure;
+ scm_gc_mark (SCM_SMOB_OBJECT (smob));
+ return SCM_SMOB_OBJECT_2 (smob);
}
// Function signature has two fixed arguments so that dropping two
unpure_pure_call_tag = scm_make_smob_type ("unpure-pure-call", 0);
scm_set_smob_mark (unpure_pure_call_tag, scm_markcdr);
scm_set_smob_apply (unpure_pure_call_tag,
- (SCM (*)()) apply_unpure_pure, 2, 0, 1);
+ (scm_t_subr) apply_unpure_pure, 2, 0, 1);
};
ADD_SCM_INIT_FUNC (unpure_pure_container, init_unpure_pure_container);