| |
| package body Unc_Memops is |
| |
| use type System.Address; |
| |
| type Addr_Array_T is array (1 .. 20) of Addr_T; |
| |
| type Addr_Stack_T is record |
| Store : Addr_Array_T; |
| Size : Integer := 0; |
| end record; |
| |
| procedure Push (Addr : Addr_T; As : access addr_stack_t) is |
| begin |
| As.Size := As.Size + 1; |
| As.Store (As.Size) := Addr; |
| end; |
| |
| function Pop (As : access Addr_Stack_T) return Addr_T is |
| Addr : Addr_T := As.Store (As.Size); |
| begin |
| As.Size := As.Size - 1; |
| return Addr; |
| end; |
| |
| -- |
| |
| Addr_Stack : aliased Addr_Stack_T; |
| Symetry_Expected : Boolean := False; |
| |
| procedure Expect_Symetry (Status : Boolean) is |
| begin |
| Symetry_Expected := Status; |
| end; |
| |
| function Alloc (Size : size_t) return Addr_T is |
| function malloc (Size : Size_T) return Addr_T; |
| pragma Import (C, Malloc, "malloc"); |
| |
| Ptr : Addr_T := malloc (Size); |
| begin |
| if Symetry_Expected then |
| Push (Ptr, Addr_Stack'Access); |
| end if; |
| return Ptr; |
| end; |
| |
| procedure Free (Ptr : addr_t) is |
| begin |
| if Symetry_Expected |
| and then Ptr /= Pop (Addr_Stack'Access) |
| then |
| raise Program_Error; |
| end if; |
| end; |
| |
| function Realloc (Ptr : addr_t; Size : size_t) return Addr_T is |
| begin |
| raise Program_Error; |
| return System.Null_Address; |
| end; |
| |
| end; |