/* * Entry point of initlalizing Gauche runtime */ void Scm_Init(const char *signature) { /* make sure the main program links the same version of libgauche */ if (strcmp(signature, GAUCHE_SIGNATURE) != 0) { Scm_Panic("libgauche ABI version mismatch: libgauche %s, expected %s", GAUCHE_SIGNATURE, signature); } /* Some platforms require this. It is harmless if GC is already initialized, so we call it here just in case. */ GC_init(); /* Set up GC parameters. We need to call finalizers at the safe point of VM loop, so we disable auto finalizer invocation, and ask GC to call us back when finalizers are queued. */ GC_oom_fn = oom_handler; GC_finalize_on_demand = TRUE; GC_finalizer_notifier = finalizable; (void)SCM_INTERNAL_MUTEX_INIT(cond_features.mutex); /* Initialize components. The order is important, for some components rely on the other components to be initialized. */ Scm__InitParameter(); Scm__InitVM(); Scm__InitSymbol(); Scm__InitModule(); Scm__InitNumber(); Scm__InitChar(); Scm__InitClass(); Scm__InitModulePost(); Scm__InitCollection(); Scm__InitExceptions(); Scm__InitProc(); Scm__InitPort(); Scm__InitWrite(); Scm__InitCode(); Scm__InitMacro(); Scm__InitLoad(); Scm__InitRegexp(); Scm__InitRead(); Scm__InitSignal(); Scm__InitSystem(); Scm_Init_libalpha(); Scm_Init_libbool(); Scm_Init_libchar(); Scm_Init_libcode(); Scm_Init_libdict(); Scm_Init_libeval(); Scm_Init_libexc(); Scm_Init_libfmt(); Scm_Init_libio(); Scm_Init_liblazy(); Scm_Init_liblist(); Scm_Init_libmisc(); Scm_Init_libmod(); Scm_Init_libnum(); Scm_Init_libobj(); Scm_Init_libproc(); Scm_Init_librx(); Scm_Init_libstr(); Scm_Init_libsym(); Scm_Init_libsys(); Scm_Init_libvec(); Scm_Init_compile(); Scm_Init_libomega(); Scm__InitCompaux(); Scm_SelectModule(Scm_GaucheModule()); Scm__InitAutoloads(); Scm_SelectModule(Scm_UserModule()); /* Final setup of cond-features alist. */ init_cond_features(); #ifdef GAUCHE_USE_PTHREADS /* a trick to make sure the gc thread object is linked */ ptr_pthread_create = (int (*)(void))GC_pthread_create; #endif }
/* Process command-line options that needs to run after Scheme runtime is initialized. CMD_ARGS is an list of (OPTION-CHAR . OPTION-ARG) */ static void process_command_args(ScmObj cmd_args) { ScmEvalPacket epak; ScmLoadPacket lpak; int standard_given = FALSE; ScmObj cp; SCM_FOR_EACH(cp, cmd_args) { ScmObj p = SCM_CAR(cp); ScmObj v = SCM_CDR(p); switch (SCM_CHAR_VALUE(SCM_CAR(p))) { case 'I': Scm_AddLoadPath(Scm_GetStringConst(SCM_STRING(v)), FALSE); break; case 'A': Scm_AddLoadPath(Scm_GetStringConst(SCM_STRING(v)), TRUE); break; case 'l': if (Scm_Load(Scm_GetStringConst(SCM_STRING(v)), 0, &lpak) < 0) error_exit(lpak.exception); break; case 'L': if (Scm_Load(Scm_GetStringConst(SCM_STRING(v)), SCM_LOAD_QUIET_NOFILE, &lpak) < 0) error_exit(lpak.exception); break; case 'u': if (Scm_Require(Scm_StringJoin(Scm_StringSplitByChar(SCM_STRING(v), '.'), SCM_STRING(SCM_MAKE_STR("/")), SCM_STRING_JOIN_INFIX), 0, &lpak) < 0) { error_exit(lpak.exception); } Scm_ImportModule(SCM_CURRENT_MODULE(), Scm_Intern(SCM_STRING(v)), SCM_FALSE, 0); break; case 'e': if (Scm_EvalCString(Scm_GetStringConst(SCM_STRING(v)), SCM_OBJ(Scm_UserModule()), &epak) < 0) { error_exit(epak.exception); } break; case 'E': v = Scm_StringAppend(SCM_LIST3(SCM_MAKE_STR("("), v, SCM_MAKE_STR(")"))); if (Scm_EvalCString(Scm_GetStringConst(SCM_STRING(v)), SCM_OBJ(Scm_UserModule()), &epak) < 0) { error_exit(epak.exception); } break; case 'r': if (standard_given) { Scm_Error("Multiple -r option is specified."); } else { /* R7RS mode. Preload r7rs module, set the default toplevel to r7rs.user, and define *r7rs-mode* in user module so that gauche.interactive can do proper setup. */ const char *std = Scm_GetStringConst(SCM_STRING(v)); if (strcmp(std, "7") == 0) { if (Scm_Require(SCM_MAKE_STR("r7rs"), 0, &lpak) < 0) { error_exit(lpak.exception); } SCM_DEFINE(Scm_UserModule(), "*r7rs-mode*", SCM_TRUE); default_toplevel_module = SCM_FIND_MODULE("r7rs.user", 0); standard_given = TRUE; } else { Scm_Error("Unsupported standard for -r option: %s", std); } } } }