Skip to content

Commit afea246

Browse files
committed
Merge pull request atomvm#493 from bettio/improve-external-term-api
Improve externalterm API These changes are made under both the "Apache 2.0" and the "GNU Lesser General Public License 2.1 or later" license terms (dual license). SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later
2 parents 512a1b2 + bcdcc99 commit afea246

File tree

3 files changed

+21
-11
lines changed

3 files changed

+21
-11
lines changed

src/libAtomVM/externalterm.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
// buffer). The parse_external_terms function does NOT perform range checking, and MUST
6262
// therefore always be preceeded by a call to calculate_heap_usage.
6363

64-
static term parse_external_terms(const uint8_t *external_term_buf, int *eterm_size, Context *ctx, int copy);
64+
static term parse_external_terms(const uint8_t *external_term_buf, int *eterm_size, Context *ctx, bool copy);
6565
static int calculate_heap_usage(const uint8_t *external_term_buf, size_t remaining, int *eterm_size, bool copy, Context *ctx);
6666
static size_t compute_external_size(Context *ctx, term t);
6767
static int externalterm_from_term(Context *ctx, uint8_t **buf, size_t *len, term t);
@@ -71,12 +71,14 @@ static int serialize_term(Context *ctx, uint8_t *buf, term t);
7171
* @brief
7272
* @param external_term buffer containing external term
7373
* @param ctx current context in which terms may be stored
74-
* @param use_heap_fragment whether to store parsed terms in a heap fragment. If 0, terms
74+
* @param opts additional opts, such as ExternalTermToHeapFragment for storing parsed
75+
* terms in a heap fragment.
7576
* are stored in the context heap.
7677
* @param bytes_read the number of bytes read off external_term in order to yield a term
7778
* @return the parsed term
7879
*/
79-
static term externalterm_to_term_internal(const void *external_term, size_t size, Context *ctx, int use_heap_fragment, size_t *bytes_read, bool copy)
80+
static term externalterm_to_term_internal(const void *external_term, size_t size, Context *ctx,
81+
ExternalTermOpts opts, size_t *bytes_read, bool copy)
8082
{
8183
const uint8_t *external_term_buf = (const uint8_t *) external_term;
8284

@@ -94,7 +96,7 @@ static term externalterm_to_term_internal(const void *external_term, size_t size
9496
return term_invalid_term();
9597
}
9698

97-
if (use_heap_fragment) {
99+
if (opts & ExternalTermToHeapFragment) {
98100
struct ListHead *heap_fragment = malloc(heap_usage * sizeof(term) + sizeof(struct ListHead));
99101
if (IS_NULL_PTR(heap_fragment)) {
100102
return term_invalid_term();
@@ -107,7 +109,7 @@ static term externalterm_to_term_internal(const void *external_term, size_t size
107109
// so all existing functions can be used on the heap fragment without any change.
108110
term *main_heap = ctx->heap_ptr;
109111
ctx->heap_ptr = external_term_heap;
110-
term result = parse_external_terms(external_term_buf + 1, &eterm_size, ctx, 0);
112+
term result = parse_external_terms(external_term_buf + 1, &eterm_size, ctx, false);
111113
*bytes_read = eterm_size + 1;
112114
ctx->heap_ptr = main_heap;
113115

@@ -117,16 +119,16 @@ static term externalterm_to_term_internal(const void *external_term, size_t size
117119
fprintf(stderr, "Unable to ensure %i free words in heap\n", eterm_size);
118120
return term_invalid_term();
119121
}
120-
term result = parse_external_terms(external_term_buf + 1, &eterm_size, ctx, 1);
122+
term result = parse_external_terms(external_term_buf + 1, &eterm_size, ctx, true);
121123
*bytes_read = eterm_size + 1;
122124
return result;
123125
}
124126
}
125127

126-
term externalterm_to_term(const void *external_term, size_t size, Context *ctx, int use_heap_fragment)
128+
term externalterm_to_term(const void *external_term, size_t size, Context *ctx, ExternalTermOpts opts)
127129
{
128130
size_t bytes_read = 0;
129-
return externalterm_to_term_internal(external_term, size, ctx, use_heap_fragment, &bytes_read, false);
131+
return externalterm_to_term_internal(external_term, size, ctx, opts, &bytes_read, false);
130132
}
131133

132134
enum ExternalTermResult externalterm_from_binary(Context *ctx, term *dst, term binary, size_t *bytes_read)
@@ -326,7 +328,7 @@ static int serialize_term(Context *ctx, uint8_t *buf, term t)
326328
}
327329
}
328330

329-
static term parse_external_terms(const uint8_t *external_term_buf, int *eterm_size, Context *ctx, int copy)
331+
static term parse_external_terms(const uint8_t *external_term_buf, int *eterm_size, Context *ctx, bool copy)
330332
{
331333
switch (external_term_buf[0]) {
332334
case NEW_FLOAT_EXT: {

src/libAtomVM/externalterm.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ enum ExternalTermResult
4242
EXTERNAL_TERM_HEAP_ALLOC = 3
4343
};
4444

45+
typedef enum
46+
{
47+
ExternalTermNoOpts = 0,
48+
ExternalTermToHeapFragment = 1
49+
} ExternalTermOpts;
50+
4551
/**
4652
* @brief Gets a term from external term data.
4753
*
@@ -54,7 +60,8 @@ enum ExternalTermResult
5460
* store the generated terms.
5561
* @returns a term.
5662
*/
57-
term externalterm_to_term(const void *external_term, size_t size, Context *ctx, int use_heap_fragment);
63+
term externalterm_to_term(
64+
const void *external_term, size_t size, Context *ctx, ExternalTermOpts opts);
5865

5966
/**
6067
* @brief Create a term from a binary.

src/libAtomVM/module.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,8 @@ static struct LiteralEntry *module_build_literals_table(const void *literalsBuf)
368368

369369
term module_load_literal(Module *mod, int index, Context *ctx)
370370
{
371-
term t = externalterm_to_term(mod->literals_table[index].data, mod->literals_table[index].size, ctx, 1);
371+
term t = externalterm_to_term(mod->literals_table[index].data, mod->literals_table[index].size,
372+
ctx, ExternalTermToHeapFragment);
372373
if (term_is_invalid_term(t)) {
373374
fprintf(stderr, "Invalid term reading literals_table[%i] from module\n", index);
374375
AVM_ABORT();

0 commit comments

Comments
 (0)