aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src/beam_except.erl
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2016-05-31 12:44:13 +0200
committerBjörn Gustavsson <[email protected]>2016-05-31 12:44:13 +0200
commit52f65fe8a1d4ccb31d2c38d1923ccb73a9059a92 (patch)
tree35903a83c15ea8ca9bb4b7b1fa75e6fc0ebdfc3f /lib/compiler/src/beam_except.erl
parent0e40609c64538a58466de8cddf2a7f0aebaf65ef (diff)
parentb1b27719d713c0e62d3242bbf1da0600ea0a651f (diff)
downloadotp-52f65fe8a1d4ccb31d2c38d1923ccb73a9059a92.tar.gz
otp-52f65fe8a1d4ccb31d2c38d1923ccb73a9059a92.tar.bz2
otp-52f65fe8a1d4ccb31d2c38d1923ccb73a9059a92.zip
Merge branch 'bjorn/compiler/misc'
* bjorn/compiler/misc: Eliminate unsafe use of Y registers beam_validator: Add is_bitstring/1 as a safe BIF beam_validator: Remove uncovered line Teach beam_utils:is_pure_test/1 to handle is_bitstr and is_function2 beam_utils: Simplify handling of 'return' to eliminate uncovered line beam_jump: Clean up handling of labels before func_info beam_expect: Correctly handle blocks with multiple allocs v3_codegen: Don't confuse beam_validator v3_codegen: Correct code generation for an error/1 call in a guard beam_receive: Don't crash when encountering nonsensical code
Diffstat (limited to 'lib/compiler/src/beam_except.erl')
-rw-r--r--lib/compiler/src/beam_except.erl8
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/compiler/src/beam_except.erl b/lib/compiler/src/beam_except.erl
index cb3a6b79de..4a181c1923 100644
--- a/lib/compiler/src/beam_except.erl
+++ b/lib/compiler/src/beam_except.erl
@@ -133,10 +133,12 @@ translate_exception(_, _, _, _) -> no.
fix_block(Is, 0) ->
reverse(Is);
fix_block(Is, Words) ->
- fix_block_1(reverse(Is), Words).
+ reverse(fix_block_1(Is, Words)).
-fix_block_1([{set,[],[],{alloc,Live,{F1,F2,Needed,F3}}}|Is], Words) ->
- [{set,[],[],{alloc,Live,{F1,F2,Needed-Words,F3}}}|Is];
+fix_block_1([{set,[],[],{alloc,Live,{F1,F2,Needed0,F3}}}|Is], Words) ->
+ Needed = Needed0 - Words,
+ true = Needed >= 0, %Assertion.
+ [{set,[],[],{alloc,Live,{F1,F2,Needed,F3}}}|Is];
fix_block_1([I|Is], Words) ->
[I|fix_block_1(Is, Words)].