SigScheme開発録 (57)

こっちは Invalid Others Object で大ハマリ。八方塞がりだな、これは(笑)

私信: Yamakenさんへ。

+    scm_gc_protect(&scm_in);
+    scm_gc_protect(&scm_out);
+    scm_gc_protect(&scm_err);
     scm_in  = scm_make_shared_file_port(stdin, "stdin", SCM_PORTFLAG_INPUT);
     scm_out = scm_make_shared_file_port(stdout, "stdout", SCM_PORTFLAG_OUTPUT);
     scm_err = scm_make_shared_file_port(stderr, "stderr", SCM_PORTFLAG_OUTPUT);

これだと、1回目のscm_make_shared_file_portでGCinvokeされた時に、不正なscm_outとscm_errを見てしまう。正しくは次のようにするべきではないかと。

     scm_in  = scm_make_shared_file_port(stdin, "stdin", SCM_PORTFLAG_INPUT);
+    scm_gc_protect(&scm_in);
     scm_out = scm_make_shared_file_port(stdout, "stdout", SCM_PORTFLAG_OUTPUT);
+    scm_gc_protect(&scm_out);
     scm_err = scm_make_shared_file_port(stderr, "stderr", SCM_PORTFLAG_OUTPUT);
+    scm_gc_protect(&scm_err);

って、元々やってなかったのは俺な訳ですが。