예제 #1
0
파일: compare.c 프로젝트: abbrous/Gauche
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;
    }
}
예제 #2
0
파일: compare.c 프로젝트: abbrous/Gauche
/* 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;
    }
}
예제 #3
0
파일: compare.c 프로젝트: abbrous/Gauche
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;
    }
}
예제 #4
0
파일: compaux.c 프로젝트: h2oota/Gauche
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);
    }