From 7f1161d8ae9a7227d2c3d9fe11f2655eb1e41654 Mon Sep 17 00:00:00 2001 From: Rolf Malthe Andersen Date: Thu, 5 Mar 2026 08:55:18 +0100 Subject: [PATCH] fix: consume fuel for parsing anon functions --- lib/spitfire.ex | 2 ++ test/spitfire_test.exs | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/lib/spitfire.ex b/lib/spitfire.ex index 8c8942e..ddd55ca 100644 --- a/lib/spitfire.ex +++ b/lib/spitfire.ex @@ -2133,6 +2133,8 @@ defmodule Spitfire do {exprs, parser} = with_context(parser, %{stop_before_stab_op?: true}, fn parser -> while2 current_token(parser) not in [:end, :eof] <- parser do + parser = consume_fuel(parser) + {ast, parser} = case Map.get(parser, :stab_state) do %{ast: lhs} -> diff --git a/test/spitfire_test.exs b/test/spitfire_test.exs index a0b921d..dcdeafe 100644 --- a/test/spitfire_test.exs +++ b/test/spitfire_test.exs @@ -2356,6 +2356,13 @@ defmodule SpitfireTest do assert {:error, _ast, _errors} = Spitfire.parse("fn ->\n)") end + test "fn -> followed by block identifier exhausts fuel instead of hanging" do + assert Spitfire.parse("fn -> catch") == {:error, :no_fuel_remaining} + assert Spitfire.parse("fn -> after") == {:error, :no_fuel_remaining} + assert Spitfire.parse("fn -> rescue") == {:error, :no_fuel_remaining} + assert Spitfire.parse("fn -> else") == {:error, :no_fuel_remaining} + end + test "missing bitstring brackets" do code = """ <