Skip to content

Commit 999d29d

Browse files
authored
ext/intl: reducing raw pointer usage in C++ part, using smart ones instead. (#19179)
1 parent 726516b commit 999d29d

File tree

1 file changed

+22
-23
lines changed

1 file changed

+22
-23
lines changed

ext/intl/calendar/gregoriancalendar_methods.cpp

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ static void _php_intlgregcal_constructor_body(
134134

135135
// instantion of ICU object
136136
Calendar_object *co = Z_INTL_CALENDAR_P(return_value);
137-
GregorianCalendar *gcal = NULL;
137+
std::unique_ptr<GregorianCalendar> gcal;
138138

139139
if (co->ucal) {
140140
zend_throw_error(NULL, "IntlGregorianCalendar object is already constructed");
@@ -159,15 +159,12 @@ static void _php_intlgregcal_constructor_body(
159159
locale = const_cast<char*>(intl_locale_get_default());
160160
}
161161

162-
gcal = new GregorianCalendar(tz, Locale::createFromName(locale),
163-
status);
162+
gcal = std::unique_ptr<GregorianCalendar>(new GregorianCalendar(tz, Locale::createFromName(locale),
163+
status));
164164
// Should this throw?
165165
if (U_FAILURE(status)) {
166166
intl_error_set(NULL, status, "intlgregcal_create_instance: error "
167167
"creating ICU GregorianCalendar from time zone and locale", 0);
168-
if (gcal) {
169-
delete gcal;
170-
}
171168
delete tz;
172169
if (!is_constructor) {
173170
zval_ptr_dtor(return_value);
@@ -177,26 +174,28 @@ static void _php_intlgregcal_constructor_body(
177174
}
178175
} else {
179176
// From date/time (3, 5 or 6 arguments)
177+
GregorianCalendar *tmp;
180178
for (int i = 0; i < variant; i++) {
181179
ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(largs[i], hasThis() ? (i-1) : i);
182180
}
183181

184182
if (variant == 3) {
185-
gcal = new GregorianCalendar((int32_t)largs[0], (int32_t)largs[1],
183+
tmp = new GregorianCalendar((int32_t)largs[0], (int32_t)largs[1],
186184
(int32_t)largs[2], status);
187185
} else if (variant == 5) {
188-
gcal = new GregorianCalendar((int32_t)largs[0], (int32_t)largs[1],
186+
tmp = new GregorianCalendar((int32_t)largs[0], (int32_t)largs[1],
189187
(int32_t)largs[2], (int32_t)largs[3], (int32_t)largs[4], status);
190188
} else if (variant == 6) {
191-
gcal = new GregorianCalendar((int32_t)largs[0], (int32_t)largs[1],
189+
tmp = new GregorianCalendar((int32_t)largs[0], (int32_t)largs[1],
192190
(int32_t)largs[2], (int32_t)largs[3], (int32_t)largs[4], (int32_t)largs[5],
193191
status);
194192
} else {
195193
ZEND_UNREACHABLE();
196194
}
197195

198-
if (!set_gregorian_calendar_time_zone(gcal, status)) {
199-
delete gcal;
196+
gcal = std::unique_ptr<GregorianCalendar>(tmp);
197+
198+
if (!set_gregorian_calendar_time_zone(gcal.get(), status)) {
200199
if (!is_constructor) {
201200
zval_ptr_dtor(return_value);
202201
RETVAL_NULL();
@@ -205,7 +204,7 @@ static void _php_intlgregcal_constructor_body(
205204
}
206205
}
207206

208-
co->ucal = gcal;
207+
co->ucal = gcal.release();
209208
}
210209

211210
U_CFUNC PHP_FUNCTION(intlgregcal_create_instance)
@@ -234,7 +233,7 @@ U_CFUNC PHP_METHOD(IntlGregorianCalendar, createFromDate)
234233
UErrorCode status = U_ZERO_ERROR;
235234
zend_error_handling error_handling;
236235
Calendar_object *co;
237-
GregorianCalendar *gcal;
236+
std::unique_ptr<GregorianCalendar> gcal;
238237

239238
intl_error_reset(NULL);
240239

@@ -250,15 +249,14 @@ U_CFUNC PHP_METHOD(IntlGregorianCalendar, createFromDate)
250249

251250
zend_replace_error_handling(EH_THROW, IntlException_ce_ptr, &error_handling);
252251

253-
gcal = new GregorianCalendar((int32_t) year, (int32_t) month, (int32_t) day, status);
254-
if (!set_gregorian_calendar_time_zone(gcal, status)) {
255-
delete gcal;
252+
gcal = std::unique_ptr<GregorianCalendar>(new GregorianCalendar((int32_t) year, (int32_t) month, (int32_t) day, status));
253+
if (!set_gregorian_calendar_time_zone(gcal.get(), status)) {
256254
goto cleanup;
257255
}
258256

259257
object_init_ex(return_value, GregorianCalendar_ce_ptr);
260258
co = Z_INTL_CALENDAR_P(return_value);
261-
co->ucal = gcal;
259+
co->ucal = gcal.release();
262260

263261
cleanup:
264262
zend_restore_error_handling(&error_handling);
@@ -271,7 +269,7 @@ U_CFUNC PHP_METHOD(IntlGregorianCalendar, createFromDateTime)
271269
UErrorCode status = U_ZERO_ERROR;
272270
zend_error_handling error_handling;
273271
Calendar_object *co;
274-
GregorianCalendar *gcal;
272+
GregorianCalendar *tmp;
275273

276274
intl_error_reset(NULL);
277275

@@ -294,19 +292,20 @@ U_CFUNC PHP_METHOD(IntlGregorianCalendar, createFromDateTime)
294292
zend_replace_error_handling(EH_THROW, IntlException_ce_ptr, &error_handling);
295293

296294
if (second_is_null) {
297-
gcal = new GregorianCalendar((int32_t) year, (int32_t) month, (int32_t) day, (int32_t) hour, (int32_t) minute, status);
295+
tmp = new GregorianCalendar((int32_t) year, (int32_t) month, (int32_t) day, (int32_t) hour, (int32_t) minute, status);
298296
} else {
299297
ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(second, 6);
300-
gcal = new GregorianCalendar((int32_t) year, (int32_t) month, (int32_t) day, (int32_t) hour, (int32_t) minute, (int32_t) second, status);
298+
tmp = new GregorianCalendar((int32_t) year, (int32_t) month, (int32_t) day, (int32_t) hour, (int32_t) minute, (int32_t) second, status);
301299
}
302-
if (!set_gregorian_calendar_time_zone(gcal, status)) {
303-
delete gcal;
300+
auto gcal = std::unique_ptr<GregorianCalendar>(tmp);
301+
if (!set_gregorian_calendar_time_zone(gcal.get(), status)) {
304302
goto cleanup;
305303
}
306304

307305
object_init_ex(return_value, GregorianCalendar_ce_ptr);
308306
co = Z_INTL_CALENDAR_P(return_value);
309-
co->ucal = gcal;
307+
// TODO: trying to get passed the ownership change step
308+
co->ucal = gcal.release();
310309

311310
cleanup:
312311
zend_restore_error_handling(&error_handling);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy