summaryrefslogtreecommitdiff
path: root/src/kompsos-collector.adb
diff options
context:
space:
mode:
authorJedidiah Barber <contact@jedbarber.id.au>2025-12-18 14:54:43 +1300
committerJedidiah Barber <contact@jedbarber.id.au>2025-12-18 14:54:43 +1300
commitf6c26c09bad7ba5d39c8af25cc06ff07f836769c (patch)
tree62c6692b25ce23bbaebfeef8fc9c9b905da6d98f /src/kompsos-collector.adb
parent2ec591d4b2b4dc11356b7bc5f261050b2c49fed9 (diff)
Reduced number of reallocations for conjunct operations
Diffstat (limited to 'src/kompsos-collector.adb')
-rw-r--r--src/kompsos-collector.adb14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/kompsos-collector.adb b/src/kompsos-collector.adb
index c95453e..d7c40eb 100644
--- a/src/kompsos-collector.adb
+++ b/src/kompsos-collector.adb
@@ -197,6 +197,7 @@ package body Kompsos.Collector is
if Book.Contains (Ptr.Actual) then
Reset (Constant_World_Access (Book.Element (Ptr.Actual).Con_Part));
Free (Book (Ptr.Actual).Con_Part);
+ Free (Book (Ptr.Actual).Con_Base);
Book.Delete (Ptr.Actual);
end if;
Reset (Ptr.Actual.Con_World'Unchecked_Access);
@@ -336,6 +337,13 @@ package body Kompsos.Collector is
when Conjunct_Node =>
if not Book.Contains (Ptr) then
Book.Insert (Ptr, (Kind => Conjunct_Data, others => <>));
+ if not Get_Next (Ptr.Con_World'Unchecked_Access, 1, Result) then
+ Book (Ptr).Con_Gone := True;
+ else
+ Book (Ptr).Con_Base := new World'(World (Static (Result)));
+ Book (Ptr).Con_Part := new World'(Call_Lazy
+ (Book.Element (Ptr).Con_Base.all, Ptr.Con_Data));
+ end if;
end if;
if Book (Ptr).Con_Gone then
return False;
@@ -346,18 +354,18 @@ package body Kompsos.Collector is
Result)
loop
Reset (Constant_World_Access (Book.Element (Ptr).Con_Part));
- Free (Book (Ptr).Con_Part);
if Get_Next
(Ptr.Con_World'Unchecked_Access,
Book.Element (Ptr).Con_From,
Result)
then
- Book (Ptr).Con_Part :=
- new World'(Call_Lazy (World (Static (Result)), Ptr.Con_Data));
+ Book (Ptr).Con_Base.Actual.Stc_States (1) := Result;
Book (Ptr).Con_Next := 1;
Book (Ptr).Con_From := Book.Element (Ptr).Con_From + 1;
else
Book (Ptr).Con_Gone := True;
+ Free (Book (Ptr).Con_Part);
+ Free (Book (Ptr).Con_Base);
return False;
end if;
end loop;