рд╕реА рдореЗрдВ рд▓рд┐рдореНрдмреЛ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╡рд┐рдХрд╛рд╕ (рднрд╛рдЧ 2)

рднрд╛рдЧ 1

рд╕рд╛рдордЧреНрд░реА



рдвреЗрд░


рд╕реА рдореЗрдВ рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛рдиреЗ рдФрд░ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд▓рд┐рдВрдмреЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЖрдкрдХреЛ рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдореЗрдореЛрд░реА рдореЗрдВ рдХреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдЗрдирдлрд░реНрдиреЛ рдореЗрдВ рдвреЗрд░ рдХрд╛ рдЖрдпреЛрдЬрди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реАрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ libinterp/heap.c рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ include/interp.h ред

рдореЗрд░реА рдпрд╛рдж рдореЗрдВ рдХреНрдпрд╛ рд╣реИ ...

рдХреЗрд╡рд▓ рдвреЗрд░ рдореЗрдВ n рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 Heap *h; uchar *data; h = nheap(256); data = H2D(uchar*, h); ... //   data  256  destroy(data); 

рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ, рдореЗрдореЛрд░реА рдХреЛ 256 + рдвреЗрд░-рд╣реЗрдбрд░ рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд╣реЗрдбрд░ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ред рд╣реЗрдбрд░ рдХреЛ Heap рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рдкреЙрдЗрдбрд░ рдХреЛ рдбреЗрдЯрд╛ (рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯ рдХреЗ рд╕рд╛рде) рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реЗрдбрд░ рд╣реИрдбрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдореИрдХреНрд░реЛрдЬрд╝ рд╣реИрдВ, H2D() рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд D2H() ред destroy() рдлрд╝рдВрдХреНрд╢рди рдЕрдЬреНрдЮрд╛рдд рд▓рдВрдмрд╛рдИ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдмрдЬрд╛рдп рдвреЗрд░ рд╣реЗрдбрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП D2H() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрддрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреЗ рдмрд╛рдЗрдЯ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
 struct Heap { int color; /* Allocation color */ ulong ref; Type* t; ulong hprof; /* heap profiling */ }; #define H2D(t, x) ((t)(((uchar*)(x))+sizeof(Heap))) #define D2H(x) ((Heap*)(((uchar*)(x))-sizeof(Heap))) 

рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛

рд╣реАрдк рд╣реЗрдбрд░ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ? рдореИрдВ рдЖрдкрдХреЛ hprof рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛, рдореИрдВ рдвреЗрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдмрд╛рдХреА рдХреНрд╖реЗрддреНрд░ рдмреЗрд╣рдж рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрдирдлрд░реНрдиреЛ рдореЗрдВ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред рджреЛ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдХ рд╕рд░рд▓ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд╕рд╛рде рд╣реА рдЪрдХреНрд░реАрдп рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░рд┐-рд░рдВрдЧ рдЕрдВрдХрди рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рднрд┐рдиреНрдирддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, ref рдПрдХ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рд╣реИ, рдФрд░ color рдЙрдкрдпреЛрдЧ рддреНрд░рд┐-рд░рдВрдЧ рдЕрдВрдХрди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм nheap() рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдПрдХ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдвреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд╣реАрдк рд╣реЗрдбрд░ рдореЗрдВ ref рдорд╛рди 1 рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рдЬрдм destroy() рдЬрд╛рддрд╛ рд╣реИ destroy() рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ 1 рд╕реЗ ref рдХреЗ рдореВрд▓реНрдп рдХреЛ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рддрднреА 0 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рдХрдмреНрдЬреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБ рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИ рд╕реНрдореГрддрд┐ред

рддрджрдиреБрд╕рд╛рд░, рдЬрдм рдЖрдк рдПрдХ рдЪрд░ рдореЗрдВ nheap() (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди) рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ - рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдареАрдХ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ ref рд╣реЛрддрд╛ рд╣реИ 1. рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЗрд╕ рд▓рд┐рдВрдХ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ - рдЖрдкрдХреЛ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдкреНрд▓рд╕ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддреНрд░рд┐-рд░рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( Setmark() рднреА рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рддреНрд░рд┐-рд░рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЕрднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ):
 Heap *h; uchar *data, *data2; data = H2D(uchar*, nheap(256)); data2 = data; h = D2H(data2); h->ref++; Setmark(h); //   h->color destroy(data); //       destroy(data2); //      

рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдкрдиреЗ рдвреЗрд░ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ *f->ret рдХреЛ рд▓рд┐рдЦрдХрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ ref рдФрд░ color рд╕рд╛рде рдХреБрдЫ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╕реЗ рд▓рд┐рдВрдХ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реИ, рдЪрд░ рдореЗрдВ рдЬрд╣рд╛рдВ рдЙрд╕рдиреЗ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЛ рдмрдЪрд╛рдпрд╛, рдЕрд░реНрдерд╛рддред рдПрдХ рдЪрд╛рд▓ рдереА, рд▓рд┐рдВрдХ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдирд╣реАрдВред

рд╡рд╣рд╛рдБ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдЪрд▓рддреА рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде, рдПрдХ рдирдпрд╛, рдмрд╕ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд▓рд┐рдВрдХ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╡рд╣рд╛рдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреБрдЫ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдПрдХ рд▓рд┐рдВрдХ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╡реИрд░рд┐рдПрдмрд▓ / рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рднреА рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рд╡рд╣ рднреА рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЖрдкрдХреЛ Setmark() рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд╛рдЗ-рдХрд▓рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╣ рднреА рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдлреАрдЪрд░реНрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛):
 dst->data = src->data; src->data = H; Setmark(D2H(dst->data)); 

рдвреЗрд░ рдореЗрдВ рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░

рдКрдкрд░ рд╡рд░реНрдгрд┐рдд nheap() рдЙрджрд╛рд╣рд░рдг рд▓рдЧрднрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рдХрднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд▓рд┐рдореНрдмреЛ рдореЗрдВ рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ: n рдмрд╛рдЗрдЯреНрд╕ред рдЗрд╕рд▓рд┐рдП, рди рддреЛ рд▓рд┐рдореНрдмреЛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рди рд╣реА рд▓рд┐рдореНрдмреЛ рдкрд░ рд▓реМрдЯреЗрдВред рдФрд░ рдЕрдкрдиреЗ рд╕реА-рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрдВрддрд░рд┐рдХ рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, free() рд╕рд╛рде рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдзрд╛рд░рдг malloc() free() ред

рдвреЗрд░ рдореЗрдВ рд╕рднреА рд╡рд╕реНрддреБрдПрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рд▓рд┐рдВрдмреЛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, Type рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рд▓рд┐рдВрдХ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд╣рдЪрд╛рди рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 struct Type { int ref; void (*free)(Heap*, int); void (*mark)(Type*, void*); int size; int np; void* destroy; void* initialize; uchar map[STRUCTALIGN]; }; 

рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП (рдХреЛрдИ рднреА adt / tuple / рд╕рдВрд░рдЪрдирд╛ рдЬрд┐рд╕рдореЗрдВ рдпрд╛ рддреЛ рдЧреИрд░-рд╕рдВрджрд░реНрдн рдлрд╝реАрд▓реНрдб рдпрд╛ рд╕рд╛рдзрд╛рд░рдг рд╣реАрдк рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдВрдХ рд╡рд╛рд▓реЗ рдлрд╝реАрд▓реНрдб рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ destroy() рдорд╛рдзреНрдпрдо рд╕реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ destroy() - рдЬреИрд╕реЗ String* рдФрд░ Array* ) np рдФрд░ map рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред map рдлрд╝реАрд▓реНрдб рдореЗрдВ adt / tuple / рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рдЯ рдорд╛рд╕реНрдХ, рдПрдХ рдмрд┐рдЯ (рдкрд╣рд▓реЗ рдмрд╛рдЗрдЯ рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ) рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗрдЯ рдмрд┐рдЯ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд 4 рдмрд╛рдЗрдЯреНрд╕ рдПрдХ рд╣рдВрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реИред ( np рдлрд╝реАрд▓реНрдб рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ map рдлрд╝реАрд▓реНрдб рдХреА рд▓рдВрдмрд╛рдИ рд╢рд╛рдорд┐рд▓ рд╣реИред)

рдХреБрдЫ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдмрд╣реБрдд рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг String рдФрд░ Array - рдкрд╣рд▓реЗ рдореЗрдВ char* рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕реЗ free() рдорд╛рдзреНрдпрдо рд╕реЗ free() рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП; рджреВрд╕рд░рд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ "рдорд╛рддрд╛-рдкрд┐рддрд╛" рд╕рд░рдгреА рдХрд╛ рд▓рд┐рдВрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред Type рд╕рдВрд░рдЪрдирд╛ рдЖрдкрдХреЛ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдорд╛рдирдХ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рддрдм рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ / рдкреНрд░рд╛рд░рдВрдн рдХреА рдЬрд╛рддреА рд╣реИ, destroy() рдФрд░ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рд╕реЗ: free : free , mark , destroy рдФрд░ initialize ред

size рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЖрдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ (рдЪреВрдВрдХрд┐ рд╣рдо рд╕рднреА рд╕рдорд╛рди рд╣реИрдВ, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдВрджрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╕рд╣реЗрдЬрдХрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛)ред

ref рдлреАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдвреЗрд░ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рдорд╛рдирдХ string , array of , рдЖрджрд┐ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред - рдордХреНрдЦреА рдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ Type рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд▓рд┐рдореНрдмреЛ рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдордХреНрдЦреА рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕реА рдвреЗрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬреИрд╕реЗ рд╣реА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реНрдореГрддрд┐ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП ref рдХреЛ рдмрдврд╝рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдЖрдк рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ destroy() рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ ref рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛ (рдФрд░ рдпрджрд┐ рдореЗрдореЛрд░реА 0 рд╣реЛ рдЬрд╛рддреА рд╣реИ рддреЛ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдВ)ред

рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ Type рдорд╛рдиреЛрдВ рдХреЛ рд╡реИрдзрд╛рдирд┐рдХ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, ref рд╕реЗрдЯ 1 рдХреЗ рд╕рд╛рде (рдЗрд╕рд▓рд┐рдП рдЙрдирдХрд╛ ref рдХрднреА рднреА 1 рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рд╡реЗ рдореЗрдореЛрд░реА рд╕реЗ рдХрднреА рдбрд┐рд▓реАрдЯ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ), рдФрд░ libinterp/head.c рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ:
 Type Tbyte = { 1, 0, 0, 1 }; Type Tword = { 1, 0, 0, sizeof(WORD) }; Type Tptr = { 1, 0, markheap, sizeof(WORD*), 1, 0, 0, { 0x80 } }; Type Tarray = { 1, freearray, markarray, sizeof(Array) }; Type Tstring = { 1, freestring, noptrs, sizeof(String) }; ... 

рдвреЗрд░ рдореЗрдВ рдЕрдкрдиреА рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдмрдирд╛рдПрдВ

рдЖрдкрдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ adt / tuples / рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ libinterp/runt.h рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ( libinterp/runt.h рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ Type.size рдФрд░ Type.map рдФрд░ Type.np рд▓рд┐рдП рд╕реВрдЪрдХ рдлрд╝реАрд▓реНрдб рдХреЗ рдмрд┐рдЯрдорд╛рд╕реНрдХ), рджреВрд╕рд░реЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдкрдиреЗ рдЖрдк (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЯрдкрд▓ рдмрдирд╛рдиреЗ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рддрдм рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рдЖрдк рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рд▓реМрдЯрддреЗ рд╣реБрдП) рдХреЛ dtype() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ dtype() рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдореЗрдореЛрд░реА рдХреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ heap(&Tsometype) рдорд╛рдзреНрдпрдо рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ nheap(n_bytes) ред

рдорд╛рди Example_MyData_map 0x40 рдХрд╛ рдЕрд░реНрде рд╣реИ рдмрд┐рдЯ рдорд╛рд╕реНрдХ 010000 ..., рдЕрд░реНрдерд╛рддред рд╣рдорд╛рд░реА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкрд╣рд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдПрдХ рдкреЙрдЗрдВрдЯрд░ (WORD) рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ (рд╕реНрдЯреНрд░рд┐рдВрдЧ *) рд╣реИред

