uses heaptrc;
type
TMem = Record
Addr : Pointer;
Size : PtrUInt;
End;
var
continue : Pointer;
lastMM : TMemoryManager;
MM : TMemoryManager;
list: array of TMem;
listSize : Integer = 0;
procedure exitHandler;
var
i : integer;
begin
writeln('exitHandler');
for i:=0 to listSize-1 do
begin
lastMM.FreeMemSize(list[i].Addr, list[i].Size);
end;
SetMemoryManager(lastMM);
SetLength(list, 0);
asm
jmp continue
end;
end;
function myGetmem(Size: PtrUInt):Pointer;
begin
SetMemoryManager(lastMM);
SetLength(list, listSize+1);
SetMemoryManager(MM);
list[listSize].Size := Size;
list[listSize].Addr := lastMM.Getmem(Size);
myGetmem := list[listSize].Addr;
inc(listSize);
end;
procedure sethandler(sp:PtrUInt);
begin
continue := Pointer(PPtrUInt(@sp)[9]);
Pointer(PPtrUInt(@sp)[9]) := @exitHandler;
end;
Procedure MyProc;
Var Data: PByte;
I : uint16;
Begin
sethandler(0);
GetMemoryManager(lastMM);
MM := lastMM;
MM.Getmem := @myGetmem;
SetMemoryManager(MM);
Data := AllocMem(10);
For I := 0 To 9 Do
Data[I] := Random(High(Byte));
For I := 0 To 9 Do
Write(Data[I], ' ');
Writeln;
End;
Begin
MyProc;
Writeln('-- end --');
Readln;
End.
dXNlcyBoZWFwdHJjOwoKdHlwZQpUTWVtID0gUmVjb3JkCiBBZGRyIDogUG9pbnRlcjsKIFNpemUgOiBQdHJVSW50OwpFbmQ7Cgp2YXIKIGNvbnRpbnVlIDogUG9pbnRlcjsKIGxhc3RNTSA6IFRNZW1vcnlNYW5hZ2VyOwogTU0gOiBUTWVtb3J5TWFuYWdlcjsKIGxpc3Q6IGFycmF5IG9mIFRNZW07CiBsaXN0U2l6ZSA6IEludGVnZXIgPSAwOwoKcHJvY2VkdXJlIGV4aXRIYW5kbGVyOwp2YXIKIGkgOiBpbnRlZ2VyOwpiZWdpbgogd3JpdGVsbignZXhpdEhhbmRsZXInKTsKIGZvciBpOj0wIHRvIGxpc3RTaXplLTEgZG8KIGJlZ2luCiAgbGFzdE1NLkZyZWVNZW1TaXplKGxpc3RbaV0uQWRkciwgbGlzdFtpXS5TaXplKTsKIGVuZDsKICAgCiBTZXRNZW1vcnlNYW5hZ2VyKGxhc3RNTSk7CiBTZXRMZW5ndGgobGlzdCwgMCk7CgogYXNtCiAgam1wIGNvbnRpbnVlCiBlbmQ7CmVuZDsKCmZ1bmN0aW9uIG15R2V0bWVtKFNpemU6IFB0clVJbnQpOlBvaW50ZXI7CmJlZ2luCiBTZXRNZW1vcnlNYW5hZ2VyKGxhc3RNTSk7CiBTZXRMZW5ndGgobGlzdCwgbGlzdFNpemUrMSk7CiBTZXRNZW1vcnlNYW5hZ2VyKE1NKTsKICAgCiBsaXN0W2xpc3RTaXplXS5TaXplIDo9IFNpemU7CiBsaXN0W2xpc3RTaXplXS5BZGRyIDo9IGxhc3RNTS5HZXRtZW0oU2l6ZSk7CgogbXlHZXRtZW0gOj0gbGlzdFtsaXN0U2l6ZV0uQWRkcjsKICAgCiBpbmMobGlzdFNpemUpOwplbmQ7Cgpwcm9jZWR1cmUgc2V0aGFuZGxlcihzcDpQdHJVSW50KTsKYmVnaW4KIGNvbnRpbnVlIDo9IFBvaW50ZXIoUFB0clVJbnQoQHNwKVs5XSk7CiBQb2ludGVyKFBQdHJVSW50KEBzcClbOV0pIDo9IEBleGl0SGFuZGxlcjsKZW5kOwogClByb2NlZHVyZSBNeVByb2M7ClZhciBEYXRhOiBQQnl0ZTsKICAgIEkgICA6IHVpbnQxNjsKQmVnaW4KIHNldGhhbmRsZXIoMCk7CiBHZXRNZW1vcnlNYW5hZ2VyKGxhc3RNTSk7CiBNTSA6PSBsYXN0TU07CiBNTS5HZXRtZW0gOj0gQG15R2V0bWVtOwogU2V0TWVtb3J5TWFuYWdlcihNTSk7CiAgCiBEYXRhIDo9IEFsbG9jTWVtKDEwKTsKIAogRm9yIEkgOj0gMCBUbyA5IERvCiAgRGF0YVtJXSA6PSBSYW5kb20oSGlnaChCeXRlKSk7CiAKIEZvciBJIDo9IDAgVG8gOSBEbwogIFdyaXRlKERhdGFbSV0sICcgJyk7CiAKIFdyaXRlbG47CkVuZDsKIApCZWdpbgogTXlQcm9jOwogCiBXcml0ZWxuKCctLSBlbmQgLS0nKTsKIFJlYWRsbjsKRW5kLiA=