aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src/core_parse.yrl
diff options
context:
space:
mode:
authorJosé Valim <[email protected]>2019-05-10 14:05:40 +0200
committerJosé Valim <[email protected]>2019-08-05 12:55:44 +0200
commit3ff0914b5625b8ef76e6ff5a2f2db1c563ebed3c (patch)
treef2b29365a2cdea8b0566f0acd7bea68b3a4da193 /lib/compiler/src/core_parse.yrl
parentc6d5af1054f8d555a69111f29b59d5485ef8e48f (diff)
downloadotp-3ff0914b5625b8ef76e6ff5a2f2db1c563ebed3c.tar.gz
otp-3ff0914b5625b8ef76e6ff5a2f2db1c563ebed3c.tar.bz2
otp-3ff0914b5625b8ef76e6ff5a2f2db1c563ebed3c.zip
Expand and squeeze literal integers/utf8 bin segments
This commit adds two operations when handling literal integers and literal utf8 segments in the v3_kernel pass. The first operation is to expand all literal integers with size more than 8 and literal utf8s into integers with size of 8 (and potentially an integer with size less than 8 at the end). This expansion simplifies the code in other operations inside v3_kernel and ensure they apply more consistently. For instance, literal binary matching now applies to both regular and utf8 strings. Furthermore, we can more efficiently group clauses. For instance, the following code: foo(<<$á/utf8, X/binary>>) -> foo(X); foo(<<$é/utf8, X/binary>>) -> foo(X); foo(<<>>) -> ok. Becomes a bs_get_integer_16 comparing 50089 and 50081, allowing us to skip the utf8 conversion at runtime. However, since expanding an integer of size 16 into two of size 8 can be less efficient when matching at runtime, later we do another pass, where we squeeze all of those integers together into an integer with maximum size of 24. This allows prefix matching, such as: foo(<<"aaaa", X/binary>>) -> foo(X); foo(<<"bbbb", X/binary>>) -> foo(X); foo(<<>>) -> ok. To run more than 2x faster (as long as all clauses match on a given prefix). Compilation times and binary size are roughly the same.
Diffstat (limited to 'lib/compiler/src/core_parse.yrl')
0 files changed, 0 insertions, 0 deletions