openhsp-gc
ver.2009060601
配布ページ: http://www.fujidig.com/archives/#openhsp-gc
openhsp-gc は OpenHSP にモジュール変数の GC (Garbage Collection) を追加するフォークです。
OpenHSP:
たとえば、次のようなスクリプトを動かすことができます。
;---------------------------------------------------------------------
#module mod_human m_name
#modinit str name
m_name = name
return
#defcfunc new_human str name, local instance
newmod instance, mod_human, name
return instance
#modcfunc human_get_name
return m_name
#global
mes human_get_name(new_human("Taro"))
;---------------------------------------------------------------------
GC のアルゴリズムは mark & sweep です。
HSP の静的変数とスタックをルートとして mark しています。
struct.cpp で Ruby の gc.c のコードの一部を流用しています。
Ruby:
= 変更点 =
* delmod の動作→empty struct (NULL) を変数に代入する
* 代入を行うと FLEXVAL_TYPE_CLONE になって varuse() が 2 を返すという仕様を削除
* return で struct 型を返せるように
* #modfunc の thismod 引数は変数を受け付けるのではなく struct 型の値を受け付けるように変更
* それによって thismod は変数として使えなくなる
* MPTYPE_STRUCT でパラメータタイプ struct を実装
* struct 型の ==, != 演算を追加。同一のオブジェクトであるかの比較
* #modcfunc プリプロセッサ命令を追加
* hspda の vload, vsave を新しい struct 型に対応
= デストラクタについて =
デストラクタは効率的な実装が難しそうなので、実装していません。
デストラクタ実行時にはオブジェクトが参照しているオブジェクトも生きていなきゃいけないので...。でも、デストラクタを使いたい場面って DLL から取得したリソースのハンドルをラップしたオブジェクトでリソースを開放したいときぐらいだと思うので、struct 型以外のメンバーさえ参照できればいいような気もします。それなら実装は難しくないと思います。
また、もし実装することになってもオブジェクトへの参照がなくなってすぐに実行はされず、 GC のタイミングで実行されるようになります。
C++ のデストラクタのようなものではなく、Java のファイナライザのようなものをイメージしています。
= vload, vsave =
hspda の vload, vsave を新しい struct 型に対応するために HVF のフォーマットを変更しています。
HSP3VARFILEDATA に struct 値や、モジュール、メンバーの情報を置いて、それらをデータ内で参照するときに varinfo のインデックスを使うようにしています。予約されていた opt メンバを flags メンバに変更して、データのタイプの判別に使っています。
互換性のために以下の点を守っています。
* 3.1 の hspda でセーブされた struct 型変数の格納フォーマットも読み込めるように
* 新しい hspda で保存したデータは struct 型の変数以外は 3.1 の hspda でも読み込めるように
= ライセンス =
ライセンスは OpenHSP に同じとします。 (OpenHSP のライセンスは License.txt / License_j.txt を参照)
= 更新履歴 =
2009060601 (base: r.290)
* OpenHSP r.290 までの更新をマージ
2009022501 (base: r.208)
* [hsp-dev:01793] で公開したバージョン
* hspda の vload, vsave を新しい struct 型に対応
* STRUCT の定義を hspvar_core.h に移動
* HSP スタック、静的変数以外のルートからの参照をつけれるように STRUCT_REF, add_struct_ref, remove_struct_ref を追加
* vload, vsave のために HSPEXINFO にメンバを追加
* struct 型の ==, != 演算を追加。同一のオブジェクトであるかの比較
* #modcfunc プリプロセッサ命令を追加
2009022201 (base: r.208)
* [hsp-dev:01791] で公開したバージョン
* return で戻り値をスタックに積む必要はなさそうなのでやめた
* デバッグウィンドウでの表示にモジュール名を追加
2009022103 (base: r.208)
* mark で再帰が深くなる対策を入れた。(これで長いリンクトリストを
作っても落ちなくなった)
2009022102 (base: r.208)
* reffunc_custom でスタックをポップしてから既に死んだスタックのポ
インタを使っていたのを修正(戻り値のポインタには mpval を使うよ
うに)
* code_expandstruct で引数をセットアップ中に GC したら落ちるのを修
正。(parameters buffer に何番目の引数までセットアップしたかを記
録するように)
2009022101 (base: r.208)
* 最初のバージョン
-----
fujidig / FUJI
fuji.rosen@gmail.com
http://www.fujidig.com/