Skip to content

Commit 72a2ccd

Browse files
committed
Add support for missing OTP-25 opcodes
Add the following three OTP-25 opcodes: - bs_create_bin/7 - call_fun2/3 - badrecord/1 The following opcode isn't part of this commit: - nif_start/0 But we probably do not need it. Also add the following two opcodes to extend support of bs_create_bin: - bs_init_writable - bs_private_append This adds (limited) support to binary comprehensions. Unaligned binaries are still not supported. Signed-off-by: Paul Guyot <[email protected]>
1 parent ca0b613 commit 72a2ccd

File tree

9 files changed

+563
-107
lines changed

9 files changed

+563
-107
lines changed

src/libAtomVM/defaultatoms.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,18 @@ static const char *const timeout_value_atom = "\xD" "timeout_value";
103103
static const char *const machine_atom = "\x7" "machine";
104104
static const char *const avm_floatsize_atom = "\xD" "avm_floatsize";
105105

106+
static const char *const append_atom = "\x6" "append";
107+
static const char *const private_append_atom = "\xD" "private_append";
108+
static const char *const binary_atom = "\x6" "binary";
109+
static const char *const integer_atom = "\x7" "integer";
110+
static const char *const little_atom = "\x6" "little";
111+
static const char *const native_atom = "\x6" "native";
112+
static const char *const string_atom = "\x6" "string";
113+
static const char *const utf8_atom = "\x4" "utf8";
114+
static const char *const utf16_atom = "\x5" "utf16";
115+
static const char *const utf32_atom = "\x5" "utf32";
116+
static const char *const badrecord_atom = "\x9" "badrecord";
117+
106118
void defaultatoms_init(GlobalContext *glb)
107119
{
108120
int ok = 1;
@@ -190,6 +202,18 @@ void defaultatoms_init(GlobalContext *glb)
190202
ok &= globalcontext_insert_atom(glb, machine_atom) == MACHINE_ATOM_INDEX;
191203
ok &= globalcontext_insert_atom(glb, avm_floatsize_atom) == AVM_FLOATSIZE_ATOM_INDEX;
192204

205+
ok &= globalcontext_insert_atom(glb, append_atom) == APPEND_ATOM_INDEX;
206+
ok &= globalcontext_insert_atom(glb, private_append_atom) == PRIVATE_APPEND_ATOM_INDEX;
207+
ok &= globalcontext_insert_atom(glb, binary_atom) == BINARY_ATOM_INDEX;
208+
ok &= globalcontext_insert_atom(glb, integer_atom) == INTEGER_ATOM_INDEX;
209+
ok &= globalcontext_insert_atom(glb, little_atom) == LITTLE_ATOM_INDEX;
210+
ok &= globalcontext_insert_atom(glb, native_atom) == NATIVE_ATOM_INDEX;
211+
ok &= globalcontext_insert_atom(glb, string_atom) == STRING_ATOM_INDEX;
212+
ok &= globalcontext_insert_atom(glb, utf8_atom) == UTF8_ATOM_INDEX;
213+
ok &= globalcontext_insert_atom(glb, utf16_atom) == UTF16_ATOM_INDEX;
214+
ok &= globalcontext_insert_atom(glb, utf32_atom) == UTF32_ATOM_INDEX;
215+
ok &= globalcontext_insert_atom(glb, badrecord_atom) == BADRECORD_ATOM_INDEX;
216+
193217
if (!ok) {
194218
AVM_ABORT();
195219
}

src/libAtomVM/defaultatoms.h

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,15 +112,27 @@ extern "C" {
112112
#define MACHINE_ATOM_INDEX 65
113113
#define AVM_FLOATSIZE_ATOM_INDEX 66
114114

115-
#define PLATFORM_ATOMS_BASE_INDEX 67
115+
#define APPEND_ATOM_INDEX 67
116+
#define PRIVATE_APPEND_ATOM_INDEX 68
117+
#define BINARY_ATOM_INDEX 69
118+
#define INTEGER_ATOM_INDEX 70
119+
#define LITTLE_ATOM_INDEX 71
120+
#define NATIVE_ATOM_INDEX 72
121+
#define STRING_ATOM_INDEX 73
122+
#define UTF8_ATOM_INDEX 74
123+
#define UTF16_ATOM_INDEX 75
124+
#define UTF32_ATOM_INDEX 76
125+
#define BADRECORD_ATOM_INDEX 77
126+
127+
#define PLATFORM_ATOMS_BASE_INDEX 78
116128

117129
#define FALSE_ATOM TERM_FROM_ATOM_INDEX(FALSE_ATOM_INDEX)
118130
#define TRUE_ATOM TERM_FROM_ATOM_INDEX(TRUE_ATOM_INDEX)
119131

120132
#define OK_ATOM term_from_atom_index(OK_ATOM_INDEX)
121133
#define ERROR_ATOM term_from_atom_index(ERROR_ATOM_INDEX)
122134

123-
#define UNDEFINED_ATOM term_from_atom_index(UNDEFINED_ATOM_INDEX)
135+
#define UNDEFINED_ATOM TERM_FROM_ATOM_INDEX(UNDEFINED_ATOM_INDEX)
124136

125137
#define BADARG_ATOM term_from_atom_index(BADARG_ATOM_INDEX)
126138
#define BADARITH_ATOM term_from_atom_index(BADARITH_ATOM_INDEX)
@@ -199,6 +211,18 @@ extern "C" {
199211
#define MACHINE_ATOM TERM_FROM_ATOM_INDEX(MACHINE_ATOM_INDEX)
200212
#define AVM_FLOATSIZE_ATOM TERM_FROM_ATOM_INDEX(AVM_FLOATSIZE_ATOM_INDEX)
201213

214+
#define APPEND_ATOM TERM_FROM_ATOM_INDEX(APPEND_ATOM_INDEX)
215+
#define PRIVATE_APPEND_ATOM TERM_FROM_ATOM_INDEX(PRIVATE_APPEND_ATOM_INDEX)
216+
#define BINARY_ATOM TERM_FROM_ATOM_INDEX(BINARY_ATOM_INDEX)
217+
#define INTEGER_ATOM TERM_FROM_ATOM_INDEX(INTEGER_ATOM_INDEX)
218+
#define LITTLE_ATOM TERM_FROM_ATOM_INDEX(LITTLE_ATOM_INDEX)
219+
#define NATIVE_ATOM TERM_FROM_ATOM_INDEX(NATIVE_ATOM_INDEX)
220+
#define STRING_ATOM TERM_FROM_ATOM_INDEX(STRING_ATOM_INDEX)
221+
#define UTF8_ATOM TERM_FROM_ATOM_INDEX(UTF8_ATOM_INDEX)
222+
#define UTF16_ATOM TERM_FROM_ATOM_INDEX(UTF16_ATOM_INDEX)
223+
#define UTF32_ATOM TERM_FROM_ATOM_INDEX(UTF32_ATOM_INDEX)
224+
#define BADRECORD_ATOM TERM_FROM_ATOM_INDEX(BADRECORD_ATOM_INDEX)
225+
202226
void defaultatoms_init(GlobalContext *glb);
203227

204228
void platform_defaultatoms_init(GlobalContext *glb);

src/libAtomVM/opcodes.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,9 @@
121121
#define OP_BS_CONTEXT_TO_BINARY 130
122122
#define OP_BS_TEST_UNIT 131
123123
#define OP_BS_MATCH_STRING 132
124+
#define OP_BS_INIT_WRITABLE 133
124125
#define OP_BS_APPEND 134
126+
#define OP_BS_PRIVATE_APPEND 135
125127
#define OP_TRIM 136
126128
#define OP_BS_INIT_BITS 137
127129
#define OP_BS_UTF8_SIZE 144
@@ -155,5 +157,8 @@
155157
#define OP_RECV_MARKER_CLEAR 174
156158
#define OP_RECV_MARKER_RESERVE 175
157159
#define OP_RECV_MARKER_USE 176
160+
#define OP_BS_CREATE_BIN 177
161+
#define OP_CALL_FUN2 178
162+
#define OP_BADRECORD 180
158163

159164
#endif

0 commit comments

Comments
 (0)