рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ , рдЙрдкрдХрд░рдг рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рдлреА рдмреБрдирд┐рдпрд╛рджреА рдмрд╛рддреЗрдВ рдмрддрд╛рдИ рдЧрдИ рд╣реИрдВред
рджреВрд╕рд░рд╛ рднрд╛рдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╛рдЗрд▓, рд╡рд┐рдЪрд╛рд░реЛрдВ, рдпреЛрдЬрдирд╛рдУрдВ, рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдгред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╕реА рдФрд░ рдХреЗ / рдПрди рдЗрдВрдЯрд░реЛрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдХрдЯреНрдЯрд░ рд╣реЛрдЧрд╛, рдмрд╣реБрдд рдореИрдХреНрд░реЛрдЬрд╝, рджрд░реНрдж, рдирд┐рд░рд╛рд╢рд╛ рдФрд░ "рдЕрдЪреНрдЫрд╛рдИ рдХреА рдХрд┐рд░рдгреЗрдВ"ред рдмреЗрд╢рдХ рдЙрдкрд▓рдмреНрдзрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдХрд╣рд╛рдиреА рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдзреНрдпрд╛рдп рд╣реЛрдЧрд╛ (рдЖрдкрдиреЗ рдЦреБрдж рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХреА ... рдФрд░ рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдорд╣рд╛рдХрд╛рд╡реНрдп рдЬрд╛рдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдХрд╣рд╛рдиреАред
рдЕрд╕реНрд╡реАрдХрд░рдг: рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рднреА рдХреЛ PHP рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдзреНрдпрд╛рдп рдПрдХ рдЕрдВрддрд░реНрдпрд╛рдореА рднреЛрд▓реЗ
рд╕реА рдореЗрдВ рдХреЗ / рдПрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдЪрдХреНрд░ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдпрд╣рд╛рдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ K / N рдореЗрдВ C рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдмрд▓реНрдХрд┐ рдХрдВрдЬреВрд╕ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд░рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди
.def рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдФрд░ рдЙрд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
headers = php.h
рдлрд┐рд░ рдЗрд╕реЗ
рд╕рд┐рдиреЗрдЯрд░реЙрдк рдирд╛рдордХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ
рдЦрд┐рд▓рд╛рдПрдВ ред
# cinterop -def php.def -o php
рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ, рдЖрдкрдХреЛ
libvp.klib рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдорд┐рд▓реЗрдЧреА рдЬрд┐рд╕рдореЗрдВ llvm рдмрд┐рдЯрдХреЛрдб рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдореЗрдЯрд╛-рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред
рдлрд┐рд░ рдЖрдк рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрд▓рдХрд░, рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ (
#define
) рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
# kotlinc -opt -produce static ${SOURCES} -l libphp.klib -o myLib
рд▓реЗрдХрд┐рди рдПрдХ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИред рдФрд░ рдПрдХ рдирд╣реАрдВред
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд░реВрдк рдореЗрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЗрдХрдЯреНрдард╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рдХреНрдпреЛрдВ? рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ php.h рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ:
#include "php_version.h" #include "zend.h" #include "zend_sort.h" #include "php_compat.h" #include "zend_API.h"
рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ llvm рдЕрднреА рднреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ
-I рд╕реНрд╡рд┐рдЪ рд╣реИ , рдФрд░ рд╕рд┐рдВрдЯрд░рдЯреЙрдк рдореЗрдВ
-copt рд╕реНрд╡рд┐рдЪ рд╣реИ ред рдЦреИрд░, рдЖрдк рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, рдЗрд╕ рддрд░рд╣ рдХреА рдХрдорд╛рдВрдб
php.h рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
# cinterop -def my.def -o myLib -I${PHP_LIB_ROOT} -copt -I${PHP_LIB_ROOT} \ -copt -I${PHP_LIB_ROOT}/main \ -copt -I${PHP_LIB_ROOT}/Zend \ -copt -I${PHP_LIB_ROOT}/TSRM
рдореИрдХреНрд░реЛред рдореИрдВ рддреБрдорд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдБ рдФрд░ рдирдлрд░рдд рдХрд░рддрд╛ рд╣реВрдБ! рдирд╣реАрдВ, рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдирдлрд╝рд░рдд рд╣реИред
рдЖрдкрдХреЛ C> K / N
#define
рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ
#define
рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛
рдкреНрд░рддреНрдпреЗрдХ C рдореИрдХреНрд░реЛ рдЬреЛ рдХрд┐рд╕реА рд╕реНрдерд┐рд░рд╛рдВрдХ рддрдХ рдлреИрд▓рддрд╛ рд╣реИ, рдХреЛ рдХреЛрдЯрд▓рд┐рди рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреНрдп рдореИрдХреНрд░реЛрдЬрд╝ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред
рдФрд░ рдлрд┐рд░ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ PHP рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореИрдХреНрд░реЛ рдкрд░ рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ рдФрд░ рдореИрдХреНрд░реЛ рдбреНрд░рд╛рдЗрд╡ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд░реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЗрд░реНрдж-рдЧрд┐рд░реНрдж рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, K / N рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ
рдХрд╕реНрдЯрдо рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрд▓реЗ рдмрд┐рдЬрд▓реА рдХреЗ рдЯреЗрдк рдХрд╛ рдПрдХ рд░реЛрд▓ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдХреНрд░реЛ
Z_TYPE_P
)
headers = php.h --- static inline zend_uchar __zp_get_arg_type(zval *z_value) { return Z_TYPE_P(z_value); }
рдЕрдм K / N рдХреЛрдб рдореЗрдВ
__zp_get_arg_type
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛
рдЕрдзреНрдпрд╛рдп рджреЛ PHP INI- рд╕реЗрдЯрд┐рдВрдЧ рдпрд╛ рдПрдХ рд╕рдм-рд╕рдм рдореИрдХреНрд░реЛред
рдпрд╣ PHP рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдУрд░ рдПрдХ "рдЕрдЪреНрдЫреА рдХрд┐рд░рдг" рд╣реИред
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП 4 рдореИрдХреНрд░реЛ рд╣реИрдВ:
INI_INT(val) INI_FLT(val) INI_STR(val) INI_BOOL(val)
рдЬрд╣рд╛рдВ
val
рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИред
рдЕрдм рдЖрдЗрдП
INI_STR
рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдореИрдХреНрд░реЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред
#define INI_STR(name) zend_ini_string_ex((name), sizeof(name)-1, 0, NULL)
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ "рдШрд╛рддрдХ рджреЛрд╖" рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛?
рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛ рджреВрдВ - рдпрд╣
sizeof
рд╕рдорд╛рд░реЛрд╣ рд╣реИред рдЬрдм рдЖрдк рд╕реАрдзреЗ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ:
php_printf("The value is : %s", INI_STR("my.ini"));
рдЬрдм рдЖрдк
.def рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкреНрд░реЙрдХреНрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЧрд╛рдбрд╝реА рдХрджреНрджреВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ, рдФрд░
рдЖрдХрд╛рд░ (рдирд╛рдо) рд╕реВрдЪрдХ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЪреЗрдХрдореЗрдЯ рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЪрдХреНрдХрд░ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред
- рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдХрд╛рд░реНрдп рдЬреЛ рд╡реЗ рд╕рдВрд▓рдЧреНрди рд╣реИрдВред
- рд╣рд╛рд░реНрдбрдХреЛрдб рдЖрд╡рд░рдг рдкреНрд░рддреНрдпреЗрдХ рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рднреА рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ, рдПрдХ рдмрд┐рдВрджреБ рдХреЛ рдЫреЛрдбрд╝рдХрд░ - рдХреЛрдИ рднреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрдЧрд╛ рдХрд┐ рдореИрдХреНрд░реЛ рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдмрджрд▓реЗрдЧреАред рдЗрд╕рд▓рд┐рдП, рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ, рдЧрд╣рд░реА рдЕрд╕рдВрддреЛрд╖ рдХреА рднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде, рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ред
рдЕрдзреНрдпрд╛рдп рддреАрди рдбрд┐рдмрдЧ? рдХреНрдпрд╛ рдбреАрдмрдЧ?
рдПрдХреНрдЯ 1 - рдЗрдВрдЯрд░реЛрдкред
рдПрдХ рдмрд┐рдВрджреБ рдкрд░, 20 рд▓рдЧрд╛рддрд╛рд░ рдкреНрд░реЙрдХреНрд╕реА рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмреНрд▓реВ рдЯреЗрдк рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрдХ рдЕрджреНрднреБрдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред
Exception in thread "main" java.lang.Error: /tmp/tmp399964332777824085.c:103:38: error: too many arguments to function call, expected 2, have 3 at org.jetbrains.kotlin.native.interop.indexer.UtilsKt.ensureNoCompileErrors(Utils.kt:137) at org.jetbrains.kotlin.native.interop.indexer.IndexerKt.indexDeclarations(Indexer.kt:902) at org.jetbrains.kotlin.native.interop.indexer.IndexerKt.buildNativeIndexImpl(Indexer.kt:892) at org.jetbrains.kotlin.native.interop.indexer.NativeIndexKt.buildNativeIndex(NativeIndex.kt:56) at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.processCLib(main.kt:283) at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.interop(main.kt:38) at org.jetbrains.kotlin.cli.utilities.InteropCompilerKt.invokeInterop(InteropCompiler.kt:100) at org.jetbrains.kotlin.cli.utilities.MainKt.main(main.kt:29)

