[Gauche-devel-jp] genstub ジェネリック関数のセッターが設定できない (0.8.6)

Back to archive index

Takahiro Horii horii****@ike*****
2006年 2月 28日 (火) 16:40:30 JST


こんにちは。堀井です。

Gauche-0.8.6 の genstub に関してです。
define-cgeneric を使って、ジェネリック関数のセッターを設定しようとする
と、定義していない変数名が出てきます。(それ以前に変数名の typo でエラー
が出ますが、それは修正したものとして話を進めます。)
以下にスタブとそれから生成されたコードを示します。

;; foo.stub
(define-cgeneric foo "Foo")
(define-cgeneric bar "Bar"
  (setter foo))

/* foo.c */
static SCM_DEFINE_GENERIC(Foo, NULL, NULL);
static SCM_DEFINE_GENERIC(Bar, NULL, NULL);
void Scm_Init_foo(ScmModule *module)
{
  Scm_InitBuiltinGeneric(&Bar, "bar", module);
  Scm_SetterSet(SCM_PROCEDURE(&Bar__STUB), SCM_PROCEDURE(&foo_foo__STUB), TRUE);
  Scm_InitBuiltinGeneric(&Foo, "foo", module);
}

Scm_SetterSet() に、定義していない変数名があるので、このコードはコンパ
イルできません。
とりあえず、#define を使って、この問題を解決するパッチを作ってみました。
パッチ適用後は、foo.c は以下のようになります。

/* foo.c */
#define Bar__STUB Bar
#define foo_bar__STUB Bar
#define Foo__STUB Foo
#define foo_foo__STUB Foo
static SCM_DEFINE_GENERIC(Foo, NULL, NULL);
static SCM_DEFINE_GENERIC(Bar, NULL, NULL);
void Scm_Init_foo(ScmModule *module)
{
  Scm_InitBuiltinGeneric(&Bar, "bar", module);
  Scm_SetterSet(SCM_PROCEDURE(&Bar__STUB), SCM_PROCEDURE(&foo_foo__STUB), TRUE);
  Scm_InitBuiltinGeneric(&Foo, "foo", module);
}

以下パッチです。
変数名、コメントの typo 等も含んでます。

--- genstub.orig	2006-02-28 16:21:41.753406652 +0900
+++ genstub	2006-02-28 16:21:45.718852430 +0900
@@ -511,7 +511,7 @@
 ;; Literal is used to embed Scheme value in C file.
 ;; Class <literal> is subclassed to each Scheme object types.
 ;; Besides the standard stub protocol, a subclass has to define
-;; value-getter-of that returns a C expression ot retrieve the
+;; value-getter-of that returns a C expression to retrieve the
 ;; Scheme value.
 
 (define-class <literal> (<instance-pool-mixin>)
@@ -553,11 +553,11 @@
   (f #`"static ScmObj ,(c-name-of self) = SCM_UNBOUND;"))
 (define-method emit-initializer ((self <bignum-literal>))
   (cgen-init (format "  ~a = ~a(~a)"
-                     (c-name-of a)
-                     (if (positive? (value-of a))
+                     (c-name-of self)
+                     (if (positive? (value-of self))
                        "Scm_MakeIntegerFromUI"
                        "Scm_MakeInteger")
-                     (value-of a))))
+                     (value-of self))))
 
 ;; boolean literals
 (define-literal-binding <boolean> <boolean-literal>)
@@ -1206,13 +1206,18 @@
    ))
 
 (define-method emit-definition ((self <cgeneric>))
-  (unless (extern? self) (display "static "))
+  (unless (extern? self) (cgen-body "static "))
   (f "SCM_DEFINE_GENERIC(~a, ~a, NULL);" (c-name-of self) (fallback-of self))
   (cgen-body ""))
 
 (define-method emit-initializer ((self <cgeneric>))
   (cgen-init (format "  Scm_InitBuiltinGeneric(&~a, ~s, module);"
                      (c-name-of self) (symbol->string (scheme-name-of self))))
+  ;; for setter
+  (cgen-define #`",(c-name-of self)__STUB" (c-name-of self))
+  (cgen-define (format "~a__STUB"
+                       (get-c-name *file-prefix* (scheme-name-of self)))
+               (c-name-of self))
   (next-method))
 
 (define-form-parser define-cgeneric (scheme-name c-name . body)
@@ -1236,7 +1241,7 @@
     (with-cpp-condition gf
       (emit-definition gf))))
 
-(define-method process-setter ((gf <cgeneric>) setter)
+(define-method process-setter ((gf <cgeneric>) decl)
   (cond
    ((symbol? (car decl))
     (set! (setter-of gf) (car decl))
@@ -1581,7 +1586,7 @@
     (cgen-body #`"  ,(c-type-of class-type) obj = ,(unbox-expr class-type \"OBJARG\");")
     (cond ((string? (getter-of slot)) (cgen-body (getter-of slot)))
           ((string? (c-spec-of slot))
-           (f "  return ~a;" (box-expr type c-spec-of slot)))
+           (f "  return ~a;" (box-expr type (c-spec-of slot))))
           (else
            (f "  return ~a;" (box-expr type #`"obj->,(c-name-of slot)"))))
     (cgen-body "}")

--
Takahiro Horii <horii****@ike*****>



Gauche-devel-jp メーリングリストの案内
Back to archive index