ScmObj Scm_ComparatorHashFunction(ScmComparator *cmpr) { if (SCM_FALSEP(cmpr->hashFn)) { static ScmObj p = SCM_UNDEFINED; SCM_BIND_PROC(p, "comparator-hash-function", Scm_GaucheModule()); return Scm_ApplyRec1(p, SCM_OBJ(cmpr)); /* this fills hashFn */ } else { return cmpr->hashFn; } }
/* C-level accessors, that take care of on-demand filling of slots. */ ScmObj Scm_ComparatorComparisonProcedure(ScmComparator *cmpr) { if (SCM_FALSEP(cmpr->compareFn)) { static ScmObj p = SCM_UNDEFINED; SCM_BIND_PROC(p, "comparator-comparison-procedure", Scm_GaucheModule()); return Scm_ApplyRec1(p, SCM_OBJ(cmpr)); /* this fills compareFn */ } else { return cmpr->compareFn; } }
ScmObj Scm_ComparatorOrderingPredicate(ScmComparator *cmpr) { if (SCM_FALSEP(cmpr->orderFn)) { static ScmObj p = SCM_UNDEFINED; SCM_BIND_PROC(p, "comparator-ordering-predicate", Scm_GaucheModule()); return Scm_ApplyRec1(p, SCM_OBJ(cmpr)); /* this fills orderFn */ } else { return cmpr->orderFn; } }
void Scm_CompileFinish(ScmCompiledCode *cc) { if (cc->code == NULL) { SCM_INTERNAL_MUTEX_LOCK(compile_finish_mutex); SCM_UNWIND_PROTECT { if (cc->code == NULL) { Scm_ApplyRec1(SCM_GLOC_GET(compile_finish_gloc), SCM_OBJ(cc)); } } SCM_WHEN_ERROR { SCM_INTERNAL_MUTEX_UNLOCK(compile_finish_mutex); SCM_NEXT_HANDLER; } SCM_END_PROTECT; SCM_INTERNAL_MUTEX_UNLOCK(compile_finish_mutex); }