summaryrefslogtreecommitdiff
path: root/README.EXT
diff options
context:
space:
mode:
Diffstat (limited to 'README.EXT')
-rw-r--r--README.EXT1060
1 files changed, 0 insertions, 1060 deletions
diff --git a/README.EXT b/README.EXT
deleted file mode 100644
index 7d2d6456c4..0000000000
--- a/README.EXT
+++ /dev/null
@@ -1,1060 +0,0 @@
-.\" README.EXT - -*- Text -*- created at: Mon Aug 7 16:45:54 JST 1995
-
-This document explains how to make extention modules for Ruby.
-
-1.Basic knowledge
-
-In C, variables have types and data do not have types. In contrast,
-Ruby variables do not have static type and data themselves have
-types. So, data need to be converted across the languages.
-
-Data in Ruby represented C type `VALUE'. Each VALUE data have its
-data-type.
-
-To retrieve an C data from the VALUE, you need to:
-
- (1) Identify VALUE's data type
- (2) Convert VALUE into C data
-
-Converting to wrong data type may cause serious promblems.
-
-
-1.1 Data-types
-
-Ruby interpreter has data-types as below:
-
- T_NIL nil
- T_OBJECT ordinaly object
- T_CLASS class
- T_MODULE module
- T_FLOAT floating point number
- T_STRING string
- T_REGEXP regular expression
- T_ARRAY array
- T_FIXNUM Fixnum(31bit integer)
- T_HASH assosiative array
- T_STRUCT (Ruby) structure
- T_BIGNUM multi precision integer
- T_TRUE true
- T_FALSE false
- T_DATA data
-
-Otherwise, there are several other types used internally:
-
- T_ICLASS
- T_MATCH
- T_VARMAP
- T_SCOPE
- T_NODE
-
-Most of the types are represented by C structures.
-
-1.2 Check Data Type of the VALUE
-
-The macro TYPE() defined in ruby.h shows data-type of the VALUE.
-TYPE() returns the constant number T_XXXX described above. To handle
-data-types, the code will be like:
-
- switch (TYPE(obj)) {
- case T_FIXNUM:
- /* process Fixnum */
- break;
- case T_STRING:
- /* process String */
- break;
- case T_ARRAY:
- /* process Array */
- break;
- default:
- /* raise exception */
- Fail("not valid value");
- break;
- }
-
-There is the data-type check function.
-
- void Check_Type(VALUE value, int type)
-
-It raises an exception, if the VALUE does not have the type specified.
-
-There are faster check-macros for fixnums and nil.
-
- FIXNUM_P(obj)
- NIL_P(obj)
-
-1.3 Convert VALUE into C data
-
-データタイプがT_NIL, T_FALSE, T_TRUEである時,データはそれぞ
-れnil, false, trueです.このデータタイプのオブジェクトはひと
-つずつしか存在しません.
-
-データタイプがT_FIXNUMの時,これは31bitのサイズを持つ整数で
-す.FIXNUMをCの整数に変換するためにはマクロ「FIX2INT()」を使
-います.それから,FIXNUMに限らずRubyのデータを整数に変換する
-「NUM2INT()」というマクロがあります.このマクロはデータタイ
-プのチェック無しで使えます(整数に変換できない場合には例外が
-発生する).
-
-それ以外のデータタイプは対応するCの構造体があります.対応す
-る構造体のあるVALUEはそのままキャスト(型変換)すれば構造体の
-ポインタに変換できます.
-
-構造体は「struct RXxxxx」という名前でruby.hで定義されていま
-す.例えば文字列は「struct RString」です.実際に使う可能性が
-あるのは文字列と配列くらいだと思います.
-
-ruby.hでは構造体へキャストするマクロも「RXXXXX()」(全部大文
-字にしたもの)という名前で提供されています(例: RSTRING()).
-
-例えば,文字列strの長さを得るためには「RSTRING(str)->len」と
-し,文字列strをchar*として得るためには「RSTRING(str)->ptr」
-とします.配列の場合には,それぞれ「RARRAT(str)->len」,
-「RARRAT(str)->ptr」となります.
-
-Rubyの構造体を直接アクセスする時に気をつけなければならないこ
-とは,配列や文字列の構造体の中身は参照するだけで,直接変更し
-ないことです.直接変更した場合,オブジェクトの内容の整合性が
-とれなくなって,思わぬバグの原因になります.
-
-1.4 Convert C data into VALUE
-
-VALUEの実際の構造は
-
- * FIXNUMの場合
-
- 1bit右シフトして,LSBを立てる.
-
- * その他のポインタの場合
-
- そのままVALUEにキャストする.
-
-となっています.よって,LSBをチェックすればVALUEがFIXNUMかど
-うかわかるわけです(ポインタのLSBが立っていないことを仮定して
-いる).
-
-ですから,FIXNUM以外のRubyのオブジェクトの構造体は単にVALUE
-にキャストするだけでVALUEに変換出来ます.ただし,任意の構造
-体がVALUEにキャスト出来るわけではありません.キャストするの
-はRubyの知っている構造体(ruby.hで定義されているstruct RXxxx
-のもの)だけにしておいてください.
-
-FIXNUMに関しては変換マクロを経由する必要があります.Cの整数
-からVALUEに変換するマクロは以下のものがあります.必要に応じ
-て使い分けてください.
-
- INT2FIX() もとの整数が31bit以内に収まる時
- INT2NUM() 任意の整数からVALUEへ
-
-INT2NUM()は整数がFIXNUMの範囲に収まらない場合,Bignumに変換
-してくれます(が,少し遅い).
-
-1.5 Manipulate Ruby data
-
-先程も述べた通り,Rubyの構造体をアクセスする時に内容の更新を
-行うことは勧められません.で,Rubyのデータを操作する時には
-Rubyが用意している関数を用いてください.
-
-ここではもっとも使われるであろう文字列と配列の生成/操作を行
-い関数をあげます(全部ではないです).
-
- String funtions
-
- str_new(char *ptr, int len)
-
- Creates a new Ruby string.
-
- str_new2(char *ptr)
-
- Creates a new Ruby string from C string. This is equivalent to
- str_new(ptr, strlen(ptr)).
-
- str_cat(VALUE str, char *ptr, int len)
-
- Appends len bytes data from ptr to the Ruby string.
-
- Array functions
-
- ary_new()
-
- Creates an array with no element.
-
- ary_new2(int len)
-
- Creates an array with no element, with allocating internal buffer
- for len elements.
-
- ary_new3(int n, ...)
-
- Creates an n-elements array from arguments.
-
- ary_new4(int n, VALUE *elts)
-
- Creates an n-elements array from C array.
-
- ary_push(VALUE ary)
- ary_pop(VALUE ary, VALUE val)
- ary_shift(VALUE ary)
- ary_unshift(VALUE ary, VALUE val)
- ary_entry(VALUE ary, int idx)
-
- Array operations. The first argument to each functions must be an
- array. They may dump core if other types given.
-
-2. Extend Ruby with C
-
-原理的にRubyで書けることはCでも書けます.RubyそのものがCで記
-述されているんですから,当然といえば当然なんですけど.ここで
-はRubyの拡張に使うことが多いだろうと予測される機能を中心に紹
-介します.
-
-2.1 Add new features to Ruby
-
-Rubyで提供されている関数を使えばRubyインタプリタに新しい機能
-を追加することができます.Rubyでは以下の機能を追加する関数が
-提供されています.
-
- * クラス,モジュール
- * メソッド,特異メソッドなど
- * 定数
-
-では順に紹介します.
-
-2.1.1 Class/module definition
-
-クラスやモジュールを定義するためには,以下の関数を使います.
-
- VALUE rb_define_class(char *name, VALUE super)
- VALUE rb_define_module(char *name)
-
-これらの関数は新しく定義されたクラスやモジュールを返します.
-メソッドや定数の定義にこれらの値が必要なので,ほとんどの場合
-は戻り値を変数に格納しておく必要があるでしょう.
-
-2.1.2 Method/singleton method definition
-
-メソッドや特異メソッドを定義するには以下の関数を使います.
-
- void rb_define_method(VALUE class, char *name,
- VALUE (*func)(), int argc)
-
- void rb_define_singleton_method(VALUE object, char *name,
- VALUE (*func)(), int argc)
-
-
-念のため説明すると「特異メソッド」とは,その特定のオブジェク
-トに対してだけ有効なメソッドです.RubyではよくSmalltalkにお
-けるクラスメソッドとして,クラスに対する特異メソッドが使われ
-ます.
-
-これらの関数の argcという引数はCの関数へ渡される引数の数(と
-形式)を決めます.argcが正の時は関数に引き渡す引数の数を意味
-します.16個以上の引数は使えません(が,要りませんよね,そん
-なに).
-
-argcが負の時は引数の数ではなく,形式を指定したことになります.
-argcが-1の時は引数を配列に入れて渡されます.argcが-2の時は引
-数はRubyの配列として渡されます.
-
-メソッドを定義する関数はもう二つあります.ひとつはprivateメ
-ソッドを定義する関数で,引数はrb_define_method()と同じです.
-
- void rb_define_private_method(VALUE class, char *name,
- VALUE (*func)(), int argc)
-
-privateメソッドとは関数形式でしか呼び出すことの出来ないメソッ
-ドです.
-
-もうひとつはモジュール関数を定義するものです.モジュール関数
-とはモジュールの特異メソッドであり,同時にprivateメソッドで
-もあるものです.例をあげるとMathモジュールのsqrt()などがあげ
-られます.このメソッドは
-
- Math.sqrt(4)
-
-という形式でも
-
- include Math
- sqrt(4)
-
-という形式でも使えます.モジュール関数を定義する関数は以下の
-通りです.
-
- void rb_define_module_function(VALUE module, char *name,
- VALUE (*func)(), int argc)
-
-関数的メソッド(Kernelモジュールのprivaet method)を定義するた
-めの関数は以下の通りです.
-
- void rb_define_global_function(char *name, VALUE (*func)(), int argc)
-
-
-2.1.3 Constant definition
-
-拡張モジュールが必要な定数はあらかじめ定義しておいた方が良い
-でしょう.定数を定義する関数は二つあります.
-
- void rb_define_const(VALUE class, char *name, VALUE val)
- void rb_define_global_const(char *name, VALUE val)
-
-前者は特定のクラス/モジュールに属する定数を定義するもの,後
-者はグローバルな定数を定義するものです.
-
-2.2 Use Ruby features from C
-
-既に『1.5 Rubyのデータを操作する』で一部紹介したような関数を
-使えば,Rubyの機能を実現している関数を直接呼び出すことが出来
-ます.
-
-# このような関数の一覧表はいまのところありません.ソースを見
-# るしかないですね.
-
-それ以外にもRubyの機能を呼び出す方法はいくつかあります.
-
-2.2.1 Rubyのプログラムをevalする
-
-CからRubyの機能を呼び出すもっとも簡単な方法として,文字列で
-与えられたRubyのプログラムを評価する関数があります.
-
- VALUE rb_eval_string(char *str)
-
-この評価は現在の環境で行われます.つまり,現在のローカル変数
-などを受け継ぎます.
-
-2.2.2 ID or Symbol
-
-Cから文字列を経由せずにRubyのメソッドを呼び出すこともできま
-す.その前に,Rubyインタプリタ内でメソッドや変数名を指定する
-時に使われているIDについて説明しておきましょう.
-
-IDとは変数名,メソッド名を表す整数です.Rubyの中では
-
- :識別子
-
-でアクセスできます.Cからこの整数を得るためには関数
-
- rb_intern(char *name)
-
-を使います.また一文字の演算子はその文字コードがそのままシン
-ボルになっています.
-
-2.2.3 Invoke Ruby method from C
-
-Cから文字列を経由せずにRubyのメソッドを呼び出すためには以下
-の関数を使います.
-
- VALUE rb_funcall(VALUE recv, ID mid, int argc, ...)
-
-この関数はオブジェクトrecvのmidで指定されるメソッドを呼び出
-します.
-
-2.2.4 変数/定数を参照/更新する
-
-Cから関数を使って参照・更新できるのは,クラス定数,インスタ
-ンス変数です.大域変数は一部のものはCの大域変数としてアクセ
-スできます.ローカル変数を参照する方法は公開していません.
-
-オブジェクトのインスタンス変数を参照・更新する関数は以下の通
-りです.
-
- VALUE rb_ivar_get(VALUE obj, ID id)
- VALUE rb_ivar_set(VALUE obj, ID id, VALUE val)
-
-idはrb_intern()で得られるものを使ってください.
-
-クラス定数を参照するには以下の関数を使ってください.
-
- VALUE rb_const_get(VALUE obj, ID id)
-
-クラス定数を新しく定義するためには『2.1.3 定数定義』で紹介さ
-れている関数を使ってください.
-
-3. Informatin sharing between Ruby and C
-
-C言語とRubyの間で情報を共有する方法について解説します.
-
-3.1 Ruby constant that Cから参照できるRubyの定数
-
-Following Ruby constants can be referred from C.
-
- TRUE
- FALSE
-
-Boolean values. FALSE is false in the C also (i.e. 0).
-
- Qnil
-
-Ruby nil in C scope.
-
-3.2 Global variables shared between C and Ruby
-
-CとRubyで大域変数を使って情報を共有できます.共有できる大域
-変数にはいくつかの種類があります.そのなかでもっとも良く使わ
-れると思われるのはrb_define_variable()です.
-
- void rb_define_variable(char *name, VALUE *var)
-
-この関数はRubyとCとで共有する大域変数を定義します.変数名が
-`$'で始まらない時には自動的に追加されます.この変数の値を変
-更すると自動的にRubyの対応する変数の値も変わります.
-
-またRuby側からは更新できない変数もあります.このread onlyの
-変数は以下の関数で定義します.
-
- void rb_define_readonly_variable(char *name, VALUE *var)
-
-これら変数の他にhookをつけた大域変数を定義できます.hook付き
-の大域変数は以下の関数を用いて定義します.hook付き大域変数の
-値の参照や設定はhookで行う必要があります.
-
- void rb_define_hooked_variable(char *name, VALUE *var,
- VALUE (*getter)(), VALUE (*setter)())
-
-この関数はCの関数によってhookのつけられた大域変数を定義しま
-す.変数が参照された時には関数getterが,変数に値がセットされ
-た時には関数setterが呼ばれる.hookを指定しない場合はgetterや
-setterに0を指定します.
-
-# getterもsetterも0ならばrb_define_variable()と同じになる.
-
-それから,Cの関数によって実現されるRubyの大域変数を定義する
-関数があります.
-
- void rb_define_virtual_variable(char *name,
- VALUE (*getter)(), VALUE (*setter)())
-
-この関数によって定義されたRubyの大域変数が参照された時には
-getterが,変数に値がセットされた時にはsetterが呼ばれます.
-
-The prototypes of the getter and setter functions are as following:
-
- (*getter)(ID id, void *data, struct global_entry* entry);
- (*setter)(VALUE val, ID id, void *data, struct global_entry* entry);
-
-3.3 Encapsulate C data into Ruby object
-
-Cの世界で定義されたデータ(構造体)をRubyのオブジェクトとして
-取り扱いたい場合がありえます.このような場合には,Dataという
-RubyオブジェクトにCの構造体(へのポインタ)をくるむことでRuby
-オブジェクトとして取り扱えるようになります.
-
-Dataオブジェクトを生成して構造体をRubyオブジェクトにカプセル
-化するためには,以下のマクロを使います.
-
- Data_Wrap_Struct(class,mark,free,ptr)
-
-このマクロの戻り値は生成されたDataオブジェクトです.
-
-classはこのDataオブジェクトのクラスです.ptrはカプセル化する
-Cの構造体へのポインタです.markはこの構造体がRubyのオブジェ
-クトへの参照がある時に使う関数です.そのような参照を含まない
-時には0を指定します.
-
-# そのような参照は勧められません.
-
-freeはこの構造体がもう不要になった時に呼ばれる関数です.この
-関数がガーベージコレクタから呼ばれます.
-
-Cの構造体の割当とDataオブジェクトの生成を同時に行うマクロと
-して以下のものが提供されています.
-
- Data_Make_Struct(class, type, mark, free, sval)
-
-このマクロの戻り値は生成されたDataオブジェクトです.
-
-class, mark, freeはData_Wrap_Structと同じ働きをします.type
-は割り当てるC構造体の型です.割り当てられた構造体は変数sval
-に代入されます.この変数の型は (type*) である必要があります.
-
-Dataオブジェクトからポインタを取り出すのは以下のマクロを用い
-ます.
-
- Data_Get_Struct(obj, type, sval)
-
-Cの構造体へのポインタは変数svalに代入されます.
-
-これらのDataの使い方はちょっと分かりにくいので,後で説明する
-例題を参照してください.
-
-4.Example - Create dbm module
-
-ここまでの説明でとりあえず拡張モジュールは作れるはずです.
-Rubyのextディレクトリにすでに含まれているdbmモジュールを例に
-して段階的に説明します.
-
-(1) make the directory
-
- % mkdir ext/dbm
-
-Rubyを展開したディレクトリの下,extディレクトリの中に拡張モ
-ジュール用のディレクトリを作ります.名前は適当に選んで構いま
-せん.
-
-(2) create MANIFEST file
-
- % cd ext/dbm
- % touch MANIFEST
-
-拡張モジュールのディレクトリの下にはMANIFESTというファイルが
-必要なので,とりあえず空のファイルを作っておきます.後でこの
-ファイルには必要なファイル一覧が入ることになります.
-
-MANIFESTというファイルは,makeの時にディレクトリが拡張モジュー
-ルを含んでいるかどうか判定するために使われれています.
-
-(3) design the library
-
-まあ,当然なんですけど,どういう機能を実現するかどうかまず設
-計する必要があります.どんなクラスをつくるか,そのクラスには
-どんなメソッドがあるか,クラスが提供する定数などについて設計
-します.dbmクラスについてはext/dbm.docを参照してください.
-
-(4) write C code.
-
-拡張モジュール本体となるC言語のソースを書きます.C言語のソー
-スがひとつの時には「モジュール名.c」を選ぶと良いでしょう.C
-言語のソースが複数の場合には逆に「モジュール名.c」というファ
-イル名は避ける必要があります.オブジェクトファイルとモジュー
-ル生成時に中間的に生成される「モジュール名.o」というファイル
-とが衝突するからです.
-
-Rubyは拡張モジュールをロードする時に「Init_モジュール名」と
-いう関数を自動的に実行します.dbmモジュールの場合「Init_dbm」
-です.この関数の中でクラス,モジュール,メソッド,定数などの
-定義を行います.dbm.cから一部引用します.
-
---
-Init_dbm()
-{
- /* DBMクラスを定義する */
- cDBM = rb_define_class("DBM", cObject);
- /* DBMはEnumerateモジュールをインクルードする */
- rb_include_module(cDBM, mEnumerable);
-
- /* DBMクラスのクラスメソッドopen(): 引数はCの配列で受ける */
- rb_define_singleton_method(cDBM, "open", fdbm_s_open, -1);
-
- /* DBMクラスのメソッドclose(): 引数はなし */
- rb_define_method(cDBM, "close", fdbm_close, 0);
- /* DBMクラスのメソッド[]: 引数は1個 */
- rb_define_method(cDBM, "[]", fdbm_fetch, 1);
- :
-
- /* DBMデータを格納するインスタンス変数名のためのID */
- id_dbm = rb_intern("dbm");
-}
---
-
-DBMモジュールはdbmのデータと対応するオブジェクトになるはずで
-すから,Cの世界のdbmをRubyの世界に取り込む必要があります.
-
-
-dbm.cではData_Make_Structを以下のように使っています.
-
---
-struct dbmdata {
- int di_size;
- DBM *di_dbm;
-};
-
-
-obj = Data_Make_Struct(class,struct dbmdata,0,free_dbm,dbmp);
---
-
-ここではdbmstruct構造体へのポインタをDataにカプセル化してい
-ます.DBM*を直接カプセル化しないのはclose()した時の処理を考
-えてのことです.
-
-Dataオブジェクトからdbmstruct構造体のポインタを取り出すため
-に以下のマクロを使っています.
-
---
-#define GetDBM(obj, dbmp) {\
- Data_Get_Struct(obj, struct dbmdata, dbmp);\
- if (dbmp->di_dbm == 0) closed_dbm();\
-}
---
-
-ちょっと複雑なマクロですが,要するにdbmdata構造体のポインタ
-の取り出しと,closeされているかどうかのチェックをまとめてい
-るだけです.
-
-DBMクラスにはたくさんメソッドがありますが,分類すると3種類の
-引数の受け方があります.ひとつは引数の数が固定のもので,例と
-してはdeleteメソッドがあります.deleteメソッドを実装している
-fdbm_delete()はこのようになっています.
-
---
-static VALUE
-fdbm_delete(obj, keystr)
- VALUE obj, keystr;
-{
- :
-}
---
-
-引数の数が固定のタイプは第1引数がself,第2引数以降がメソッド
-の引数となります.
-
-引数の数が不定のものはCの配列で受けるものとRubyの配列で受け
-るものとがあります.dbmモジュールの中で,Cの配列で受けるもの
-はDBMのクラスメソッドであるopen()です.これを実装している関
-数fdbm_s_open()はこうなっています.
-
---
-static VALUE
-fdbm_s_open(argc, argv, class)
- int argc;
- VALUE *argv;
- VALUE class;
-{
- :
- if (rb_scan_args(argc, argv, "11", &file, &vmode) == 1) {
- mode = 0666; /* default value */
- }
- :
-}
---
-
-このタイプの関数は第1引数が与えられた引数の数,第2引数が与え
-られた引数の入っている配列になります.selfは第3引数として与
-えられます.
-
-この配列で与えられた引数を解析するための関数がopen()でも使わ
-れているrb_scan_args()です.第3引数に指定したフォーマットに
-従い,第4変数以降に指定した変数に値を代入してくれます.この
-フォーマットは,第1文字目が省略できない引数の数,第2文字目が
-省略できる引数の数,第3文字目が対応する相手が無いあまりの引
-数があるかどうかを示す"*"です.2文字目と3文字目は省略できま
-す.dbm.cの例では,フォーマットは"11"ですから,引数は最低1つ
-で,2つまで許されるという意味になります.省略されている時の
-変数の値はnil(C言語のレベルではQnil)になります.
-
-Rubyの配列で引数を受け取るものはindexesがあります.実装はこ
-うです.
-
---
-static VALUE
-fdbm_indexes(obj, args)
- VALUE obj;
- struct RArray *args;
-{
- :
-}
---
-
-第1引数はself,第2引数はRubyの配列です.ここではキャストを減
-らすため struct RArray* で受けていますが,VALUEでも同じこと
-です.
-
-** 注意事項
-
-Rubyと共有はしないがRubyのオブジェクトを格納する可能性のある
-Cの大域変数は以下の関数を使ってRubyインタプリタに変数の存在
-を教えてあげてください.でないとGCでトラブルを起こします.
-
- void rb_global_variable(VALUE *var)
-
-(5) prepare extconf.rb
-
-もしディレクトリに「extconf.rb」というファイルが存在すれば,
-make時に実行されます.なければ適当にMakefileが生成されます.
-
-extconf.rbはモジュールのコンパイルに必要な条件のチェックなど
-を行うことが目的です.extconf.rbの中では以下のRuby関数を使う
-ことが出来ます.
-
- have_library(lib, func): ライブラリの存在チェック
- have_func(func): 関数の存在チェック
- have_header(header): ヘッダファイルの存在チェック
- create_makefile(target): Makefileの生成
-
-以下の変数を使うことができます.
-
- $CFLAGS: コンパイル時に追加的に指定するフラグ(-Iなど)
- $LDFLAGS: リンク時に追加的に指定するフラグ(-Lなど)
-
-モジュールをコンパイルする条件が揃わなず,そのモジュールはコ
-ンパイルしない時にはcreate_makefileを呼ばなければMakefileは
-生成されず,コンパイルも行われません.
-
-(6) prepare depend (optional)
-
-もし,ディレクトリにdependというファイルが存在すれば,
-Makefileが依存関係をチェックしてくれます.
-
- % gcc -MM *.c > depend
-
-などで作ることが出来ます.あって損は無いでしょう.
-
-(7) MANIFESTファイルにファイル名を入れる
-
- % ls > MANIFEST
- % vi MANIFEST
-
-*.o, *~など不必要なファイル以外はMANIFESTに追加しておきます.
-make時にはMANIFESTの内容は参照しませんので,空のままでも問題
-は起きませんが,パッケージングの時に参照することがあるのと,
-必要なファイルを区別できるので,用意しておいた方が良いでしょ
-う.
-
-(8) make
-
-Rubyのディレクトリでmakeを実行するとMakefileを生成からmake,
-必要によってはそのモジュールのRubyへのリンクまで自動的に実行
-してくれます.extconf.rbを書き換えるなどしてMakefileの再生成
-が必要な時はまたRubyディレクトリでmakeしてください.
-
-(9) debug
-
-You may need to debug the module. The modules can be linked
-statically by adding directory name in the ext/Setup file,
-so that you can inspect the module by the debugger.
-
-(10) done, now you have the extension module
-
-後はこっそり使うなり,広く公開するなり,売るなり,ご自由にお
-使いください.Rubyの作者は拡張モジュールに関して一切の権利を
-主張しません.
-
-Appendix A. Rubyのソースコードの分類
-
-Rubyのソースはいくつかに分類することが出来ます.このうちクラ
-スライブラリの部分は基本的に拡張モジュールと同じ作り方になっ
-ています.これらのソースは今までの説明でほとんど理解できると
-思います.
-
-ruby language core
-
- class.c
- error.c
- eval.c
- gc.c
- object.c
- parse.y
- variable.c
-
-utility functions
-
- dln.c
- fnmatch.c
- glob.c
- regex.c
- st.c
- util.c
-
-ruby interpreter implementation
-
- dmyext.c
- inits.c
- main.c
- ruby.c
- version.c
-
-class library
-
- array.c
- bignum.c
- compar.c
- dir.c
- enum.c
- file.c
- hash.c
- io.c
- math.c
- numeric.c
- pack.c
- process.c
- random.c
- range.c
- re.c
- signal.c
- sprintf.c
- string.c
- struct.c
- time.c
-
-Appendix B. 拡張用関数リファレンス
-
-C言語からRubyの機能を利用するAPIは以下の通りである.
-
-** 型
-
- VALUE
-
-Rubyオブジェクトを表現する型.必要に応じてキャストして用いる.
-組み込み型を表現するCの型はruby.hに記述してあるRで始まる構造
-体である.VALUE型をこれらにキャストするためにRで始まる構造体
-名を全て大文字にした名前のマクロが用意されている.
-
-** Variables and constants
-
- Qnil
-
-const: nil object
-
- TRUE
-
-const: TRUE object(default true value)
-
- FALSE
-
-const: FALSE object
-
-** Cデータのカプセル化
-
- Data_Wrap_Struct(VALUE class, void (*mark)(), void (*free)(), void *sval)
-
-Cの任意のポインタをカプセル化したRubyオブジェクトを返す.こ
-のポインタがRubyからアクセスされなくなった時,freeで指定した
-関数が呼ばれる.また,このポインタの指すデータが他のRubyオブ
-ジェクトを指している場合,markに指定する関数でマークする必要
-がある.
-
- Data_Make_Struct(class, type, mark, free, sval)
-
-type型のメモリをmallocし,変数svalに代入した後,それをカプセ
-ル化したデータを返すマクロ.
-
- Data_Get_Struct(data, type, sval)
-
-dataからtype型のポインタを取り出し変数svalに代入するマクロ.
-
-** クラス/モジュール定義
-
- VALUE rb_define_class(char *name, VALUE super)
-
-superのサブクラスとして新しいRubyクラスを定義する.
-
- VALUE rb_define_class_under(VALUE module, char *name, VALUE super)
-
-superのサブクラスとして新しいRubyクラスを定義し,moduleの定
-数として定義する.
-
- VALUE rb_define_module(char *name)
-
-新しいRubyモジュールを定義する.
-
- VALUE rb_define_module_under(VALUE module, char *name, VALUE super)
-
-新しいRubyモジュールを定義し,moduleの定数として定義する.
-
- void rb_include_module(VALUE class, VALUE module)
-
-モジュールをインクルードする.classがすでにmoduleをインクルー
-ドしている時には何もしない(多重インクルードの禁止).
-
- void rb_extend_object(VALUE object, VALUE module)
-
-オブジェクトをモジュール(で定義されているメソッド)で拡張する.
-
-** 大域変数定義
-
- void rb_define_variable(char *name, VALUE *var)
-
-RubyとCとで共有するグローバル変数を定義する.変数名が`$'で始
-まらない時には自動的に追加される.nameとしてRubyの識別子とし
-て許されない文字(例えば` ')を含む場合にはRubyプログラムから
-は見えなくなる.
-
- void rb_define_readonly_variable(char *name, VALUE *var)
-
-RubyとCとで共有するread onlyのグローバル変数を定義する.read
-onlyであること以外はrb_define_variable()と同じ.
-
- void rb_define_virtual_variable(char *name,
- VALUE (*getter)(), VALUE (*setter)())
-
-関数によって実現されるRuby変数を定義する.変数が参照された時
-にはgetterが,変数に値がセットされた時にはsetterが呼ばれる.
-
- void rb_define_hooked_variable(char *name, VALUE *var,
- VALUE (*getter)(), VALUE (*setter)())
-
-関数によってhookのつけられたグローバル変数を定義する.変数が
-参照された時にはgetterが,関数に値がセットされた時にはsetter
-が呼ばれる.getterやsetterに0を指定した時にはhookを指定しな
-いのと同じ事になる.
-
- void rb_global_variable(VALUE *var)
-
-GCのため,Rubyプログラムからはアクセスされないが, Rubyオブジェ
-クトを含む大域変数をマークする.
-
-** クラス定数
-
- void rb_define_const(VALUE class, char *name, VALUE val)
-
-クラス定数を定義する.
-
- void rb_define_global_const(char *name, VALUE val)
-
-大域定数を定義する.
-
- rb_define_const(cKernal, name, val)
-
-と同じ意味.
-
-** メソッド定義
-
- rb_define_method(VALUE class, char *name, VALUE (*func)(), int argc)
-
-メソッドを定義する.argcはselfを除く引数の数.argcが-1の時,
-関数には引数の数(selfを含まない)を第1引数, 引数の配列を第2引
-数とする形式で与えられる(第3引数はself).argcが-2の時, 第1引
-数がself, 第2引数がargs(argsは引数を含むRubyの配列)という形
-式で与えられる.
-
- rb_define_private_method(VALUE class, char *name, VALUE (*func)(), int argc)
-
-privateメソッドを定義する.引数はrb_define_method()と同じ.
-
- rb_define_singleton_method(VALUE class, char *name, VALUE (*func)(), int argc)
-
-特異メソッドを定義する.引数はrb_define_method()と同じ.
-
- rb_scan_args(int atgc, VALUE *argv, char *fmt, ...)
-
-argc,argv形式で与えられた引数を分解する.fmtは必須引数の数,
-付加引数の数, 残りの引数があるかを指定する文字列で, "数字数
-字*"という形式である. 2 番目の数字と"*"はそれぞれ省略可能で
-ある.必須引数が一つもない場合は0を指定する.第3引数以降は変
-数へのポインタで, 該当する要素がその変数に格納される.付加引
-数に対応する引数が与えられていない場合は変数にQnilが代入され
-る.
-
-** Rubyメソッド呼び出し
-
- VALUE rb_funcall(VALUE recv, ID mid, int narg, ...)
-
-メソッド呼び出し.文字列からmidを得るためにはrb_intern()を使う.
-
- VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv)
-
-メソッド呼び出し.引数をargc,argv形式で渡す.
-
- VALUE rb_eval_string(char *str)
-
-文字列をRubyとスクリプトしてコンパイル・実行する.
-
- ID rb_intern(char *name)
-
-文字列に対応するIDを返す.
-
- char *rb_id2name(ID id)
-
-IDに対応する文字列を返す(デバッグ用).
-
- char *rb_class2name(VALUE class)
-
-classの名前を返す(デバッグ用).classが名前を持たない時には,
-祖先を遡って名前を持つクラスの名前を返す.
-
-** インスタンス変数
-
- VALUE rb_iv_get(VALUE obj, char *name)
-
-objのインスタンス変数の値を得る.`@'で始まらないインスタンス
-変数は Rubyプログラムからアクセスできない「隠れた」インスタ
-ンス変数になる.
-
- VALUE rb_iv_set(VALUE obj, char *name, VALUE val)
-
-objのインスタンス変数をvalにセットする.
-
-** 制御構造
-
- VALUE rb_iterate(VALUE (*func1)(), void *arg1, VALUE (*func2)(), void *arg2)
-
-func2をブロックとして設定し, func1をイテレータとして呼ぶ.
-func1には arg1が引数として渡され, func2には第1引数にイテレー
-タから与えられた値, 第2引数にarg2が渡される.
-
- VALUE rb_yield(VALUE val)
-
-valを値としてイテレータブロックを呼び出す.
-
- VALUE rb_rescue(VALUE (*func1)(), void *arg1, VALUE (*func2)(), void *arg2)
-
-関数func1をarg1を引数に呼び出す.func1の実行中に例外が発生し
-た時には func2をarg2を引数として呼ぶ.戻り値は例外が発生しな
-かった時はfunc1の戻り値, 例外が発生した時にはfunc2の戻り値で
-ある.
-
- VALUE rb_ensure(VALUE (*func1)(), void *arg1, void (*func2)(), void *arg2)
-
-関数func1をarg1を引数として実行し, 実行終了後(たとえ例外が発
-生しても) func2をarg2を引数として実行する.戻り値はfunc1の戻
-り値である(例外が発生した時は戻らない).
-
-** 例外・エラー
-
- void Warning(char *fmt, ...)
-
-verbose時に標準エラー出力に警告情報を表示する.引数はprintf()と同じ.
-
- void Fail(char *fmt, ...)
-
-例外を発生させる.引数はprintf()と同じ.
-
- void Fatal(char *fmt, ...)
-
-致命的例外を発生させる.通常の例外処理は行なわれず, インター
-プリタが終了する(ただしensureで指定されたコードは終了前に実
-行される).
-
- void Bug(char *fmt, ...)
-
-インタープリタなどプログラムのバグでしか発生するはずのない状
-況の時呼ぶ.インタープリタはコアダンプし直ちに終了する.例外
-処理は一切行なわれない.
-
-** Rubyの初期化・実行
-
-Rubyをアプリケーションに埋め込む場合には以下のインタフェース
-を使う.通常の拡張モジュールには必要ない.
-
- void ruby_init(int argc, char **argv, char **envp)
-
-Rubyインタプリタの初期化を行なう.
-
- void ruby_run()
-
-Rubyインタプリタを実行する.
-
- void ruby_script(char *name)
-
-Rubyのスクリプト名($0)を設定する.
-
-
-Appendix B. extconf.rbで使える関数たち
-
-extconf.rbの中では利用可能なコンパイル条件チェックの関数は以
-下の通りである.
-
- have_library(lib, func)
-
-関数funcを定義しているライブラリlibの存在をチェックする.ラ
-イブラリが存在する時,TRUEを返す.
-
- have_func(func)
-
-関数funcの存在をチェックする.funcが標準ではリンクされないラ
-イブラリ内のものである時には先にhave_libraryでそのライブラリ
-をチェックしておく事.関数が存在する時TRUEを返す.
-
- have_header(header)
-
-ヘッダファイルの存在をチェックする.ヘッダファイルが存在する
-時TRUEを返す.
-
- create_makefile(target)
-
-拡張モジュール用のMakefileを生成する.この関数を呼ばなければ
-そのモジュールはコンパイルされない.targetはモジュール名を表
-す.
-
-/*
- * Local variables:
- * fill-column: 60
- * end:
- */