рдЖрдзрд╛ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ, рдлрд┐рд░ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ, рдпрджрд┐ рдмрд╛рдХреА рдХреЗ рдЖрдзреЗ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рджреЛрд╣рд░рд╛рдИ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ ... рдФрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣реЗрдбрд░ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рд▓рдВрдмреА рд╣реИ ... (рд╣рд╛рдБ, рдпрд╣ рдПрдХ рджрд░реНрдЬрди рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдЪрдврд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдФрд░ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЖрд╡рд░реНрдзрдХ рдЧреНрд▓рд╛рд╕, рд╕рд╛рдордВрдЬрд╕реНрдп рдХреЗ рд╕рд╛рде)ред
рджреВрд╕рд░рд╛ "рд░реЗ рдХреА рдЧреБрдб" рдЬреЗрдЯрдмреНрд░реЗрди рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдзрд┐рдирд┐рдпрдо 2 - рдХреНрд░рдоред
рдореБрдЭреЗ рд░рдирдЯрд╛рдЗрдо
рд╕реЗрдЧрдореЗрдВрдЯреЗрд╢рди рдореЗрдВ рдЦрд░рд╛рдмреА рд╣реИ ред рдЕрдЪреНрдЫрд╛ рдареАрдХ рд╣реИ, рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдбрд┐рдмрдЧрд░ рдореЗрдВ рдЪрдврд╝ рд░рд╣рд╛ рд╣реВрдВред рдЙрдореНрдореНрдо ... рдПрд╕рдЯреАрдП?
Program received signal SIGSEGV, Segmentation fault. kfun:kotlinx.cinterop.toKString@kotlinx.cinterop.CPointer<kotlinx.cinterop.ByteVarOf<kotlin.Byte>>.()kotlin.String () at /opt/buildAgent/work/4d622a065c544371/Interop/Runtime/src/main/kotlin/kotlinx/cinterop/Utils.kt:402 402 /opt/buildAgent/work/4d622a065c544371/Interop/Runtime/src/main/kotlin/kotlinx/cinterop/Utils.kt: No such file or directory.
рдЕрдзреНрдпрд╛рдп рдЪрд╛рд░ рдореИрдВрдиреЗ рдЖрдкрдХреА рдЪрд╛рдп рдореЗрдВ рдЪрд╛рдп рдбрд╛рд▓реА рддрд╛рдХрд┐ рдЖрдк рдЪрд╛рдп рдкреАрддреЗ рд╕рдордп рдЪрд╛рдп рдкреА рд╕рдХреЗрдВред
рдпрд╣рд╛рдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдореИрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдмрдХрд╡рд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред
рдЖрдк рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреАрдПрдЪрдкреА рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдбреАрдПрд╕рдПрд▓ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди, рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХреЗ / рдПрди рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдлрд┐рд░
make
рд░рди рдХрд░рддреЗ
make
рдФрд░ рдЪрдорддреНрдХрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХ рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреАрдПрдЪрдкреА рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ 4 рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- C рдФрд░ K / N (рд╕рдорд╛рди
cinterop
) рдХреЗ рдмреАрдЪ рдПрдХ рдкрд░рдд рдмрдирд╛рдирд╛ - рд╡рд┐рд╕реНрддрд╛рд░ рд╕реА рдХреЛрдб рдкреАрдврд╝реА
- рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди
- рд▓рдХреНрд╖реНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╕рдВрдХрд▓рди
рд▓рдХреНрд╖реНрдп K / N рдХреЛрдб рдореЗрдВ рдПрдХ PHP рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рдХрд┐ рд╡рд░реНрдЧ
getInstance()
рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХреЗред рдФрд░ рдореИрдВ рдЗрд╕реЗ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛред
рд╕реА рдореЗрдВ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдПрдХ рдпрд╛ рджреЛ рдмрд╛рд░ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред
zval *obj = malloc(sizeof(zval)); object_init_ex(obj, myClass);
рдпрд╣ рд╕рд░рд▓ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ - рдЗрд╕реЗ рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдХреЗ / рдПрди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ
myClass
...
рд▓реЗрдХрд┐рди
zend_class_entry*
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд╣реИ, рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕реА рдХреЛрдб рдореЗрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдЬреНрдЮрд╛рдд рдирд╛рдо рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдкрдиреЗ рд╣рд╛рде рджреЗрдЦреЛред рдЖрдкрдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ K / N рдХреЛрдб рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ
myClass
рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЙрддреНрдкрдиреНрди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рд╕реА-рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рддрдм рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдВрддрдд: рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рд╕реЗ рджреЛ рдирдИ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХрд╛
рд╕рдорд╛рд╡реЗрд╢ рд╣реБрдЖ:
.h рдФрд░
.kt рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХреЗ рдЪрд░рдг рдореЗрдВ, рд╕рд┐рдВрдЯрд░рдЯреЙрдк рдЪрд░рдг рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рдПрдкрд┐рдХ рдлреЗрдХреИрдк, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред
рдЕрдзреНрдпрд╛рдп рдкрд╛рдБрдЪ рдореЗрд░реЗ рдирд╛рдо рдореЗрдВ рдХреНрдпрд╛ рд╣реИ?
рдХреНрдпреЛрдВ рдХреА рдХрдерд╛:
enum class ArgumentType { PHP_STRING, PHP_LONG, PHP_DOUBLE, PHP_NULL, ... }
рдЗрд╕рд╕реЗ рдмреЗрд╣рддрд░:
enum class ArgumentType { STRING, LONG, DOUBLE, NULL, ... }
рд╣рд╛рдВ, рдЗрд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ
ArgumentType.NULL
рдХреЛрдЯрд▓рд┐рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ:
struct { extension_kt_kref_php_extension_dsl_ArgumentType (*get)(); } NULL;
рдФрд░ рдпрд╣ рдХреИрд╕реЗ gcc рдЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред
/root/simpleExtension/phpmodule/extension_kt_api.h:113:17: error: expected identifier or '(' before 'void' } NULL; ^
рдкрд░реНрджрд╛! рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рджреЗрдЦреЛред
рддрдкрд╕реНрдпрд╛ рдЕрдзреНрдпрд╛рдпред рдЖрдк рдЦреБрдж рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рдХреЛрдИ рднреА рдЖрдкрдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓рд┐рдП рд╣реИрдВред рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдбреВрдмреЗ, рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ рдкрд░ PHP рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП "рд░реВрдкрд░реЗрдЦрд╛" рддреИрдпрд╛рд░ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдкреЙрд▓рд┐рд╢ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╣реАрдВ рд╣реИред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЦреБрдж рдФрд░, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдкреНрд░рд▓реЗрдЦрди,
рдЬреАрдердм рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВ K / N рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреЗрд╡рд▓ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЗрд╕ рдкрд░ рд▓рд┐рдЦрдирд╛ рдПрдХ рдЦреБрд╢реА рд╣реИ, рдФрд░ рдЫреЛрдЯреЗ рд╢реЛрд▓реЗ рдФрд░ рдЦреБрд░рджрд░рд╛рдкрди рдХреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХреНрд░реИрдбрд▓ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓рд╛ рд╣реИ :)
рдЖрдЦрд┐рд░реА рдЕрдзреНрдпрд╛рдпред рдмрд┐рдирд╛ рдХреЛрдЯреНрд╕ рдХреЗ, рдЕрдЪреНрдЫреА рдХреА рдХрд┐рд░рдгреЗрдВред
рдФрд░ рдЕрдм, рдкреВрд░реА рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдФрд░ рдЧрд╣рд░реЗ рд╕рдореНрдорд╛рди рдХреЗ рд╕рд╛рде, рдореИрдВ JetBrains рдХреЗ рд▓реЛрдЧреЛрдВ рдФрд░ Kotlin рдиреЗрдЯрд┐рд╡ рд╕реНрд▓реИрдм рдЪреИрдирд▓ рдХреЗ рдирд┐рд╡рд╛рд╕рд┐рдпреЛрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЖрдк рд╕реБрдкрд░ рд╣реИрдВ!
рдФрд░
рдирд┐рдХреЛрд▓рд╕ рдЗрдЧреЛрдЯреА рдХреЛ рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рджред
рдмреЛрдирд╕ред рдорд╣рд╛рдХрд╛рд╡реНрдп рдлрдХрдкред
рдЪреМрдереЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдкреНрд░рд╕рдВрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рджрд░рдЕрд╕рд▓, рдЬрдм рд╕рдм рдХреБрдЫ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рд╣реБрдИ - рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, PHP рдиреЗ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рдкрдХреНрд╖ рд╕реЗ рдЦреЛрд▓рд╛ред
# php -dextension=./phpmodule/modules/extension.so -r "var_dump(ExampleClass::getInstance());" *RECURSION* #
"Figase!" - рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдореИрдВ PHP рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдорд┐рд▓рд╛ рдФрд░ рдРрд╕рд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдорд┐рд▓рд╛ред
case IS_OBJECT: if (Z_IS_RECURSIVE_P(struc)) { PUTS("*RECURSION*\n"); return; }
рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬреЛрдбрд╝рдирд╛:
printf("%u", Z_IS_RECURSIVE_P(struc))
рдХреЗ рдиреЗрддреГрддреНрд╡ рдореЗрдВ:
undefined symbol: Z_IS_RECURSIVE_P in Unknown on line 0
"Figase!" рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЛрдЪрд╛ред
рдЙрд╕ рд╕рдордп, рдЬрдм рдореИрдВрдиреЗ php.h (7.1.8) рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдерд╛, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рд╣реЛрд╕реНрдЯ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рди рдХрд┐ рдорд╛рд╕реНрдЯрд░ рдмреНрд░рдВрдЪ (7.3.x) рд╕реЗ рдЬреАрдердм рд╕реЗ рдЦреАрдВрдЪрд╛ рдЧрдпрд╛ рдПрдХ рджрд┐рдиред рд╕реАрдзреЗ рд▓рдЬреНрдЬрд┐рдд рд╣реБрдПред
рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдпрд╣ рдПрдХ рдЕрдЯреЗрд░рди рдирд╣реАрдВ рдерд╛ред
рдореИрдВрдиреЗ рдЬрд┐рд╕ рд╡рд╕реНрддреБ рдХреЗ рдЬреАрд╡рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛, рдЙрд╕рдХреЗ рд╕рднреА рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕рд╣реА рдкреБрдирд░рд╛рд╡рд░реНрддрди рдЬрд╛рдБрдЪ рдХреЛрдб, рдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЙрди рдЬрдЧрд╣реЛрдВ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдРрд╕реА рдЪреАрдЬ рдереА - рдЬрд┐рд╕рдореЗрдВ рдореЗрд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ
var_dump
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ
RETURN_OBJ( example_symbols()->kotlin.root.php.extension.proxy.objectToZval( example_symbols()->kotlin.root.exampleclass.getInstance() ) )
рдореИрдХреНрд░реЛ RETURN_OBJ рдХреЛ рдЕрдВрдд рддрдХ рдЦреЛрд▓реЗрдВред рддрдВрддреНрд░рд┐рдХрд╛ рдФрд░ рдЧрд░реНрднрд╡рддреА рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рд╕реЗ рджреВрд░!
1) RETURN_OBJ(r) 2) { RETVAL_OBJ(r); return; } 3) { ZVAL_OBJ(return_value, r); return; } 4) { do { zval *__z = (return_value); Z_OBJ_P(__z) = (r); Z_TYPE_INFO_P(__z) = IS_OBJECT_EX; } while (0); return; } 5) { do { zval *__z = (return_value); Z_OBJ(*(__z)) = (r); Z_TYPE_INFO(*(__z)) = (IS_OBJECT | (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT)); } while (0); return; } 6) { do { zval *__z = (return_value); (*(__z)).value.obj = (r); (*(__z)).u1.type_info = (8 | ((1<<0) << 8)); } while (0); return; }
рдпрд╣рд╛рдВ рддрдм рдореБрдЭреЗ рджреВрд╕рд░реА рдмрд╛рд░ рд╢рд░реНрдо рдорд╣рд╕реВрд╕ рд╣реБрдИред рдореИрдВ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрдиреА рдиреАрд▓реА рдЖрдБрдЦ рдкрд░,
zval*
zend_object*
рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░ рд░рд╣рд╛
zend_object*
рдФрд░ рд▓рдЧрднрдЧ рджреЛ рджрд┐рди рддреНрд░реБрдЯрд┐ рдХреА рдЦреЛрдЬ рдореЗрдВ рдмрд┐рддрд╛рдПред
рд╕рднреА рдХреЛ рдХреЛрдЯрд▓рд┐рди рдХрд╛ рд╢реБрдХреНрд░рд┐рдпрд╛! :)
рдкреБрдирд╢реНрдЪред рдпрджрд┐ рдПрдХ рджрдпрд╛рд▓реБ рдЖрддреНрдорд╛ рд╣реИ рдЬреЛ рдореЗрд░реА рдЕрдирд╛рдбрд╝реА рдЕрдВрдЧреНрд░реЗрдЬреА рдкрдврд╝рддреА рд╣реИ рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдареАрдХ рдХрд░рддреА рд╣реИ - рддреЛ рдореЗрд░реА рдХреГрддрдЬреНрдЮрддрд╛ рдХреА рдХреЛрдИ рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред