Skip to content

Commit e8e7c04

Browse files
committed
Use common struct to store error information
This is needed by both fibers and opcache (and GH-6903 also uses it), so make it a common structure that can be used by any functionality storing warnings/errors.
1 parent bf7a244 commit e8e7c04

File tree

9 files changed

+40
-48
lines changed

9 files changed

+40
-48
lines changed

Zend/zend.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,13 @@ typedef struct {
378378
zend_class_entry *exception;
379379
} zend_error_handling;
380380

381+
typedef struct _zend_error_info {
382+
int type;
383+
uint32_t lineno;
384+
zend_string *filename;
385+
zend_string *message;
386+
} zend_error_info;
387+
381388
ZEND_API void zend_save_error_handling(zend_error_handling *current);
382389
ZEND_API void zend_replace_error_handling(zend_error_handling_t error_handling, zend_class_entry *exception_class, zend_error_handling *current);
383390
ZEND_API void zend_restore_error_handling(zend_error_handling *saved);

Zend/zend_fibers.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ static void zend_fiber_switch_to(zend_fiber *fiber)
278278
abort(); // This fiber should never be resumed.
279279
}
280280

281-
zend_fiber_error *error = EG(fiber_error);
281+
zend_error_info *error = EG(fiber_error);
282282
zend_error_zstr_at(error->type, error->filename, error->lineno, error->message);
283283
}
284284
}
@@ -288,7 +288,7 @@ ZEND_COLD void zend_error_suspend_fiber(
288288
{
289289
ZEND_ASSERT(EG(current_fiber) && "Must be within an active fiber!");
290290

291-
zend_fiber_error *error = emalloc(sizeof(zend_fiber_error));
291+
zend_error_info *error = emalloc(sizeof(zend_error_info));
292292

293293
error->type = orig_type;
294294
error->filename = error_filename;

Zend/zend_fibers.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,6 @@ typedef struct _zend_fiber {
7474
zval value;
7575
} zend_fiber;
7676

77-
typedef struct _zend_fiber_error {
78-
int type;
79-
zend_string *filename;
80-
uint32_t lineno;
81-
zend_string *message;
82-
} zend_fiber_error;
83-
8477
static const zend_uchar ZEND_FIBER_STATUS_INIT = 0x0;
8578
static const zend_uchar ZEND_FIBER_STATUS_SUSPENDED = 0x1;
8679
static const zend_uchar ZEND_FIBER_STATUS_RUNNING = 0x2;

Zend/zend_globals.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ END_EXTERN_C()
6262
typedef struct _zend_vm_stack *zend_vm_stack;
6363
typedef struct _zend_ini_entry zend_ini_entry;
6464
typedef struct _zend_fiber zend_fiber;
65-
typedef struct _zend_fiber_error zend_fiber_error;
65+
typedef struct _zend_error_info zend_error_info;
6666

6767

6868
struct _zend_compiler_globals {
@@ -258,7 +258,7 @@ struct _zend_executor_globals {
258258
zend_long fiber_stack_size;
259259

260260
/* Pointer to fatal error that occurred in a fiber while switching to {main}. */
261-
zend_fiber_error *fiber_error;
261+
zend_error_info *fiber_error;
262262

263263
void *reserved[ZEND_MAX_RESERVED_RESOURCES];
264264
};

ext/opcache/ZendAccelerator.c

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1686,27 +1686,26 @@ static void zend_accel_set_auto_globals(int mask)
16861686
ZCG(auto_globals_mask) |= mask;
16871687
}
16881688

1689-
static void persistent_error_cb(int type, zend_string *error_filename, const uint32_t error_lineno, zend_string *message) {
1689+
static void persistent_error_cb(int type, zend_string *filename, const uint32_t lineno, zend_string *message) {
16901690
if (ZCG(record_warnings)) {
1691-
zend_recorded_warning *warning = emalloc(sizeof(zend_recorded_warning));
1691+
zend_error_info *warning = emalloc(sizeof(zend_error_info));
16921692
warning->type = type;
1693-
warning->error_lineno = error_lineno;
1694-
warning->error_filename = zend_string_copy(error_filename);
1695-
warning->error_message = zend_string_copy(message);
1693+
warning->lineno = lineno;
1694+
warning->filename = zend_string_copy(filename);
1695+
warning->message = zend_string_copy(message);
16961696

16971697
ZCG(num_warnings)++;
1698-
ZCG(warnings) = erealloc(ZCG(warnings), sizeof(zend_recorded_warning) * ZCG(num_warnings));
1698+
ZCG(warnings) = erealloc(ZCG(warnings), sizeof(zend_error_info) * ZCG(num_warnings));
16991699
ZCG(warnings)[ZCG(num_warnings)-1] = warning;
17001700
}
1701-
accelerator_orig_zend_error_cb(type, error_filename, error_lineno, message);
1701+
accelerator_orig_zend_error_cb(type, filename, lineno, message);
17021702
}
17031703

17041704
static void replay_warnings(zend_persistent_script *script) {
17051705
for (uint32_t i = 0; i < script->num_warnings; i++) {
1706-
zend_recorded_warning *warning = script->warnings[i];
1706+
zend_error_info *warning = script->warnings[i];
17071707
accelerator_orig_zend_error_cb(
1708-
warning->type, warning->error_filename, warning->error_lineno,
1709-
warning->error_message);
1708+
warning->type, warning->filename, warning->lineno, warning->message);
17101709
}
17111710
}
17121711

@@ -1716,9 +1715,9 @@ static void free_recorded_warnings() {
17161715
}
17171716

17181717
for (uint32_t i = 0; i < ZCG(num_warnings); i++) {
1719-
zend_recorded_warning *warning = ZCG(warnings)[i];
1720-
zend_string_release(warning->error_filename);
1721-
zend_string_release(warning->error_message);
1718+
zend_error_info *warning = ZCG(warnings)[i];
1719+
zend_string_release(warning->filename);
1720+
zend_string_release(warning->message);
17221721
efree(warning);
17231722
}
17241723
efree(ZCG(warnings));

ext/opcache/ZendAccelerator.h

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,6 @@ typedef enum _zend_accel_restart_reason {
109109
ACCEL_RESTART_USER /* restart scheduled by opcache_reset() */
110110
} zend_accel_restart_reason;
111111

112-
typedef struct _zend_recorded_warning {
113-
int type;
114-
uint32_t error_lineno;
115-
zend_string *error_filename;
116-
zend_string *error_message;
117-
} zend_recorded_warning;
118-
119112
typedef struct _zend_persistent_script {
120113
zend_script script;
121114
zend_long compiler_halt_offset; /* position of __HALT_COMPILER or -1 */
@@ -125,7 +118,7 @@ typedef struct _zend_persistent_script {
125118
bool is_phar;
126119
bool empty;
127120
uint32_t num_warnings;
128-
zend_recorded_warning **warnings;
121+
zend_error_info **warnings;
129122

130123
void *mem; /* shared memory area used by script structures */
131124
size_t size; /* size of used shared memory */
@@ -227,9 +220,9 @@ typedef struct _zend_accel_globals {
227220
void *mem;
228221
zend_persistent_script *current_persistent_script;
229222
/* Temporary storage for warnings before they are moved into persistent_script. */
230-
bool record_warnings;
223+
bool record_warnings;
231224
uint32_t num_warnings;
232-
zend_recorded_warning **warnings;
225+
zend_error_info **warnings;
233226
/* cache to save hash lookup on the same INCLUDE opcode */
234227
const zend_op *cache_opline;
235228
zend_persistent_script *cache_persistent_script;

ext/opcache/zend_file_cache.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -884,18 +884,18 @@ static void zend_file_cache_serialize_warnings(
884884
zend_persistent_script *script, zend_file_cache_metainfo *info, void *buf)
885885
{
886886
if (script->warnings) {
887-
zend_recorded_warning **warnings;
887+
zend_error_info **warnings;
888888
SERIALIZE_PTR(script->warnings);
889889
warnings = script->warnings;
890890
UNSERIALIZE_PTR(warnings);
891891

892892
for (uint32_t i = 0; i < script->num_warnings; i++) {
893-
zend_recorded_warning *warning;
893+
zend_error_info *warning;
894894
SERIALIZE_PTR(warnings[i]);
895895
warning = warnings[i];
896896
UNSERIALIZE_PTR(warning);
897-
SERIALIZE_STR(warning->error_filename);
898-
SERIALIZE_STR(warning->error_message);
897+
SERIALIZE_STR(warning->filename);
898+
SERIALIZE_STR(warning->message);
899899
}
900900
}
901901
}
@@ -1678,8 +1678,8 @@ static void zend_file_cache_unserialize_warnings(zend_persistent_script *script,
16781678
UNSERIALIZE_PTR(script->warnings);
16791679
for (uint32_t i = 0; i < script->num_warnings; i++) {
16801680
UNSERIALIZE_PTR(script->warnings[i]);
1681-
UNSERIALIZE_STR(script->warnings[i]->error_filename);
1682-
UNSERIALIZE_STR(script->warnings[i]->error_message);
1681+
UNSERIALIZE_STR(script->warnings[i]->filename);
1682+
UNSERIALIZE_STR(script->warnings[i]->message);
16831683
}
16841684
}
16851685
}

ext/opcache/zend_persist.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,12 +1271,12 @@ static void zend_accel_persist_class_table(HashTable *class_table)
12711271
static void zend_persist_warnings(zend_persistent_script *script) {
12721272
if (script->warnings) {
12731273
script->warnings = zend_shared_memdup_free(
1274-
script->warnings, script->num_warnings * sizeof(zend_recorded_warning *));
1274+
script->warnings, script->num_warnings * sizeof(zend_error_info *));
12751275
for (uint32_t i = 0; i < script->num_warnings; i++) {
12761276
script->warnings[i] = zend_shared_memdup_free(
1277-
script->warnings[i], sizeof(zend_recorded_warning));
1278-
zend_accel_store_string(script->warnings[i]->error_filename);
1279-
zend_accel_store_string(script->warnings[i]->error_message);
1277+
script->warnings[i], sizeof(zend_error_info));
1278+
zend_accel_store_string(script->warnings[i]->filename);
1279+
zend_accel_store_string(script->warnings[i]->message);
12801280
}
12811281
}
12821282
}

ext/opcache/zend_persist_calc.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -562,11 +562,11 @@ static void zend_accel_persist_class_table_calc(HashTable *class_table)
562562
}
563563

564564
static void zend_persist_warnings_calc(zend_persistent_script *script) {
565-
ADD_SIZE(script->num_warnings * sizeof(zend_recorded_warning *));
565+
ADD_SIZE(script->num_warnings * sizeof(zend_error_info *));
566566
for (uint32_t i = 0; i < script->num_warnings; i++) {
567-
ADD_SIZE(sizeof(zend_recorded_warning));
568-
ADD_STRING(script->warnings[i]->error_filename);
569-
ADD_STRING(script->warnings[i]->error_message);
567+
ADD_SIZE(sizeof(zend_error_info));
568+
ADD_STRING(script->warnings[i]->filename);
569+
ADD_STRING(script->warnings[i]->message);
570570
}
571571
}
572572

0 commit comments

Comments
 (0)