summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/emu/beam_emu.c
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/beam/emu/beam_emu.c')
-rw-r--r--erts/emulator/beam/emu/beam_emu.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/erts/emulator/beam/emu/beam_emu.c b/erts/emulator/beam/emu/beam_emu.c
index b16e23c61e..ec71dd2088 100644
--- a/erts/emulator/beam/emu/beam_emu.c
+++ b/erts/emulator/beam/emu/beam_emu.c
@@ -713,3 +713,57 @@ erts_beam_jump_table(void)
return 1;
#endif
}
+
+void
+erts_prepare_bs_construct_fail_info(Process* c_p, const BeamInstr* p, Eterm reason, Eterm Info)
+{
+ Eterm* hp = HeapFragOnlyAlloc(c_p, MAP3_SZ+3+1);
+ Eterm cause_tuple;
+ Eterm op;
+ Eterm error_info;
+ Uint segment;
+
+ segment = p[2] >> 3;
+
+ switch (p[0]) {
+ case BSC_APPEND:
+ case BSC_PRIVATE_APPEND:
+ case BSC_BINARY:
+ case BSC_BINARY_FIXED_SIZE:
+ case BSC_BINARY_ALL:
+ op = am_binary;
+ break;
+ case BSC_FLOAT:
+ case BSC_FLOAT_FIXED_SIZE:
+ op = am_float;
+ break;
+ case BSC_INTEGER:
+ case BSC_INTEGER_FIXED_SIZE:
+ op = am_integer;
+ break;
+ case BSC_STRING:
+ op = am_string;
+ break;
+ case BSC_UTF8:
+ op = am_utf8;
+ break;
+ case BSC_UTF16:
+ op = am_utf16;
+ break;
+ case BSC_UTF32:
+ op = am_utf32;
+ break;
+ default:
+ op = am_none;
+ break;
+ }
+
+ cause_tuple = TUPLE3(hp, make_small(segment), op, Info);
+ hp += 4;
+ error_info = MAP3(hp,
+ am_cause, cause_tuple,
+ am_function, am_format_bs_fail,
+ am_module, am_erl_erts_errors);
+ c_p->fvalue = error_info;
+ c_p->freason = reason | EXF_HAS_EXT_INFO;
+}