diff options
author | Björn Gustavsson <[email protected]> | 2011-08-09 16:49:39 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2011-10-11 11:36:37 +0200 |
commit | 2a30746d09f467c13e9361774867462ae4f2bd32 (patch) | |
tree | 1823e57adc1d31516cf366f3726ec6a736f6d8ea /erts/emulator/utils/beam_makeops | |
parent | e87760199eb9d3c02480e92a0bcf76864c750972 (diff) | |
download | otp-2a30746d09f467c13e9361774867462ae4f2bd32.tar.gz otp-2a30746d09f467c13e9361774867462ae4f2bd32.tar.bz2 otp-2a30746d09f467c13e9361774867462ae4f2bd32.zip |
Introduce 'try_me_else_fail'
Diffstat (limited to 'erts/emulator/utils/beam_makeops')
-rwxr-xr-x | erts/emulator/utils/beam_makeops | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/erts/emulator/utils/beam_makeops b/erts/emulator/utils/beam_makeops index 9c7e5e94a5..367f089401 100755 --- a/erts/emulator/utils/beam_makeops +++ b/erts/emulator/utils/beam_makeops @@ -187,6 +187,12 @@ sub define_type_bit { } # +# Pre-define the 'fail' instruction. It is used internally +# by the 'try_me_else_fail' instruction. +# +$match_engine_ops{'TOP_fail'} = 1; + +# # Sanity checks. # @@ -1316,7 +1322,20 @@ sub tr_gen { print "Uint op_transform[] = {\n"; foreach $key (keys %gen_transform) { $gen_transform_offset{$key} = $offset; - foreach $instr (@{$gen_transform{$key}}) { + my @instr = @{$gen_transform{$key}}; + + # + # If the last instruction is 'fail', remove it and + # convert the previous 'try_me_else' to 'try_me_else_fail'. + # + if (is_instr($instr[$#instr], 'fail')) { + pop(@instr); + my $i = $#instr; + $i-- while !is_instr($instr[$i], 'try_me_else'); + $instr[$i] = make_op('', 'try_me_else_fail'); + } + + foreach $instr (@instr) { my($size, $instr_ref, $comment) = @$instr; my($op, @args) = @$instr_ref; print " "; |