diff options
Diffstat (limited to 'erts/emulator')
-rw-r--r-- | erts/emulator/beam/emu/ops.tab | 5 | ||||
-rw-r--r-- | erts/emulator/beam/jit/arm/ops.tab | 4 | ||||
-rw-r--r-- | erts/emulator/beam/jit/x86/ops.tab | 5 | ||||
-rw-r--r-- | erts/emulator/test/bs_utf_SUITE.erl | 4 |
4 files changed, 18 insertions, 0 deletions
diff --git a/erts/emulator/beam/emu/ops.tab b/erts/emulator/beam/emu/ops.tab index 814fd23b1b..fed0ef4293 100644 --- a/erts/emulator/beam/emu/ops.tab +++ b/erts/emulator/beam/emu/ops.tab @@ -1233,6 +1233,11 @@ bs_skip_utf16 Fail=f Ms=xy Unit=u Flags=u => bs_get_utf16 Fail Ms Unit Flags x i_bs_get_utf16 xy f? t d +bs_get_utf32 Fail=f Ms=xy Live=u Flags=u Dst | equal(Ms, Dst) => + bs_get_integer2 Fail Ms Live i=32 u=1 Flags x | + i_bs_validate_unicode_retract Fail x Ms | + move x Dst + bs_get_utf32 Fail=f Ms=xy Live=u Flags=u Dst=d => bs_get_integer2 Fail Ms Live i=32 u=1 Flags Dst | i_bs_validate_unicode_retract Fail Dst Ms diff --git a/erts/emulator/beam/jit/arm/ops.tab b/erts/emulator/beam/jit/arm/ops.tab index 9cfce18e58..3c4f4c218f 100644 --- a/erts/emulator/beam/jit/arm/ops.tab +++ b/erts/emulator/beam/jit/arm/ops.tab @@ -947,6 +947,10 @@ bs_skip_utf16 Fail=f Ms=xy u Flags=u => skip_utf16(Fail, Ms, Flags) i_bs_get_utf16 S f t d i_bs_skip_utf16 S f t +bs_get_utf32 Fail=f Ms=xy Live=u Flags=u Dst | equal(Ms, Dst) => + bs_get_integer2 Fail Ms Live i=32 u=1 Flags x | + i_bs_validate_unicode_retract Fail x Ms | + move x Dst bs_get_utf32 Fail=f Ms=xy Live=u Flags=u Dst=d => bs_get_integer2 Fail Ms Live i=32 u=1 Flags Dst | i_bs_validate_unicode_retract Fail Dst Ms diff --git a/erts/emulator/beam/jit/x86/ops.tab b/erts/emulator/beam/jit/x86/ops.tab index 5481fff2d8..8a5dc79c35 100644 --- a/erts/emulator/beam/jit/x86/ops.tab +++ b/erts/emulator/beam/jit/x86/ops.tab @@ -919,6 +919,11 @@ bs_skip_utf16 Fail=f Ms=xy u Flags=u => skip_utf16(Fail, Ms, Flags) i_bs_get_utf16 S f t d i_bs_skip_utf16 S f t +bs_get_utf32 Fail=f Ms=xy Live=u Flags=u Dst | equal(Ms, Dst) => + bs_get_integer2 Fail Ms Live i=32 u=1 Flags x | + i_bs_validate_unicode_retract Fail x Ms | + move x Dst + bs_get_utf32 Fail=f Ms=xy Live=u Flags=u Dst=d => bs_get_integer2 Fail Ms Live i=32 u=1 Flags Dst | i_bs_validate_unicode_retract Fail Dst Ms diff --git a/erts/emulator/test/bs_utf_SUITE.erl b/erts/emulator/test/bs_utf_SUITE.erl index a344f5c456..8885b31324 100644 --- a/erts/emulator/test/bs_utf_SUITE.erl +++ b/erts/emulator/test/bs_utf_SUITE.erl @@ -272,6 +272,10 @@ utf32_illegal_sequences(Config) when is_list(Config) -> utf32_fail_range(16#10FFFF+1, 16#10FFFF+512), %Too large. utf32_fail_range(16#D800, 16#DFFF), %Reserved for UTF-16. utf32_fail_range(-100, -1), + + <<>> = id(<< 0 || <<X/utf32>> <= <<"àxxx">>, _ = X >>), + <<>> = id(<< 0 || <<X/little-utf32>> <= <<"àxxx">>, _ = X >>), + ok. utf32_fail_range(Char, End) when Char =< End -> |