hissssst / tria

Elixir optimizing compiler
GNU General Public License v3.0
55 stars 2 forks source link

Binary pattern matching compilation error when there's a function called 'size' #5

Closed mat-hek closed 1 year ago

mat-hek commented 1 year ago

Hi, trying to compile this:

defmodule Payload do
  def size(payload) when is_binary(payload) do
    payload |> byte_size()
  end

  def split_at(payload, at_pos) do
    <<part1::binary-size(at_pos), part2::binary>> = payload
    {part1, part2}
  end
end

I get the following error:

failed_to_compile: defmodule TriaGlobalContext do
                     def payload_size(payload_nil_419) when :erlang.is_binary(payload_nil_419) do
                       :erlang.byte_size(payload_nil_419)
                     end

                     def payload_split_at(
                           payload_nil_515,
                           at_pos_nil_547
                         ) do
                       <<HERE_HITS!(part1_nil_579 :: binary_nil - payload_size(at_pos_nil_547)),
                         part2_nil_611::binary_nil>> = payload_nil_515

                       {part1_nil_579, part2_nil_611}
                     end
                   end

19:31:57.474 [error] GenServer TriaGlobalContext terminating
** (CompileError) Elixir.TriaGlobalContext.ex:1411: unknown bitstring specifier: payload_size(at_pos)
    (elixir 1.13.4) src/elixir_bitstring.erl:160: :elixir_bitstring.expand_specs/7
    (elixir 1.13.4) src/elixir_bitstring.erl:38: :elixir_bitstring.expand/8
    (elixir 1.13.4) src/elixir_bitstring.erl:14: :elixir_bitstring.expand/5
    (elixir 1.13.4) src/elixir_clauses.erl:23: :elixir_clauses.match/5
    (elixir 1.13.4) src/elixir_expand.erl:11: :elixir_expand.expand/3
    (elixir 1.13.4) src/elixir_expand.erl:550: :elixir_expand.expand_block/5
    (elixir 1.13.4) src/elixir_expand.erl:40: :elixir_expand.expand/3
Last message (from #PID<0.94.0>): :generate
State: %{definitions: %{{Payload, :size, 1} => {:def, [{[{:payload, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 2], 163}], [{{:., [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 2], [:erlang, :is_binary]}, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 2], [{:payload, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 2], 163}]}], [do: {{:., [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 3], [:erlang, :byte_size]}, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 3], [{:payload, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 3], 163}]}]}]}, {Payload, :split_at, 2} => {:def, [{[{:payload, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 6], 227}, {:at_pos, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 6], 259}], [], [do: {:__block__, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex"], [{:=, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 7], [{:<<>>, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 7], [{:"::", [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 7], [{:part1, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 7], 291}, {:-, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex"], [{:binary, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex"], nil}, {{:., [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex"], [Payload, :size]}, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex"], [{:at_pos, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 7], 259}]}]}]}, {:"::", [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 7], [{:part2, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 7], 323}, {:binary, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex"], nil}]}]}, {:payload, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 7], 227}]}, {{:part1, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 8], 291}, {:part2, [file: "/Users/matheksm/Desktop/sm/membrane_test/try_tria/lib/try_tria.ex", line: 8], 323}}]}]}]}}, name: TriaGlobalContext}
Client #PID<0.94.0> is alive

    (stdlib 4.0.1) gen.erl:237: :gen.do_call/4
    (elixir 1.13.4) lib/gen_server.ex:1027: GenServer.call/3
    (tria 0.0.1) lib/tria/compiler.ex:90: Tria.Compiler.compile/2
    (tria 0.0.1) lib/mix/tasks/compile.tria.ex:42: Mix.Tasks.Compile.Tria.compile/2
    (mix 1.13.4) lib/mix/task.ex:397: anonymous fn/3 in Mix.Task.run_task/3
    (mix 1.13.4) lib/mix/tasks/compile.all.ex:92: Mix.Tasks.Compile.All.run_compiler/2
    (mix 1.13.4) lib/mix/tasks/compile.all.ex:72: Mix.Tasks.Compile.All.compile/4
    (mix 1.13.4) lib/mix/tasks/compile.all.ex:59: Mix.Tasks.Compile.All.with_logger_app/2
** (exit) exited in: GenServer.call(#PID<0.180.0>, :generate, :infinity)
    ** (EXIT) an exception was raised:
        ** (CompileError) Elixir.TriaGlobalContext.ex:1411: unknown bitstring specifier: payload_size(at_pos)
            (elixir 1.13.4) src/elixir_bitstring.erl:160: :elixir_bitstring.expand_specs/7
            (elixir 1.13.4) src/elixir_bitstring.erl:38: :elixir_bitstring.expand/8
            (elixir 1.13.4) src/elixir_bitstring.erl:14: :elixir_bitstring.expand/5
            (elixir 1.13.4) src/elixir_clauses.erl:23: :elixir_clauses.match/5
            (elixir 1.13.4) src/elixir_expand.erl:11: :elixir_expand.expand/3
            (elixir 1.13.4) src/elixir_expand.erl:550: :elixir_expand.expand_block/5
            (elixir 1.13.4) src/elixir_expand.erl:40: :elixir_expand.expand/3
    (elixir 1.13.4) lib/gen_server.ex:1030: GenServer.call/3
    (tria 0.0.1) lib/tria/compiler.ex:90: Tria.Compiler.compile/2
    (tria 0.0.1) lib/mix/tasks/compile.tria.ex:42: Mix.Tasks.Compile.Tria.compile/2
    (mix 1.13.4) lib/mix/task.ex:397: anonymous fn/3 in Mix.Task.run_task/3
    (mix 1.13.4) lib/mix/tasks/compile.all.ex:92: Mix.Tasks.Compile.All.run_compiler/2
    (mix 1.13.4) lib/mix/tasks/compile.all.ex:72: Mix.Tasks.Compile.All.compile/4
    (mix 1.13.4) lib/mix/tasks/compile.all.ex:59: Mix.Tasks.Compile.All.with_logger_app/2
    (mix 1.13.4) lib/mix/tasks/compile.all.ex:36: Mix.Tasks.Compile.All.run/1
hissssst commented 1 year ago

Oh, that's a really good catch. Binary specifiers are represented by the same structure as regular calls.