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)