intptr_t Scm__CheckDictValue(ScmObj val, const char *file, int line) { if (val == NULL || SCM_UNBOUNDP(val)) { Scm_Panic("[internal] attempted to set an invalid ScmObj value (%p) as a value of a dictionary, at %s:%d", val, file, line); } return (intptr_t)val; }
/* Auxiliary function */ const char* Scm_GetCESName(ScmObj code, const char *argname) { const char *c = NULL; if (SCM_UNBOUNDP(code) || SCM_FALSEP(code)) { c = Scm_SupportedCharacterEncodings()[0]; } else if (SCM_STRINGP(code)) { c = Scm_GetStringConst(SCM_STRING(code)); } else if (SCM_SYMBOLP(code)) { c = Scm_GetStringConst(SCM_SYMBOL_NAME(code)); } else { Scm_Error("string, symbol or #f is required for %s, but got %S", argname, code); } return c; }
ScmObj Scm_GetKeyword(ScmObj key, ScmObj list, ScmObj fallback) { ScmObj cp; SCM_FOR_EACH(cp, list) { if (!SCM_PAIRP(SCM_CDR(cp))) { Scm_Error("incomplete key list: %S", list); } if (key == SCM_CAR(cp)) return SCM_CADR(cp); cp = SCM_CDR(cp); } if (SCM_UNBOUNDP(fallback)) { Scm_Error("value for key %S is not provided: %S", key, list); } return fallback; }
/* register samples into the stat table. Called from Scm_ProfilerResult */ void collect_samples(ScmVMProfiler *prof) { for (int i=0; i<prof->currentSample; i++) { ScmObj e = Scm_HashTableRef(prof->statHash, prof->samples[i].func, SCM_UNBOUND); if (SCM_UNBOUNDP(e)) { /* NB: just for now */ Scm_Warn("profiler: uncounted object appeared in a sample: %p (%S)\n", prof->samples[i].func, prof->samples[i].func); } else { SCM_ASSERT(SCM_PAIRP(e)); int cnt = SCM_INT_VALUE(SCM_CDR(e)) + 1; SCM_SET_CDR(e, SCM_MAKE_INT(cnt)); } } }