Github User Fetcher 1.0.0
C Application with Server and GUI
Loading...
Searching...
No Matches
duk_hbuffer_alloc.c File Reference
#include "duk_internal.h"

Go to the source code of this file.

Functions

DUK_INTERNAL duk_hbufferduk_hbuffer_alloc (duk_heap *heap, duk_size_t size, duk_small_uint_t flags, void **out_bufdata)
 
DUK_INTERNAL void * duk_hbuffer_get_dynalloc_ptr (duk_heap *heap, void *ud)
 

Function Documentation

◆ duk_hbuffer_alloc()

DUK_INTERNAL duk_hbuffer * duk_hbuffer_alloc ( duk_heap * heap,
duk_size_t size,
duk_small_uint_t flags,
void ** out_bufdata )

Definition at line 11 of file duktape-1.5.2/src-separate/duk_hbuffer_alloc.c.

11 {
12 duk_hbuffer *res = NULL;
13 duk_size_t header_size;
14 duk_size_t alloc_size;
15
16 DUK_ASSERT(heap != NULL);
17 DUK_ASSERT(out_bufdata != NULL);
18
19 DUK_DDD(DUK_DDDPRINT("allocate hbuffer"));
20
21 /* Size sanity check. Should not be necessary because caller is
22 * required to check this, but we don't want to cause a segfault
23 * if the size wraps either in duk_size_t computation or when
24 * storing the size in a 16-bit field.
25 */
26 if (size > DUK_HBUFFER_MAX_BYTELEN) {
27 DUK_D(DUK_DPRINT("hbuffer alloc failed: size too large: %ld", (long) size));
28 return NULL; /* no need to write 'out_bufdata' */
29 }
30
31 if (flags & DUK_BUF_FLAG_EXTERNAL) {
32 header_size = sizeof(duk_hbuffer_external);
33 alloc_size = sizeof(duk_hbuffer_external);
34 } else if (flags & DUK_BUF_FLAG_DYNAMIC) {
35 header_size = sizeof(duk_hbuffer_dynamic);
36 alloc_size = sizeof(duk_hbuffer_dynamic);
37 } else {
38 header_size = sizeof(duk_hbuffer_fixed);
39 alloc_size = sizeof(duk_hbuffer_fixed) + size;
40 DUK_ASSERT(alloc_size >= sizeof(duk_hbuffer_fixed)); /* no wrapping */
41 }
42
43 res = (duk_hbuffer *) DUK_ALLOC(heap, alloc_size);
44 if (!res) {
45 goto error;
46 }
47
48 /* zero everything unless requested not to do so */
49#if defined(DUK_USE_ZERO_BUFFER_DATA)
50 DUK_MEMZERO((void *) res,
51 (flags & DUK_BUF_FLAG_NOZERO) ? header_size : alloc_size);
52#else
53 DUK_MEMZERO((void *) res, header_size);
54#endif
55
56 if (flags & DUK_BUF_FLAG_EXTERNAL) {
58 h = (duk_hbuffer_external *) res;
59 DUK_UNREF(h);
60 *out_bufdata = NULL;
61#if defined(DUK_USE_EXPLICIT_NULL_INIT)
62#if defined(DUK_USE_HEAPPTR16)
63/* the compressed pointer is zeroed which maps to NULL, so nothing to do. */
64#else
66#endif
67#endif
69 } else if (flags & DUK_BUF_FLAG_DYNAMIC) {
71 void *ptr;
72
73 if (size > 0) {
74 DUK_ASSERT(!(flags & DUK_BUF_FLAG_EXTERNAL)); /* alloc external with size zero */
75 DUK_DDD(DUK_DDDPRINT("dynamic buffer with nonzero size, alloc actual buffer"));
76#ifdef DUK_USE_ZERO_BUFFER_DATA
77 ptr = DUK_ALLOC_ZEROED(heap, size);
78#else
79 ptr = DUK_ALLOC(heap, size);
80#endif
81 if (!ptr) {
82 /* Because size > 0, NULL check is correct */
83 goto error;
84 }
85 *out_bufdata = ptr;
86
88 } else {
89 *out_bufdata = NULL;
90#if defined(DUK_USE_EXPLICIT_NULL_INIT)
91#if defined(DUK_USE_HEAPPTR16)
92/* the compressed pointer is zeroed which maps to NULL, so nothing to do. */
93#else
95#endif
96#endif
98 }
99 } else {
100 *out_bufdata = (void *) ((duk_hbuffer_fixed *) res + 1);
101 }
102
103 DUK_HBUFFER_SET_SIZE(res, size);
104
106 if (flags & DUK_BUF_FLAG_DYNAMIC) {
108 if (flags & DUK_BUF_FLAG_EXTERNAL) {
110 }
111 } else {
113 }
115
116 DUK_DDD(DUK_DDDPRINT("allocated hbuffer: %p", (void *) res));
117 return res;
118
119 error:
120 DUK_DD(DUK_DDPRINT("hbuffer allocation failed"));
121
122 DUK_FREE(heap, res);
123 return NULL; /* no need to write 'out_bufdata' */
124}
#define DUK_MEMZERO(p, n)
#define DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(heap, x)
#define DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, x)
#define DUK_HBUFFER_SET_EXTERNAL(x)
#define DUK_ALLOC(heap, size)
struct duk_hbuffer_dynamic duk_hbuffer_dynamic
#define DUK_HBUFFER_MAX_BYTELEN
#define DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, hdr)
#define DUK_FREE(heap, ptr)
#define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap, x, v)
struct duk_hbuffer_external duk_hbuffer_external
#define DUK_HEAPHDR_SET_TYPE(h, val)
struct duk_hbuffer_fixed duk_hbuffer_fixed
#define DUK_ALLOC_ZEROED(heap, size)
#define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(heap, x, v)
#define DUK_HBUFFER_SET_SIZE(x, v)
#define DUK_HBUFFER_SET_DYNAMIC(x)
#define DUK_BUF_FLAG_NOZERO
#define DUK_BUF_FLAG_DYNAMIC
#define DUK_BUF_FLAG_EXTERNAL
#define NULL
Definition gmacros.h:924
static void error(LoadState *S, const char *why)

