- Grob * s = (Grob*) SCM_CELL_WORD_1 (ses);
- scm_gc_mark (s->immutable_property_alist_);
-
- for (int a =0 ; a < 2; a++)
- {
- scm_gc_mark (s->dim_cache_[a].offset_callbacks_);
- scm_gc_mark (s->dim_cache_[a].dimension_);
-
- /*
- don't mark the parents. The pointers in the mutable property
- list form two tree like structures (one for X relations, one
- for Y relations). Marking these can be done in limited stack
- space. If we add the parents, we will jump between X and Y in
- an erratic manner, leading to much more recursion depth (and
- core dumps if we link to pthreads.)
- */
- }
-
- if (s->original_)
- scm_gc_mark (s->original_->self_scm ());
-
- s->do_derived_mark ();
- return s->mutable_property_alist_;
-}
-
-int
-Grob::print_smob (SCM s, SCM port, scm_print_state *)
-{
- Grob *sc = (Grob *) ly_cdr (s);
-
- scm_puts ("#<Grob ", port);
- scm_puts ((char *)sc->name ().to_str0 (), port);
+ SCM cause = self_scm ();
+ while (Grob *g = unsmob_grob (cause))
+ cause = g->get_property ("cause");