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/kompsos-collector.adb | |
| parent | 2ec591d4b2b4dc11356b7bc5f261050b2c49fed9 (diff) | |
Reduced number of reallocations for conjunct operations
Diffstat (limited to 'src/kompsos-collector.adb')
| -rw-r--r-- | src/kompsos-collector.adb | 14 |
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; |