References DUK_ALLOC, DUK_ALLOC_ZEROED, DUK_ASSERT, DUK_BUF_FLAG_DYNAMIC, DUK_BUF_FLAG_EXTERNAL, DUK_BUF_FLAG_NOZERO, DUK_D, DUK_DD, DUK_DDD, DUK_DDDPRINT, DUK_DDPRINT, DUK_DPRINT, DUK_FREE, DUK_HBUFFER_DYNAMIC_GET_DATA_PTR, DUK_HBUFFER_DYNAMIC_SET_DATA_PTR, DUK_HBUFFER_EXTERNAL_GET_DATA_PTR, DUK_HBUFFER_EXTERNAL_SET_DATA_PTR, DUK_HBUFFER_MAX_BYTELEN, DUK_HBUFFER_SET_DYNAMIC, DUK_HBUFFER_SET_EXTERNAL, DUK_HBUFFER_SET_SIZE, DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED, DUK_HEAPHDR_SET_TYPE, DUK_HTYPE_BUFFER, DUK_MEMZERO, DUK_UNREF, error(), duk_hbuffer::hdr, and NULL.

◆ duk_hbuffer_get_dynalloc_ptr()

DUK_INTERNAL void * duk_hbuffer_get_dynalloc_ptr ( duk_heap * heap,
void * ud )

Definition at line 128 of file duktape-1.5.2/src-separate/duk_hbuffer_alloc.c.

128 {
130 DUK_UNREF(heap);
131 return (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, buf);
132}

References DUK_HBUFFER_DYNAMIC_GET_DATA_PTR, and DUK_UNREF.