Skip to content

Commit 930fe03

Browse files
authored
phar: Abstract away internal object fetching (php#20147)
1 parent ee43384 commit 930fe03

File tree

1 file changed

+21
-21
lines changed

1 file changed

+21
-21
lines changed

ext/phar/phar_object.c

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ static zend_class_entry *phar_ce_data;
3434
static zend_class_entry *phar_ce_PharException;
3535
static zend_class_entry *phar_ce_entry;
3636

37+
#define PHAR_FETCH_INTERNAL_EX(zv) (void *)((char *) Z_OBJ_P(zv) - Z_OBJ_P(zv)->handlers->offset);
38+
#define PHAR_FETCH_INTERNAL() PHAR_FETCH_INTERNAL_EX(ZEND_THIS)
39+
40+
#define PHAR_ARCHIVE_OBJECT() \
41+
phar_archive_object *phar_obj = PHAR_FETCH_INTERNAL(); \
42+
if (!phar_obj->archive) { \
43+
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, \
44+
"Cannot call method on an uninitialized Phar object"); \
45+
RETURN_THROWS(); \
46+
}
47+
3748
static int phar_file_type(HashTable *mimes, char *file, char **mime_type) /* {{{ */
3849
{
3950
char *ext;
@@ -1119,11 +1130,11 @@ PHP_METHOD(Phar, __construct)
11191130
zend_long format = 0;
11201131
phar_archive_object *phar_obj;
11211132
phar_archive_data *phar_data;
1122-
zval *zobj = ZEND_THIS, arg1, arg2;
1133+
zval arg1, arg2;
11231134

1124-
phar_obj = (phar_archive_object*)((char*)Z_OBJ_P(zobj) - Z_OBJ_P(zobj)->handlers->offset);
1135+
phar_obj = PHAR_FETCH_INTERNAL();
11251136

1126-
is_data = instanceof_function(Z_OBJCE_P(zobj), phar_ce_data);
1137+
is_data = instanceof_function(Z_OBJCE_P(ZEND_THIS), phar_ce_data);
11271138

11281139
if (is_data) {
11291140
if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|ls!l", &fname, &fname_len, &flags, &alias, &alias_len, &format) == FAILURE) {
@@ -1223,7 +1234,7 @@ PHP_METHOD(Phar, __construct)
12231234
ZVAL_LONG(&arg2, flags);
12241235

12251236
zend_call_known_instance_method_with_2_params(spl_ce_RecursiveDirectoryIterator->constructor,
1226-
Z_OBJ_P(zobj), NULL, &arg1, &arg2);
1237+
Z_OBJ_P(ZEND_THIS), NULL, &arg1, &arg2);
12271238

12281239
zval_ptr_dtor(&arg1);
12291240

@@ -1353,20 +1364,10 @@ PHP_METHOD(Phar, unlinkArchive)
13531364
}
13541365
/* }}} */
13551366

1356-
#define PHAR_ARCHIVE_OBJECT() \
1357-
zval *zobj = ZEND_THIS; \
1358-
phar_archive_object *phar_obj = (phar_archive_object*)((char*)Z_OBJ_P(zobj) - Z_OBJ_P(zobj)->handlers->offset); \
1359-
if (!phar_obj->archive) { \
1360-
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, \
1361-
"Cannot call method on an uninitialized Phar object"); \
1362-
RETURN_THROWS(); \
1363-
}
1364-
13651367
/* {{{ if persistent, remove from the cache */
13661368
PHP_METHOD(Phar, __destruct)
13671369
{
1368-
zval *zobj = ZEND_THIS;
1369-
phar_archive_object *phar_obj = (phar_archive_object*)((char*)Z_OBJ_P(zobj) - Z_OBJ_P(zobj)->handlers->offset);
1370+
phar_archive_object *phar_obj = PHAR_FETCH_INTERNAL();
13701371

13711372
if (zend_parse_parameters_none() == FAILURE) {
13721373
RETURN_THROWS();
@@ -1458,7 +1459,7 @@ static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */
14581459
case IS_OBJECT:
14591460
if (instanceof_function(Z_OBJCE_P(value), spl_ce_SplFileInfo)) {
14601461
char *test = NULL;
1461-
spl_filesystem_object *intern = (spl_filesystem_object*)((char*)Z_OBJ_P(value) - Z_OBJ_P(value)->handlers->offset);
1462+
spl_filesystem_object *intern = PHAR_FETCH_INTERNAL_EX(value);
14621463

14631464
if (!base_len) {
14641465
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Iterator %s returns an SplFileInfo object, so base directory must be specified", ZSTR_VAL(ce->name));
@@ -4460,13 +4461,13 @@ PHP_METHOD(PharFileInfo, __construct)
44604461
phar_entry_object *entry_obj;
44614462
phar_entry_info *entry_info;
44624463
phar_archive_data *phar_data;
4463-
zval *zobj = ZEND_THIS, arg1;
4464+
zval arg1;
44644465

44654466
if (zend_parse_parameters(ZEND_NUM_ARGS(), "p", &fname, &fname_len) == FAILURE) {
44664467
RETURN_THROWS();
44674468
}
44684469

4469-
entry_obj = (phar_entry_object*)((char*)Z_OBJ_P(zobj) - Z_OBJ_P(zobj)->handlers->offset);
4470+
entry_obj = PHAR_FETCH_INTERNAL();
44704471

44714472
if (entry_obj->entry) {
44724473
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot call constructor twice");
@@ -4512,15 +4513,14 @@ PHP_METHOD(PharFileInfo, __construct)
45124513
ZVAL_STRINGL(&arg1, fname, fname_len);
45134514

45144515
zend_call_known_instance_method_with_1_params(spl_ce_SplFileInfo->constructor,
4515-
Z_OBJ_P(zobj), NULL, &arg1);
4516+
Z_OBJ_P(ZEND_THIS), NULL, &arg1);
45164517

45174518
zval_ptr_dtor(&arg1);
45184519
}
45194520
/* }}} */
45204521

45214522
#define PHAR_ENTRY_OBJECT_EX(throw) \
4522-
zval *zobj = ZEND_THIS; \
4523-
phar_entry_object *entry_obj = (phar_entry_object*)((char*)Z_OBJ_P(zobj) - Z_OBJ_P(zobj)->handlers->offset); \
4523+
phar_entry_object *entry_obj = PHAR_FETCH_INTERNAL(); \
45244524
if (!entry_obj->entry) { \
45254525
if (throw) { \
45264526
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, \

0 commit comments

Comments
 (0)