Rebol 3扩展和“处理”

时间:2014-05-26 22:59:53

标签: c memory-management handle rebol rebol3

在为Rebol3编写C扩展时,我需要向Rebol传递指向我从本机函数获取的对象的指针。

  1. The documentation says有一种特殊的数据类型:" handle:一种存储代码和数据指针的方法" 。但我想举个例子!

  2. 我希望在此句柄未绑定时调用本机析构函数。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

要将指针存储为Rebol句柄,您可以执行以下操作:

RXIARG value;
value.addr = original_pointer;
RL_SET_FIELD ( obj, RL_MAP_WORD ( (REBYTE *) "handle-attribute" ), value, RXT_HANDLE );

在此示例中,我将handle-attribute对象的obj属性设置为值original_pointer

稍后您可以检索句柄的值,如下所示:

int dtype = 0;
RXIARG value;

dtype = RL_GET_FIELD ( obj, RL_MAP_WORD ( (REBYTE *) "handle-attribute" ), &value );

switch ( dtype ) {
  case RXT_NONE:
    printf ( "Invalid handle: none\n" );
    break;

  case RXT_HANDLE:
    original_pointer = value.addr;
    break;

  default:
    printf ( "Invalid handle: none\n" );
}

我通常使用对象来存储句柄,因此可以通过这种方式从Rebol命令框中检索示例中的obj对象:

REBSER *obj;
obj = RXA_OBJECT ( frm, 1 );

其中frm是Rebol命令帧,1是传递给命令的参数列表中对象的位置。

如果要使用块来存储句柄,用于存储/检索块中值的宏是RL_SET_VALUERL_GET_VALUE来代替RL_*_FIELD,但是部分在哪里你将指针复制到value.addr并没有改变。

您还可以通过使用以下说明结束命令来调用扩展程序命令来返回句柄:

RXA_HANDLE ( frm, 1 ) = original_pointer;
RXA_TYPE ( frm, 1 ) = RXT_HANDLE;
return RXR_VALUE;

就你的第二个问题而言,我认为现在无法知道句柄何时被解除绑定或被垃圾收集以触发本机析构函数。