PHP 소스 코드를 읽으면 많은 매크로를 접하게 됩니다. 이러한 매크로의 의미를 이해하지 못하면 코드를 이해하는데 많은 어려움을 겪게 됩니다. 이제 두 매크로 CG와 EG의 의미를 살펴보겠습니다.
CG
의미
CG의 의미는 컴파일러_글로벌입니다. Zend 컴파일러 관련 전역 변수.
Function
PHP 코드는 결국 실행을 위해 Opcode로 변환된다는 사실은 누구나 알고 있습니다. PHP에서 Opcode로 변환하는 동안 일부 정보를 저장해야 합니다. 이 정보는 CG 전역 변수에 저장됩니다.
Zend가 PHP 코드를 Opcode로 변환하고 GC 전역 변수를 사용하여 해당 정보를 저장하는 방법을 알고 싶다면 Zend/zend_언어_scanner.c 파일
Code
의 compile_file(zend_file_handle *file_handle, int type) 메서드를 볼 수 있습니다.Zend의 /zend_globals_macros.h 파일에는 이 매크로에 대한 관련 코드가 포함되어 있습니다. 다음과 같습니다:
/* Compiler */ #ifdef ZTS <h1>define CG(v) ZEND_TSRMG(compiler_globals_id, zend_compiler_globals *, v)</h1> #else <h1>define CG(v) (compiler_globals.v)</h1> extern ZEND_API struct _zend_compiler_globals compiler_globals; #endif
EG
meaning
EG는 executor_globals를 의미합니다. Zend 실행기와 관련된 전역 변수입니다.
Function
Zend 엔진이 Opcode를 실행할 때 실행 중 일부 상태를 기록해야 합니다. 예를 들어 현재 실행 중인 클래스의 범위, 현재 로드되는 파일 등입니다.
Code
Zend/zend_globals_macros.h 파일에 이 매크로에 대한 관련 코드가 있습니다. 다음과 같습니다:
/* Executor */ #ifdef ZTS <h1>define EG(v) ZEND_TSRMG(executor_globals_id, zend_executor_globals *, v)</h1> #else <h1>define EG(v) (executor_globals.v)</h1> extern ZEND_API zend_executor_globals executor_globals;
Others
EG와 CG는 일부 데이터를 공유합니다. 예를 들어 function_table(스토리지 메서드 정보), class_table(스토리지 클래스 정보)입니다.
해당 코드는 Zend/zend_execute_API.c의 init_executor 메소드에서 다음과 같이 발견되었습니다.
void init_executor(void) /* {{{ */ { zend_init_fpu(); ...... EG(function_table) = CG(function_table); EG(class_table) = CG(class_table); ...... }
위 내용은 PHP7 소스 코드의 CG 및 EG 매크로에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!