рд╕рд░рдгреА


рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╕реНрдореГрддрд┐ рдореЗрдВ, рд╕рд░рдгреА рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕реНрдерд┐рдд рд╣реИ: рд╣реАрдк-рд╣реЗрдбрд░, рд╕рд░рдгреА-рд╣реЗрдбрд░, рд╕рд░рдгреА рддрддреНрд╡ред рддрджрдиреБрд╕рд╛рд░, рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрд╕рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдЗрди рддрддреНрд╡реЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЕрдЪрд╛рдирдХ рдЙрдирдореЗрдВ рд▓рд┐рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ H рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ) рдФрд░ рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА рд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ, рдЖрдкрдХреЛ рдЗрди рддрддреНрд╡реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ (рдлрд┐рд░ рдЖрдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдВрджрд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
 struct Array { WORD len; Type* t; Array* root; uchar* data; }; 

рдпрд╣рд╛рдБ len рд╕рд░рдгреА рдХрд╛ рдЖрдХрд╛рд░ рд╣реИ, t рдЗрд╕рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, root рдкреЗрд░реЗрдВрдЯ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП root рдкреЙрдЗрдВрдЯрд░ рд╣реИ (рдпрджрд┐ рдпрд╣ рд╕рд░рдгреА рдЗрд╕рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реИ), рдФрд░ data рдПрд░реЗ рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХрд╛ рд╕реВрдЪрдХ рд╣реИ (рдпрд╣ Array рдмрд╛рдж рдЕрдЧрд▓рд╛ Array рд╣реИ рдпрджрд┐ рд╕рд░рдгреА рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ рдпрд╛ рддрддреНрд╡реЛрдВ рдХреЗ рдмреАрдЪ рд╣рдорд╛рд░реЗ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХрд╛ рдкрддрд╛ рд╣реИ) рдЬрдирдХ рд╕рд░рдгреА)ред

рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд░рдгреА рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЦреБрдж Array рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдФрд░, рддрджрдиреБрд╕рд╛рд░, Tarray.size рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ)ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП heap() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ heaparray() рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдЖрд╡рдВрдЯрди array[16] of byte рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг array[16] of byte :
 Array *arr; arr = H2D(Array*, heaparray(&Tbyte, 16)); 

рдпрд╣рд╛рдБ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдПрдХ рд╕рд░рдгреА рдЯреБрдХрдбрд╝рд╛ рджреЗрддрд╛ рд╣реИ: http://code.google.com/p/inferno-cjson/source/browse/libinterp/cjson.c#59 ред

adt рдФрд░ рд░реЗрдлрд░реА adt

рдХреИрд╕реЗ adt рдФрд░ рд░реЗрдлрд░реА рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рд▓рд┐рдореНрдмреЛ рдФрд░ рд╕реА рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрдВрддрд░ рд╣реИред рдпрджрд┐ рд▓рд┐рдореНрдмреЛ рд╕реНрддрд░ рдкрд░, рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ (рд▓рдЧрднрдЧ) рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ:
 a := array[10] of MyData; b := array[10] of ref MyData; for(i := 0; i < len b; i++) b[i] = ref MyData; a[0].i = b[0].i; 

рддрдм C рд╕реНрддрд░ рдкрд░ рдпреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реИрдВ:
 Array *a, *b; int i; Example_MyData* adata; Example_MyData** bdata; a = H2D(Array*, heaparray(TMyData, 10)); adata = (Example_MyData*)a->data; b = H2D(Array*, heaparray(&Tptr, 10)); bdata = (Example_MyData**)b->data; for(i = 0; i < b->len; i++) bdata[i] = H2D(Example_MyData*, heap(TMyData)); adata[0].i = bdata[0]->i; 

рдЬреАрд╕реА


рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рддреНрд░рд┐-рд░рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╡рд░рдг рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрдиреНрдлрд░реНрдиреЛ рдореЗрдВ, рдЗрди рддреАрди "рд░рдВрдЧреЛрдВ" рдХреЛ mutator , marker рдФрд░ sweeper рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдирдИ рд╡рд╕реНрддреБрдПрдВ h->color=mutator рд╕реЗрдЯ h->color=mutator ред

