рднрд╛рдЧ 1рд╕рд╛рдордЧреНрд░реА
рдвреЗрд░
рд╕реА рдореЗрдВ рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛рдиреЗ рдФрд░ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд▓рд┐рдВрдмреЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЖрдкрдХреЛ рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдореЗрдореЛрд░реА рдореЗрдВ рдХреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдЗрдирдлрд░реНрдиреЛ рдореЗрдВ рдвреЗрд░ рдХрд╛ рдЖрдпреЛрдЬрди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реАрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ
libinterp/heap.c
рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ
include/interp.h
ред
рдореЗрд░реА рдпрд╛рдж рдореЗрдВ рдХреНрдпрд╛ рд╣реИ ...
рдХреЗрд╡рд▓ рдвреЗрд░ рдореЗрдВ
n
рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
Heap *h; uchar *data; h = nheap(256); data = H2D(uchar*, h); ...
рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ, рдореЗрдореЛрд░реА рдХреЛ 256 + рдвреЗрд░-рд╣реЗрдбрд░ рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд╣реЗрдбрд░ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ред рд╣реЗрдбрд░ рдХреЛ
Heap
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рдкреЙрдЗрдбрд░ рдХреЛ рдбреЗрдЯрд╛ (рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯ рдХреЗ рд╕рд╛рде) рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реЗрдбрд░ рд╣реИрдбрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдореИрдХреНрд░реЛрдЬрд╝ рд╣реИрдВ,
H2D()
рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд
D2H()
ред
destroy()
рдлрд╝рдВрдХреНрд╢рди рдЕрдЬреНрдЮрд╛рдд рд▓рдВрдмрд╛рдИ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдмрдЬрд╛рдп рдвреЗрд░ рд╣реЗрдбрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
D2H()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрддрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреЗ рдмрд╛рдЗрдЯ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
struct Heap { int color; ulong ref; Type* t; ulong hprof; }; #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);
рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдкрдиреЗ рдвреЗрд░ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ
*f->ret
рдХреЛ рд▓рд┐рдЦрдХрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ
ref
рдФрд░
color
рд╕рд╛рде рдХреБрдЫ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╕реЗ рд▓рд┐рдВрдХ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реИ, рдЪрд░ рдореЗрдВ рдЬрд╣рд╛рдВ рдЙрд╕рдиреЗ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЛ рдмрдЪрд╛рдпрд╛, рдЕрд░реНрдерд╛рддред рдПрдХ рдЪрд╛рд▓ рдереА, рд▓рд┐рдВрдХ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдирд╣реАрдВред
рд╡рд╣рд╛рдБ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдЪрд▓рддреА рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде, рдПрдХ рдирдпрд╛, рдмрд╕ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд▓рд┐рдВрдХ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╡рд╣рд╛рдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреБрдЫ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдПрдХ рд▓рд┐рдВрдХ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╡реИрд░рд┐рдПрдмрд▓ / рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рднреА рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рд╡рд╣ рднреА рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЖрдкрдХреЛ
Setmark()
рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд╛рдЗ-рдХрд▓рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╣ рднреА рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдлреАрдЪрд░реНрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛):
dst->data = src->data; src->data = H; Setmark(D2H(dst->data));
рдвреЗрд░ рдореЗрдВ рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд
nheap()
рдЙрджрд╛рд╣рд░рдг рд▓рдЧрднрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рдХрднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд▓рд┐рдореНрдмреЛ рдореЗрдВ рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ: n рдмрд╛рдЗрдЯреНрд╕ред рдЗрд╕рд▓рд┐рдП, рди рддреЛ рд▓рд┐рдореНрдмреЛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рди рд╣реА рд▓рд┐рдореНрдмреЛ рдкрд░ рд▓реМрдЯреЗрдВред рдФрд░ рдЕрдкрдиреЗ рд╕реА-рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрдВрддрд░рд┐рдХ рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ,
free()
рд╕рд╛рде рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдзрд╛рд░рдг
malloc()
free()
ред
рдвреЗрд░ рдореЗрдВ рд╕рднреА рд╡рд╕реНрддреБрдПрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рд▓рд┐рдВрдмреЛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,
Type
рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рд▓рд┐рдВрдХ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд╣рдЪрд╛рди рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
- рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ (рдЗрд╕рдХреЗ рдЕрдВрджрд░ рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЛ
H
рдЙрд░реНрдл nil
); destroy()
(рддрд╛рдХрд┐ рдЬрдм рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдореЗрдореЛрд░реА рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП ref
рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдпрд╛ рдХрдо рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ);- рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХрд╛ рдХрд╛рд░реНрдп (рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЬреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рддреЗ рд╕рдордп рдЕрдиреНрдп рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЕрдВрджрд░ рд╕рдВрджрд░реНрднрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ)ред
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)
ред
module/example.m
Example: module { ... MyData: adt{ i: int; s: string; new: fn(i: int): ref MyData; }; };
libinterp/runt.h
( module/example.m
рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди)
typedef struct Example_MyData Example_MyData; struct Example_MyData { WORD i; String* s; }; #define Example_MyData_size 8 #define Example_MyData_map {0x40,} void MyData_new(void*); typedef struct F_MyData_new F_MyData_new; struct F_MyData_new { WORD regs[NREG-1]; Example_MyData** ret; uchar temps[12]; WORD i; };
рдорд╛рди Example_MyData_map 0x40 рдХрд╛ рдЕрд░реНрде рд╣реИ рдмрд┐рдЯ рдорд╛рд╕реНрдХ 010000 ..., рдЕрд░реНрдерд╛рддред рд╣рдорд╛рд░реА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкрд╣рд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдПрдХ рдкреЙрдЗрдВрдЯрд░ (WORD) рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ (рд╕реНрдЯреНрд░рд┐рдВрдЧ *) рд╣реИред
libinterp/example.c
static Type* TMyData; static uchar MyData_map[] = Example_MyData_map; void examplemodinit(void) { ... TMyData = dtype(freeheap, Example_MyData_size, MyData_map, sizeof(MyData_map)); } void MyData_new(void *fp) { F_MyData_new *f; int i; Example_MyData* mydata; f = fp; i = f->i; mydata = H2D(Example_MyData*, heap(TMyData)); mydata->i = i; destroy(*f->ret); *f->ret = mydata; }
testexample.b
... example: Example; MyData: import example; ... init(nil: ref Draw->Context, nil: list of string) { ... mydata := MyData.new(5); sys->print("i = %d, s = %q\n", mydata.i, mydata.s); } ; testexample ... i = 5, s = '' ;
рд╕рд░рдгреА
рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╕реНрдореГрддрд┐ рдореЗрдВ, рд╕рд░рдгреА рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕реНрдерд┐рдд рд╣реИ: рд╣реАрдк-рд╣реЗрдбрд░, рд╕рд░рдгреА-рд╣реЗрдбрд░, рд╕рд░рдгреА рддрддреНрд╡ред рддрджрдиреБрд╕рд╛рд░, рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрд╕рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдЗрди рддрддреНрд╡реЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЕрдЪрд╛рдирдХ рдЙрдирдореЗрдВ рд▓рд┐рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ
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
: