TLA+ 1.6.0 Released
github.com3 pointsby strmpnk0 comments
7 6 5 4 3 2 1 0
------------------------+-------+
0 5 X 0 | Y |
------------------------+-------+
1 13 X 6
Here we can't say <<Y:2/little, X:14/little>> (Y is bits [0,1], X is bits [2,15]) because we need to read <<X1:6/little, Y:2/little, X2:8/little>> (X1 is bits [0,5], Y is bits [6,7], X2 is bits [8,15]). 7 6 5 4 3 2 1 0 | 15 14 13 12 11 10 9 8
------------------------+-------+---------------------------------
5 X1 0 | Y | 13 X2 6
------------------------+-------+---------------------------------
Even if we know that we interpret each number with a given endianness, the bit stream numbering here needs to be expressed separately at the top level. Generally, this is why serialized protocols prefer to start bit numbering at 0 like the written in the IPv4 header example. iex> :erts_debug.df(String)
This will dump a BEAM machine instruction stream to a file named Elixir.String.dis in your current working directory. You'll see things like: 000000001B81AFB0: i_func_info_IaaI 0 `'Elixir.String'` `at` 2
000000001B81AFD8: is_integer_fx f(000000001B81AFB0) x(1)
000000001B81AFE8: is_ge_literal_fxc f(000000001B81B008) x(1) `0`
000000001B81B000: i_call_only_f loc(`'Elixir.String'`:`do_at`/2)
000000001B81B008: allocate_tt 2 2
000000001B81B010: move_window2_xxy x(1) x(0) y(0)
000000001B81B018: i_call_f loc(`'Elixir.String'`:`length`/1)
000000001B81B020: i_plus_xyjd x(0) y(0) j(0) x(0)
000000001B81B030: is_ge_literal_fxc f(000000001B81B060) x(0) `0`
000000001B81B048: move_shift_yxx y(1) x(0) x(1)
000000001B81B050: i_call_last_fQ loc(`'Elixir.String'`:`do_at`/2) 2
000000001B81B060: move_deallocate_return_cQ `nil` 2
Each of those instructions are what the .beam file loader currently generates. With the JIT, these will be replaced by machine code.