2009年01月14日
Alchemy でポインタを扱う
Alchemy は malloc にも対応している。malloc で確保したメモリのポインタを AS3 側に伝えるのも簡単だ。
C 側の実装例
C で malloc した場所を AS3 に渡してみる。
static AS3_Val myAlloc(void* self, AS3_Val args) { // 確保した値の初期値を受け取る int v; AS3_ArrayValue(args, "IntType", &v); // malloc でメモリ確保 int* p = (int*)malloc(sizeof(int)); // 確保したメモリに初期値を代入する *p = v; // ポインタを返す return AS3_Ptr((void*)p); } static AS3_Val myGetPtr(void* self, AS3_Val args) { // ポインタを受け取る int* p; AS3_ArrayValue(args, "PtrType", &p); // ポインタが指す値を返す return AS3_Int(*p); }
AS3_Ptr, PtrType がキーワード。
ActionScript3 側の実装例
ポインタは uint で受け取れますよ。
var lib:CLibInit = new CLibInit(); var obj:Object = lib.init(); // メモリを確保する var p:uint = obj.myAlloc(9999); // ポインタを渡して中身を受け取る var v:int = obj.getPtr(p);
ヒープの実装方法は?
AS3 にはご存知の通りポインタの概念はないんだけど、どのように実現されてるんだろう。また、C 側では malloc で確保したメモリがヒープ上にあるように見えるはずなんだけど、これはいったいどのように実現されているんだろう。
答えは簡単。ByteArray でヒープがエミュレートされている。ポインタの値はヒープのオフセット+ByteArray の先頭から何バイト目かの値になるわけだ。
AS3 側から ByteArray でエミュレートされたメモリを直接参照するには、GLEByteArrayProvider.get()
を実行すればよい。詳しくは Alchemy:Documentation:Developing with Alchemy:AS3 API - Adobe Labs にて。