mirror of https://github.com/svaarala/duktape.git
Sami Vaarala
10 years ago
1 changed files with 65 additions and 0 deletions
@ -0,0 +1,65 @@ |
|||
name: duk_steal_buffer |
|||
|
|||
proto: | |
|||
void *duk_steal_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size); |
|||
|
|||
stack: | |
|||
[ ... val! ... ] |
|||
|
|||
summary: | |
|||
<p>Steal the current allocation of the dynamic buffer at <code>index</code>. |
|||
In concrete terms, Duktape forgets the previous allocation and resets the |
|||
buffer to zero size (and NULL data pointer). Pointer to the previous |
|||
allocation is returned and previous allocation length is written to |
|||
<code>out_size</code> if non-NULL. The dynamic buffer itself remains on the |
|||
value stack and can be reused. The caller becomes responsible for freeing the |
|||
previous allocation using <code><a href="#duk_free">duk_free()</a></code>, |
|||
otherwise a memory leak happens. Duktape won't free the previous allocation |
|||
through garbage collection or even when the Duktape heap is destroyed.</p> |
|||
|
|||
<p>This API call is useful when a dynamic buffer is used as a safe temporary |
|||
in a buffer manipulation algorithm (it's automatically memory managed in case |
|||
an error occurs). At the end of such an algorithm, the caller may want to |
|||
steal the buffer so that it won't be freed by Duktape garbage collection even |
|||
when the dynamic buffer itself is freed.</p> |
|||
|
|||
example: | |
|||
duk_size_t sz; |
|||
void *ptr; |
|||
|
|||
ptr = duk_push_dynamic_buffer(ctx, 256); /* initial size */ |
|||
for (;;) { |
|||
/* Error prone algorithm, resizes and appends to buffer. If an error |
|||
* occurs, the dynamic buffer is automatically freed. |
|||
*/ |
|||
|
|||
/* ... */ |
|||
duk_resize_buffer(ctx, -1, new_size); |
|||
} |
|||
|
|||
/* Algorithm is done, we want to own the buffer. The duk_steal_buffer() |
|||
* API call returns the final data pointer (in case it has been changed |
|||
* by resizes etc). |
|||
*/ |
|||
ptr = duk_steal_buffer(ctx, -1, &sz); |
|||
|
|||
/* At this point the dynamic buffer is still on the value stack. |
|||
* Its size is zero and the current allocation is empty. Here we |
|||
* just pop it as unneeded. |
|||
*/ |
|||
duk_pop(ctx); |
|||
|
|||
/* ... */ |
|||
|
|||
/* Eventually, when done with the buffer, you must free it yourself, |
|||
* otherwise memory will be leaked. Duktape won't free the allocation |
|||
* automatically, even at Duktape heap destruction. |
|||
*/ |
|||
duk_free(ctx, ptr); |
|||
|
|||
tags: |
|||
- stack |
|||
- buffer |
|||
- experimental |
|||
|
|||
introduced: 1.3.0 |
Loading…
Reference in new issue