Skip to content

Commit 240678e

Browse files
committed
Avoid uninitialized gamepad on exception
Raise exceptions before the gamepad_singleton is created. Also, use mp_raise for creating the exceptions.
1 parent edf2935 commit 240678e

2 files changed

Lines changed: 11 additions & 9 deletions

File tree

shared-bindings/gamepad/GamePad.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "py/mphal.h"
2929
#include "shared-module/gamepad/GamePad.h"
3030
#include "shared-bindings/digitalio/DigitalInOut.h"
31+
#include "shared-bindings/util.h"
3132
#include "GamePad.h"
3233

3334

@@ -93,15 +94,17 @@ gamepad_obj_t* volatile gamepad_singleton = NULL;
9394
//|
9495
STATIC mp_obj_t gamepad_make_new(const mp_obj_type_t *type, size_t n_args,
9596
size_t n_kw, const mp_obj_t *args) {
96-
if (!gamepad_singleton) {
97-
gamepad_singleton = m_new_obj(gamepad_obj_t);
98-
gamepad_singleton->base.type = &gamepad_type;
99-
}
10097
for (size_t i = 0; i < n_args; ++i) {
10198
if (!MP_OBJ_IS_TYPE(args[i], &digitalio_digitalinout_type)) {
102-
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
103-
"Expected a %q", digitalio_digitalinout_type.name));
99+
mp_raise_TypeError("Expected a DigitalInOut");
104100
}
101+
digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(args[i]);
102+
raise_error_if_deinited(
103+
common_hal_digitalio_digitalinout_deinited(pin));
104+
}
105+
if (!gamepad_singleton) {
106+
gamepad_singleton = m_new_obj(gamepad_obj_t);
107+
gamepad_singleton->base.type = &gamepad_type;
105108
}
106109
gamepad_init(n_args, args);
107110
return MP_OBJ_FROM_PTR(gamepad_singleton);

shared-module/gamepad/GamePad.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,12 @@
3535

3636

3737
void gamepad_init(size_t n_pins, const mp_obj_t* pins) {
38-
for (size_t i=0; i<8; ++i) {
38+
for (size_t i = 0; i < 8; ++i) {
3939
gamepad_singleton->pins[i] = NULL;
4040
}
4141
gamepad_singleton->pulls = 0;
42-
for (size_t i=0; i<n_pins; ++i) {
42+
for (size_t i = 0; i < n_pins; ++i) {
4343
digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(pins[i]);
44-
raise_error_if_deinited(common_hal_digitalio_digitalinout_deinited(pin));
4544
digitalio_direction_t direction = common_hal_digitalio_digitalinout_get_direction(pin);
4645
if (direction != DIRECTION_INPUT) {
4746
common_hal_digitalio_digitalinout_switch_to_input(pin, PULL_UP);

0 commit comments

Comments
 (0)