рдкреНрд░рддреНрдпреЗрдХ рдкреВрд░реНрдг рдЬреАрд╕реА рдЪрдХреНрд░ рдХреЗ рдмрд╛рдж, mutator , marker рдФрд░ sweeper рдЪрд░ рдХреЗ рдорд╛рди рдПрдХ рд╕рд░реНрдХрд▓ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдвреЗрд░ рдореЗрдВ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ h->color рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ:
 mutator -> marker marker -> sweeper sweeper -> mutator //    ..  sweeper   

рдпрджрд┐ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЬреАрд╕реА h->color==sweeper , рддреЛ h рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рддреЛ Setmark() рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред
 #define Setmark(h) if((h)->color!=mutator) { (h)->color = propagator; nprop=1; } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдЗрд╕ рдкрд▓ рдореЗрдВ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрдирдлрд░реНрдиреЛ рдореЗрдВ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреНрдп рдХреЛрдб рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрд╕ рд╕реНрдерд╛рди рд╕реЗ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд░реБрдХрд╛ рдерд╛ред ред рд▓реЗрдХрд┐рди рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП, рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рдкрд╛рд╕ рдореЗрдВ, рдкрд░рдорд╛рдгреБ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЕрдкреНрд░рдпреБрдХреНрдд рд╡рд╕реНрддреБрдУрдВ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрдиреНрдлрд░реНрдиреЛ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдПрдХ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЬреАрд╕реА рд▓реЙрдиреНрдЪ рдХреЗ рдмреАрдЪ рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рджрд┐рд▓рдЪрд╕реНрдк рд╡рд╕реНрддреБрдПрдВ рдмрджрд▓ рдЧрдИ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ ред

рдпрд╣ рддрдВрддреНрд░ Setmark() рд▓рд┐рдП рдХреЙрд▓ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЙрд╕рдХреЗ nprop рдлреНрд▓реИрдЧ GC рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдвреЗрд░ рдореЗрдВ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЗ рдореМрдЬреВрджрд╛ рдЪрдХреНрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЕрдкреНрд░рдпреБрдХреНрдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реБрд░реБрдЖрдд рд╕реЗ рдЪрдХреНрд░ рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдорд╛рди h->color==propagator рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк рдЬреАрд╕реА рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рджреЗрдЦрдиреЗ рдкрд░ h->color mutator рд╕реЗрдЯ mutator ред (рдПрдХ рд╣реА propagator рдореВрд▓реНрдп рдПрдХ рдирдП рдЬреАрд╕реА рдЪрдХреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ "рд░реВрдЯ" рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдкрд░ рд╕реЗрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд╣реАрдВ рд╣реИред)

рдЬреАрд╕реА рд╕реЗ рдвреЗрд░ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛

рдЪреВрдВрдХрд┐ рдЬреАрд╕реА рдореЗрдореЛрд░реА рд╕реЗ рдЙрди рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ рдЬреЛ "рд░реВрдЯ" рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рд╣реИрдВ (рдЬрд┐рд╕рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдбрд┐рд╕реНрдХ рдереНрд░реЗрдбреНрд╕, рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ), рдЙрдирдХреЗ ref рдореВрд▓реНрдп рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: рдХреИрд╕реЗ рдПрдХ рдвреЗрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдбрд┐рд╕ рдереНрд░реЗрдбреНрд╕, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рд╕реА-рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдореЗрдВ, рддрд╛рдХрд┐ рдЬреАрд╕реА рдЗрд╕реЗ рди рдорд╛рд░реЗрдВ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреАрд╕реА рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдпрд╣ рдЬреАрд╕реА рдХреЛ рд╡рд╛рдкрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП poolimmutable() (рд╡рд╣рд╛рдБ poolimmutable() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╣реАрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпреЗ рд╕рднреА рдХрд╛рд░реНрдп emu/port/alloc.c :

Source: https://habr.com/ru/post/In118696/


All Articles