SigScheme開発録(48)

  • mutable and immutable string construction interface

ScmObj Scm_NewString(char *str, int is_immutable);

/* wrapper function */
ScmObj Scm_NewImmutableString(char *str);
ScmObj Scm_NewMutableString(char *str);
ScmObj Scm_NewImmutableStringCopying(const char *str);
ScmObj Scm_NewMutableStringCopying(const char *str);

なんか冗長な気がしなくも無い。が、wrapper functionが無いとScm_NewString(str, 1, 0);等と書かねばならず、意味が分かりづらい。Scm_NewString(char *str, int flag);とか、マクロでwrapperを用意するとか考えたんだが、これが一番ストレートで分かり易いかなぁと。後、lenを指定するのもバグの元になりそうなので止めた。ただ、こうするとstring-appendの様に元から長さが分かっている場合にパフォーマンスが落ちる。悩ましい。

  • Scm_NewStringWithLenはバグの元になりそうなので除去
    • strと整合の取れてないlenのsetを許すのが怪しい
  • String周りをイジメル
    • (string-set! (string-copy "abcdef") -1 #\z) でエラーが出ないなんてまだまだです...
  • Vector周りをイジメル
    • と思ったら (make-vector -1 #f) なんてのもエラーが出ない。まだまだです...mature!mature! これはGaucheでも通らなかったので報告しようと思ったら2005/10/04に直ってた。
  • memory leak

$ valgrind --leak-check=yes ./sscm test/test-char.scm


ごにょごにょ


==27653== 3496 bytes in 437 blocks are definitely lost in loss record 1 of 1
==27653== at 0x1B9008A2: malloc (vg_replace_malloc.c:149)
==27653== by 0x8052D0D: ScmSingleByteCharPort_new (sbcport.c:254)
==27653== by 0x8051425: Scm_MakeSharedFilePort (io.c:116)
==27653== by 0x805D9B1: SigScm_Initialize_internal (sigscheme.c:168)
==27653== by 0x805D82C: SigScm_Initialize (sigscheme.c:120)
==27653== by 0x804952D: main (main.c:151)

sbcport.cで結構派手にleakしているようだ。