php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
phpdbg_info.c
Go to the documentation of this file.
1/*
2 +----------------------------------------------------------------------+
3 | Copyright (c) The PHP Group |
4 +----------------------------------------------------------------------+
5 | This source file is subject to version 3.01 of the PHP license, |
6 | that is bundled with this package in the file LICENSE, and is |
7 | available through the world-wide-web at the following url: |
8 | https://www.php.net/license/3_01.txt |
9 | If you did not receive a copy of the PHP license and are unable to |
10 | obtain it through the world-wide-web, please send a note to |
11 | license@php.net so we can mail you a copy immediately. |
12 +----------------------------------------------------------------------+
13 | Authors: Felipe Pena <felipe@php.net> |
14 | Authors: Joe Watkins <joe.watkins@live.co.uk> |
15 | Authors: Bob Weinand <bwoebi@php.net> |
16 +----------------------------------------------------------------------+
17*/
18
19#include "php.h"
20#include "phpdbg.h"
21#include "phpdbg_utils.h"
22#include "phpdbg_info.h"
23#include "phpdbg_bp.h"
24#include "phpdbg_prompt.h"
25
27
28#define PHPDBG_INFO_COMMAND_D(f, h, a, m, l, s, flags) \
29 PHPDBG_COMMAND_D_EXP(f, h, a, m, l, s, &phpdbg_prompt_commands[13], flags)
30
32 PHPDBG_INFO_COMMAND_D(break, "show breakpoints", 'b', info_break, NULL, 0, PHPDBG_ASYNC_SAFE),
33 PHPDBG_INFO_COMMAND_D(files, "show included files", 'F', info_files, NULL, 0, PHPDBG_ASYNC_SAFE),
34 PHPDBG_INFO_COMMAND_D(classes, "show loaded classes", 'c', info_classes, NULL, 0, PHPDBG_ASYNC_SAFE),
35 PHPDBG_INFO_COMMAND_D(funcs, "show loaded classes", 'f', info_funcs, NULL, 0, PHPDBG_ASYNC_SAFE),
36 PHPDBG_INFO_COMMAND_D(error, "show last error", 'e', info_error, NULL, 0, PHPDBG_ASYNC_SAFE),
37 PHPDBG_INFO_COMMAND_D(constants, "show user defined constants", 'd', info_constants, NULL, 0, PHPDBG_ASYNC_SAFE),
38 PHPDBG_INFO_COMMAND_D(vars, "show active variables", 'v', info_vars, NULL, 0, PHPDBG_ASYNC_SAFE),
39 PHPDBG_INFO_COMMAND_D(globals, "show superglobals", 'g', info_globals, NULL, 0, PHPDBG_ASYNC_SAFE),
40 PHPDBG_INFO_COMMAND_D(literal, "show active literal constants", 'l', info_literal, NULL, 0, PHPDBG_ASYNC_SAFE),
41 PHPDBG_INFO_COMMAND_D(memory, "show memory manager stats", 'm', info_memory, NULL, 0, PHPDBG_ASYNC_SAFE),
43};
44
45PHPDBG_INFO(break) /* {{{ */
46{
56
57 return SUCCESS;
58} /* }}} */
59
60PHPDBG_INFO(files) /* {{{ */
61{
62 zend_string *fname;
63
65 phpdbg_notice("Included files: %d", zend_hash_num_elements(&EG(included_files)));
67 phpdbg_error("Could not fetch included file count, invalid data source");
68 return SUCCESS;
70
72 ZEND_HASH_MAP_FOREACH_STR_KEY(&EG(included_files), fname) {
73 phpdbg_writeln("File: %s", ZSTR_VAL(fname));
76 phpdbg_error("Could not fetch file name, invalid data source, aborting included file listing");
78
79 return SUCCESS;
80} /* }}} */
81
82PHPDBG_INFO(error) /* {{{ */
83{
84 if (PG(last_error_message)) {
86 phpdbg_writeln("Last error: %s at %s line %d",
87 ZSTR_VAL(PG(last_error_message)),
88 ZSTR_VAL(PG(last_error_file)),
89 PG(last_error_lineno));
91 phpdbg_notice("No error found!");
93 } else {
94 phpdbg_notice("No error found!");
95 }
96 return SUCCESS;
97} /* }}} */
98
99PHPDBG_INFO(constants) /* {{{ */
100{
103
105
106 if (EG(zend_constants)) {
108 ZEND_HASH_MAP_FOREACH_PTR(EG(zend_constants), data) {
110 zend_hash_update_ptr(&consts, data->name, data);
111 }
114 phpdbg_error("Cannot fetch all the constants, invalid data source");
116 }
117
118 phpdbg_notice("User-defined constants (%d)", zend_hash_num_elements(&consts));
119
120 if (zend_hash_num_elements(&consts)) {
121 phpdbg_out("Address Refs Type Constant\n");
123
124#define VARIABLEINFO(msg, ...) \
125 phpdbg_writeln( \
126 "%-18p %-7d %-9s %.*s" msg, &data->value, \
127 Z_REFCOUNTED(data->value) ? Z_REFCOUNT(data->value) : 1, \
128 zend_get_type_by_const(Z_TYPE(data->value)), \
129 (int) ZSTR_LEN(data->name), ZSTR_VAL(data->name), ##__VA_ARGS__)
130
131 switch (Z_TYPE(data->value)) {
132 case IS_STRING:
134 VARIABLEINFO("\nstring (%zd) \"%.*s%s\"", Z_STRLEN(data->value), Z_STRLEN(data->value) < 255 ? (int) Z_STRLEN(data->value) : 255, Z_STRVAL(data->value), Z_STRLEN(data->value) > 255 ? "..." : "");
136 VARIABLEINFO("");
138 break;
139 case IS_TRUE:
140 VARIABLEINFO("\nbool (true)");
141 break;
142 case IS_FALSE:
143 VARIABLEINFO("\nbool (false)");
144 break;
145 case IS_LONG:
146 VARIABLEINFO("\nint ("ZEND_LONG_FMT")", Z_LVAL(data->value));
147 break;
148 case IS_DOUBLE:
149 VARIABLEINFO("\ndouble (%lf)", Z_DVAL(data->value));
150 break;
151 default:
152 VARIABLEINFO("");
153
154#undef VARIABLEINFO
155 }
157 }
158
159 return SUCCESS;
160} /* }}} */
161
162static int phpdbg_arm_auto_global(zval *ptrzv) {
163 zend_auto_global *auto_global = Z_PTR_P(ptrzv);
164
165 if (auto_global->armed) {
167 phpdbg_notice("Cannot show information about superglobal variable %.*s", (int) ZSTR_LEN(auto_global->name), ZSTR_VAL(auto_global->name));
168 } else {
169 auto_global->armed = auto_global->auto_global_callback(auto_global->name);
170 }
171 }
172
173 return 0;
174}
175
176static int phpdbg_print_symbols(bool show_globals) {
177 HashTable vars;
178 zend_array *symtable;
179 zend_string *var;
180 zval *data;
181
182 if (!EG(current_execute_data) || !EG(current_execute_data)->func) {
183 phpdbg_error("No active op array!");
184 return SUCCESS;
185 }
186
187 if (show_globals) {
188 /* that array should only be manipulated during init, so safe for async access during execution */
189 zend_hash_apply(CG(auto_globals), (apply_func_t) phpdbg_arm_auto_global);
190 symtable = &EG(symbol_table);
191 } else if (!(symtable = zend_rebuild_symbol_table())) {
192 phpdbg_error("No active symbol table!");
193 return SUCCESS;
194 }
195
196 zend_hash_init(&vars, 8, NULL, NULL, 0);
197
200 if (zend_is_auto_global(var) ^ !show_globals) {
201 zend_hash_update(&vars, var, data);
202 }
205 phpdbg_error("Cannot fetch all data from the symbol table, invalid data source");
207
208 if (show_globals) {
209 phpdbg_notice("Superglobal variables (%d)", zend_hash_num_elements(&vars));
210 } else {
211 zend_op_array *ops = &EG(current_execute_data)->func->op_array;
212
213 if (ops->function_name) {
214 if (ops->scope) {
215 phpdbg_notice("Variables in %s::%s() (%d)", ops->scope->name->val, ops->function_name->val, zend_hash_num_elements(&vars));
216 } else {
217 phpdbg_notice("Variables in %s() (%d)", ZSTR_VAL(ops->function_name), zend_hash_num_elements(&vars));
218 }
219 } else {
220 if (ops->filename) {
221 phpdbg_notice("Variables in %s (%d)", ZSTR_VAL(ops->filename), zend_hash_num_elements(&vars));
222 } else {
223 phpdbg_notice("Variables @ %p (%d)", ops, zend_hash_num_elements(&vars));
224 }
225 }
226 }
227
228 if (zend_hash_num_elements(&vars)) {
229 phpdbg_out("Address Refs Type Variable\n");
232 const char *isref = "";
233#define VARIABLEINFO(msg, ...) \
234 phpdbg_writeln( \
235 "%-18p %-7d %-9s %s$%.*s" msg, data, Z_REFCOUNTED_P(data) ? Z_REFCOUNT_P(data) : 1, zend_get_type_by_const(Z_TYPE_P(data)), isref, (int) ZSTR_LEN(var), ZSTR_VAL(var), ##__VA_ARGS__)
236retry_switch:
237 switch (Z_TYPE_P(data)) {
238 case IS_RESOURCE:
241 VARIABLEINFO("\n|-------(typeof)------> (%s)\n", type ? type : "unknown");
243 VARIABLEINFO("\n|-------(typeof)------> (unknown)\n");
245 break;
246 case IS_OBJECT:
248 VARIABLEINFO("\n|-----(instanceof)----> (%s)\n", ZSTR_VAL(Z_OBJCE_P(data)->name));
250 VARIABLEINFO("\n|-----(instanceof)----> (unknown)\n");
252 break;
253 case IS_STRING:
255 VARIABLEINFO("\nstring (%zd) \"%.*s%s\"", Z_STRLEN_P(data), Z_STRLEN_P(data) < 255 ? (int) Z_STRLEN_P(data) : 255, Z_STRVAL_P(data), Z_STRLEN_P(data) > 255 ? "..." : "");
257 VARIABLEINFO("");
259 break;
260 case IS_TRUE:
261 VARIABLEINFO("\nbool (true)");
262 break;
263 case IS_FALSE:
264 VARIABLEINFO("\nbool (false)");
265 break;
266 case IS_LONG:
268 break;
269 case IS_DOUBLE:
270 VARIABLEINFO("\ndouble (%lf)", Z_DVAL_P(data));
271 break;
272 case IS_REFERENCE:
273 isref = "&";
275 goto retry_switch;
276 case IS_INDIRECT:
278 goto retry_switch;
279 default:
280 VARIABLEINFO("");
281 }
282#undef VARIABLEINFO
284 phpdbg_writeln("%p\tn/a\tn/a\t$%s", data, ZSTR_VAL(var));
287 }
288
289 zend_hash_destroy(&vars);
290
291 return SUCCESS;
292} /* }}} */
293
294PHPDBG_INFO(vars) /* {{{ */
295{
296 return phpdbg_print_symbols(0);
297}
298
299PHPDBG_INFO(globals) /* {{{ */
300{
301 return phpdbg_print_symbols(1);
302}
303
304PHPDBG_INFO(literal) /* {{{ */
305{
306 /* literals are assumed to not be manipulated during executing of their op_array and as such async safe */
307 bool in_executor = PHPDBG_G(in_execution) && EG(current_execute_data) && EG(current_execute_data)->func;
308 if (in_executor || PHPDBG_G(ops)) {
309 zend_op_array *ops = in_executor ? &EG(current_execute_data)->func->op_array : PHPDBG_G(ops);
310 int literal = 0, count = ops->last_literal - 1;
311
312 if (ops->function_name) {
313 if (ops->scope) {
314 phpdbg_notice("Literal Constants in %s::%s() (%d)", ops->scope->name->val, ops->function_name->val, count);
315 } else {
316 phpdbg_notice("Literal Constants in %s() (%d)", ops->function_name->val, count);
317 }
318 } else {
319 if (ops->filename) {
320 phpdbg_notice("Literal Constants in %s (%d)", ZSTR_VAL(ops->filename), count);
321 } else {
322 phpdbg_notice("Literal Constants @ %p (%d)", ops, count);
323 }
324 }
325
326 while (literal < ops->last_literal) {
327 if (Z_TYPE(ops->literals[literal]) != IS_NULL) {
328 phpdbg_write("|-------- C%u -------> [", literal);
329 zend_print_zval(&ops->literals[literal], 0);
330 phpdbg_out("]\n");
331 }
332 literal++;
333 }
334 } else {
335 phpdbg_error("Not executing!");
336 }
337
338 return SUCCESS;
339} /* }}} */
340
341PHPDBG_INFO(memory) /* {{{ */
342{
343 size_t used, real, peak_used, peak_real;
345 bool is_mm;
346
350 if ((is_mm = is_zend_mm())) {
351 used = zend_memory_usage(0);
352 real = zend_memory_usage(1);
353 peak_used = zend_memory_peak_usage(0);
354 peak_real = zend_memory_peak_usage(1);
355 }
359
360 if (is_mm) {
361 phpdbg_notice("Memory Manager Information");
362 phpdbg_notice("Current");
363 phpdbg_writeln( "|-------> Used:\t%.3f kB", (float) (used / 1024));
364 phpdbg_writeln("|-------> Real:\t%.3f kB", (float) (real / 1024));
365 phpdbg_notice("Peak");
366 phpdbg_writeln("|-------> Used:\t%.3f kB", (float) (peak_used / 1024));
367 phpdbg_writeln("|-------> Real:\t%.3f kB", (float) (peak_real / 1024));
368 } else {
369 phpdbg_error("Memory Manager Disabled!");
370 }
371 return SUCCESS;
372} /* }}} */
373
374static inline void phpdbg_print_class_name(zend_class_entry *ce) /* {{{ */
375{
376 const char *visibility = ce->type == ZEND_USER_CLASS ? "User" : "Internal";
377 const char *type = (ce->ce_flags & ZEND_ACC_INTERFACE) ? "Interface" : (ce->ce_flags & ZEND_ACC_ABSTRACT) ? "Abstract Class" : "Class";
378
379 phpdbg_writeln("%s %s %.*s (%d)", visibility, type, (int) ZSTR_LEN(ce->name), ZSTR_VAL(ce->name), zend_hash_num_elements(&ce->function_table));
380} /* }}} */
381
382PHPDBG_INFO(classes) /* {{{ */
383{
385 HashTable classes;
386
387 zend_hash_init(&classes, 8, NULL, NULL, 0);
388
390 ZEND_HASH_MAP_FOREACH_PTR(EG(class_table), ce) {
391 if (ce->type == ZEND_USER_CLASS) {
392 zend_hash_next_index_insert_ptr(&classes, ce);
393 }
396 phpdbg_notice("Not all classes could be fetched, possibly invalid data source");
398
399 phpdbg_notice("User Classes (%d)", zend_hash_num_elements(&classes));
400
401 /* once added, assume that classes are stable... until shutdown. */
402 if (HT_IS_INITIALIZED(&classes)) {
403 ZEND_HASH_PACKED_FOREACH_PTR(&classes, ce) {
404 phpdbg_print_class_name(ce);
405
406 if (ce->parent) {
407 if (ce->ce_flags & ZEND_ACC_LINKED) {
408 zend_class_entry *pce = ce->parent;
409 do {
410 phpdbg_out("|-------- ");
411 phpdbg_print_class_name(pce);
412 } while ((pce = pce->parent));
413 } else {
414 phpdbg_writeln("|-------- User Class %s (not yet linked because declaration for parent was not encountered when declaring the class)", ZSTR_VAL(ce->parent_name));
415 }
416 }
417
418 if (ce->info.user.filename) {
419 phpdbg_writeln("|---- in %s on line %u", ZSTR_VAL(ce->info.user.filename), ce->info.user.line_start);
420 } else {
421 phpdbg_writeln("|---- no source code");
422 }
424 }
425
426 zend_hash_destroy(&classes);
427
428 return SUCCESS;
429} /* }}} */
430
431PHPDBG_INFO(funcs) /* {{{ */
432{
433 zend_function *zf;
435
437
439 ZEND_HASH_MAP_FOREACH_PTR(EG(function_table), zf) {
440 if (zf->type == ZEND_USER_FUNCTION) {
441 zend_hash_next_index_insert_ptr(&functions, zf);
442 }
445 phpdbg_notice("Not all functions could be fetched, possibly invalid data source");
447
448 phpdbg_notice("User Functions (%d)", zend_hash_num_elements(&functions));
449
452 zend_op_array *op_array = &zf->op_array;
453
454 phpdbg_write("|-------- %s", op_array->function_name ? ZSTR_VAL(op_array->function_name) : "{main}");
455
456 if (op_array->filename) {
457 phpdbg_writeln(" in %s on line %d", ZSTR_VAL(op_array->filename), op_array->line_start);
458 } else {
459 phpdbg_writeln(" (no source code)");
460 }
462 }
463
465
466 return SUCCESS;
467} /* }}} */
count(Countable|array $value, int $mode=COUNT_NORMAL)
Definition test.php:8
error($message)
Definition ext_skel.php:22
zend_ffi_type * type
Definition ffi.c:3812
const php_stream_filter_ops * ops
Definition filters.c:1899
#define NULL
Definition gdcache.h:45
#define SUCCESS
Definition hash_sha3.c:261
#define PG(v)
Definition php_globals.h:31
#define PHPDBG_G(v)
Definition phpdbg.h:102
#define phpdbg_try_access
Definition phpdbg.h:194
#define phpdbg_catch_access
Definition phpdbg.h:201
bool in_execution
Definition phpdbg.h:269
#define PHPDBG_IN_SIGNAL_HANDLER
Definition phpdbg.h:164
#define PHPDBG_BREAK_FUNCTION_OPLINE
Definition phpdbg_bp.h:30
#define PHPDBG_BREAK_COND
Definition phpdbg_bp.h:28
#define PHPDBG_BREAK_FILE_OPLINE
Definition phpdbg_bp.h:32
#define PHPDBG_BREAK_OPLINE
Definition phpdbg_bp.h:26
#define PHPDBG_BREAK_SYM
Definition phpdbg_bp.h:25
#define PHPDBG_BREAK_METHOD
Definition phpdbg_bp.h:27
#define PHPDBG_BREAK_OPCODE
Definition phpdbg_bp.h:29
#define PHPDBG_BREAK_METHOD_OPLINE
Definition phpdbg_bp.h:31
#define PHPDBG_BREAK_FILE
Definition phpdbg_bp.h:23
#define PHPDBG_END_COMMAND
Definition phpdbg_cmd.h:171
struct _phpdbg_command_t phpdbg_command_t
Definition phpdbg_cmd.h:88
#define PHPDBG_ASYNC_SAFE
Definition phpdbg_cmd.h:84
#define VARIABLEINFO(msg,...)
HashTable functions
zend_constant * data
phpdbg_print_breakpoints(PHPDBG_BREAK_SYM)
phpdbg_end_try_access()
const phpdbg_command_t phpdbg_info_commands[]
Definition phpdbg_info.c:31
bool is_mm
#define PHPDBG_INFO_COMMAND_D(f, h, a, m, l, s, flags)
Definition phpdbg_info.c:28
zend_mm_heap * orig_heap
zend_hash_init & consts
#define PHPDBG_INFO(name)
Definition phpdbg_info.h:24
#define phpdbg_error(strfmt,...)
Definition phpdbg_out.h:43
#define phpdbg_out(fmt,...)
Definition phpdbg_out.h:49
#define phpdbg_write(strfmt,...)
Definition phpdbg_out.h:46
#define phpdbg_notice(strfmt,...)
Definition phpdbg_out.h:44
#define phpdbg_writeln(strfmt,...)
Definition phpdbg_out.h:45
zend_mm_heap * phpdbg_original_heap_sigsafe_mem(void)
zend_auto_global_callback auto_global_callback
zend_string * name
struct _zend_class_entry::@126215362204241324314155352336150042254204116267::@166057154351252324007362117353350250255142166322 user
zend_string * filename
Definition zend.h:228
zend_string * name
Definition zend.h:149
union _zend_class_entry::@126215362204241324314155352336150042254204116267 info
zend_string * parent_name
Definition zend.h:153
uint32_t ce_flags
Definition zend.h:156
char type
Definition zend.h:148
uint32_t line_start
Definition zend.h:229
zend_class_entry * parent
Definition zend.h:152
HashTable function_table
Definition zend.h:163
zend_string * filename
uint32_t line_start
zend_string * function_name
zend_op_array op_array
ZEND_API size_t zend_print_zval(zval *expr, int indent)
Definition zend.c:464
#define ZEND_EXTERN_MODULE_GLOBALS(module_name)
Definition zend_API.h:270
ZEND_API zend_array * zend_rebuild_symbol_table(void)
ZEND_API size_t zend_memory_usage(bool real_usage)
ZEND_API bool is_zend_mm(void)
ZEND_API size_t zend_memory_peak_usage(bool real_usage)
ZEND_API zend_mm_heap * zend_mm_set_heap(zend_mm_heap *new_heap)
struct _zend_mm_heap zend_mm_heap
Definition zend_alloc.h:244
struct _zval_struct zval
execute_data func
ZEND_API bool zend_is_auto_global(zend_string *name)
#define ZEND_ACC_ABSTRACT
#define ZEND_ACC_LINKED
#define ZEND_USER_FUNCTION
#define ZEND_ACC_INTERFACE
struct _zend_op_array zend_op_array
#define ZEND_USER_CLASS
struct _zend_auto_global zend_auto_global
#define ZEND_CONSTANT_MODULE_NUMBER(c)
struct _zend_constant zend_constant
#define PHP_USER_CONSTANT
union _zend_function zend_function
#define CG(v)
#define EG(v)
ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht)
Definition zend_hash.c:1727
ZEND_API void ZEND_FASTCALL zend_hash_apply(HashTable *ht, apply_func_t apply_func)
Definition zend_hash.c:2059
ZEND_API zval *ZEND_FASTCALL zend_hash_update(HashTable *ht, zend_string *key, zval *pData)
Definition zend_hash.c:997
#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent)
Definition zend_hash.h:108
#define ZEND_HASH_MAP_FOREACH_PTR(ht, _ptr)
Definition zend_hash.h:1326
#define HT_IS_INITIALIZED(ht)
Definition zend_hash.h:56
#define ZEND_HASH_PACKED_FOREACH_PTR(ht, _ptr)
Definition zend_hash.h:1487
#define ZEND_HASH_MAP_FOREACH_STR_KEY(ht, _key)
Definition zend_hash.h:1346
int(* apply_func_t)(zval *pDest)
Definition zend_hash.h:150
#define ZEND_HASH_FOREACH_END()
Definition zend_hash.h:1086
#define ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(ht, _key, _val)
Definition zend_hash.h:1374
const char * zend_rsrc_list_get_rsrc_type(zend_resource *res)
Definition zend_list.c:316
#define ZEND_LONG_FMT
Definition zend_long.h:87
struct _zend_string zend_string
struct _zend_array zend_array
struct _zend_class_entry zend_class_entry
#define ZSTR_VAL(zstr)
Definition zend_string.h:68
#define ZSTR_LEN(zstr)
Definition zend_string.h:69
#define Z_TYPE_P(zval_p)
Definition zend_types.h:660
#define IS_TRUE
Definition zend_types.h:603
#define Z_DVAL(zval)
Definition zend_types.h:968
#define Z_REFVAL_P(zval_p)
#define IS_FALSE
Definition zend_types.h:602
#define Z_STRVAL_P(zval_p)
Definition zend_types.h:975
#define IS_STRING
Definition zend_types.h:606
struct _zend_array HashTable
Definition zend_types.h:386
#define IS_RESOURCE
Definition zend_types.h:609
#define IS_DOUBLE
Definition zend_types.h:605
#define Z_PTR_P(zval_p)
#define Z_STRLEN_P(zval_p)
Definition zend_types.h:978
#define IS_NULL
Definition zend_types.h:601
#define Z_OBJCE_P(zval_p)
#define Z_STRVAL(zval)
Definition zend_types.h:974
#define Z_STRLEN(zval)
Definition zend_types.h:977
#define IS_OBJECT
Definition zend_types.h:608
#define IS_LONG
Definition zend_types.h:604
#define IS_REFERENCE
Definition zend_types.h:610
#define Z_INDIRECT_P(zval_p)
#define Z_RES_P(zval_p)
#define Z_TYPE(zval)
Definition zend_types.h:659
#define Z_DVAL_P(zval_p)
Definition zend_types.h:969
#define IS_INDIRECT
Definition zend_types.h:623
#define Z_LVAL_P(zval_p)
Definition zend_types.h:966
#define Z_LVAL(zval)
Definition zend_types.h:965
zend_string * name