diff options
| author | Jedidiah Barber <contact@jedbarber.id.au> | 2025-12-18 14:54:43 +1300 |
|---|---|---|
| committer | Jedidiah Barber <contact@jedbarber.id.au> | 2025-12-18 14:54:43 +1300 |
| commit | f6c26c09bad7ba5d39c8af25cc06ff07f836769c (patch) | |
| tree | 62c6692b25ce23bbaebfeef8fc9c9b905da6d98f /src | |
| parent | 2ec591d4b2b4dc11356b7bc5f261050b2c49fed9 (diff) | |
Reduced number of reallocations for conjunct operations
Diffstat (limited to 'src')
| -rw-r--r-- | src/kompsos-collector.adb | 14 | ||||
| -rw-r--r-- | src/kompsos-collector.ads | 3 |
2 files changed, 13 insertions, 4 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; diff --git a/src/kompsos-collector.ads b/src/kompsos-collector.ads index 8743ecc..d3e22a1 100644 --- a/src/kompsos-collector.ads +++ b/src/kompsos-collector.ads @@ -58,8 +58,9 @@ private Dis_Gone1 : Boolean := False; Dis_Gone2 : Boolean := False; when Conjunct_Data => + Con_From : Long_Positive := 2; -- Number one will be obtained by Get_Next already + Con_Base : World_Access := null; Con_Part : World_Access := null; - Con_From : Long_Positive := 1; Con_Next : Long_Positive := 1; Con_Gone : Boolean := False; when Recurse_Data => |
