Skip to content

duk_get_heapptr()

1.1.0 stack heap ptr borrowed

プロトタイプ

c
void *duk_get_heapptr(duk_context *ctx, duk_idx_t idx);

スタック

| ... | val | ... |

要約

idx で Duktape ヒープに割り当てられた値(オブジェクト、バッファ、文字列)への参照 を借用した void * を取得します。インデックスが無効であるか、対象の値がヒープに割り当てられていない場合は NULL を返します。返されたポインタは解釈したり再参照したりしてはならないが、 duk_push_heapptr() は、後で元の値をバリュースタックにプッシュするために使うことができます。

返された void ポインタは、ガベージコレクションの観点から見て、元の値に到達可能な間だけ有効です。そうでない場合、duk_push_heapptr() を使用することはメモリ上安全ではありません。

c
duk_context *new_ctx;
void *ptr;

duk_eval_string(ctx, "({ foo: 'bar' })");
ptr = duk_get_heapptr(ctx, -1);

/* The original value must remain reachable for Duktape up to a future
 * duk_push_heapptr().  Here we just write it to the global object, but
 * it could also be a value stack somewhere, a stash object, etc.
 */
duk_put_global_string(ctx, "ref");

/* Later, assuming the original value has been reachable all the way
 * to here:
 */

duk_push_heapptr(ctx, ptr);
duk_get_prop_string(ctx, -1, "foo");
printf("obj.foo: %s\n", duk_safe_to_string(ctx, -1));  /* prints 'bar' */

参照

duk_require_heapptr duk_push_heapptr duk_get_heapptr_default