diff options
author | Björn Gustavsson <[email protected]> | 2012-08-16 14:36:55 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2012-10-09 15:24:38 +0200 |
commit | b68297d347a9a041854410a77861982b1d0861d2 (patch) | |
tree | c9f6c9ef206f0bfcc7215ac3bd1e4e7265382391 /lib/compiler/ebin | |
parent | b76588fb5a4057dce8c26307e497370a33217a44 (diff) | |
download | otp-b68297d347a9a041854410a77861982b1d0861d2.tar.gz otp-b68297d347a9a041854410a77861982b1d0861d2.tar.bz2 otp-b68297d347a9a041854410a77861982b1d0861d2.zip |
Improve binary matching of literals
The bs_match_string instruction is used to speed up matching of
binary literals. For example, given this source code:
foo1(<<1,2,3>>) -> ok.
The matching part of the code will look like:
{test,bs_start_match2,{f,1},1,[{x,0},0],{x,0}}.
{test,bs_match_string,{f,3},[{x,0},24,{string,[1,2,3]}]}.
{test,bs_test_tail2,{f,3},[{x,0},0]}.
Nice. However, if we do a simple change to the source code:
foo2(<<1,2,3>>) -> ok;
foo2(<<>>) -> error.
the resulting matching code will look like (sligthly simplified):
{test,bs_start_match2,{f,4},1,[{x,0},0],{x,0}}.
{test,bs_get_integer2,{f,7},1,[{x,0},{integer,8},1,Flags],{x,1}}.
{test,is_eq_exact,{f,8},[{x,1},{integer,1}]}.
{test,bs_match_string,{f,6},[{x,0},16,{string,[2,3]}]}.
{test,bs_test_tail2,{f,6},[{x,0},0]}.
{move,{atom,ok},{x,0}}.
return.
{label,6}.
{bs_restore2,{x,0},{atom,start}}.
{label,7}.
{test,bs_test_tail2,{f,8},[{x,0},0]}.
That is, matching of the first byte is not combined into the
bs_match_string instruction that follows.
Fix this problem by allowing a bs_match_string instruction to be
used if all clauses will match either the same integer literal or
the empty binary.
Diffstat (limited to 'lib/compiler/ebin')
0 files changed, 0 insertions, 0 deletions