diff options
| author | Radomir Dopieralski <openstack@sheep.art.pl> | 2018-05-23 21:39:06 +0200 |
|---|---|---|
| committer | Radomir Dopieralski <openstack@sheep.art.pl> | 2018-05-23 21:39:06 +0200 |
| commit | 240678e71403f54ab31452a7138dfd8ddcfc7f0c (patch) | |
| tree | 31ab1ad2b797649051d01324f75524850b050846 | |
| parent | edf2935ab166d3db765eec600ffccaedee79e5a5 (diff) | |
Avoid uninitialized gamepad on exception
Raise exceptions before the gamepad_singleton is created.
Also, use mp_raise for creating the exceptions.
| -rw-r--r-- | shared-bindings/gamepad/GamePad.c | 15 | ||||
| -rw-r--r-- | shared-module/gamepad/GamePad.c | 5 |
2 files changed, 11 insertions, 9 deletions
diff --git a/shared-bindings/gamepad/GamePad.c b/shared-bindings/gamepad/GamePad.c index 2c982c7d5..aa645dc66 100644 --- a/shared-bindings/gamepad/GamePad.c +++ b/shared-bindings/gamepad/GamePad.c @@ -28,6 +28,7 @@ #include "py/mphal.h" #include "shared-module/gamepad/GamePad.h" #include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/util.h" #include "GamePad.h" @@ -93,15 +94,17 @@ gamepad_obj_t* volatile gamepad_singleton = NULL; //| STATIC mp_obj_t gamepad_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - if (!gamepad_singleton) { - gamepad_singleton = m_new_obj(gamepad_obj_t); - gamepad_singleton->base.type = &gamepad_type; - } for (size_t i = 0; i < n_args; ++i) { if (!MP_OBJ_IS_TYPE(args[i], &digitalio_digitalinout_type)) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "Expected a %q", digitalio_digitalinout_type.name)); + mp_raise_TypeError("Expected a DigitalInOut"); } + digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(args[i]); + raise_error_if_deinited( + common_hal_digitalio_digitalinout_deinited(pin)); + } + if (!gamepad_singleton) { + gamepad_singleton = m_new_obj(gamepad_obj_t); + gamepad_singleton->base.type = &gamepad_type; } gamepad_init(n_args, args); return MP_OBJ_FROM_PTR(gamepad_singleton); diff --git a/shared-module/gamepad/GamePad.c b/shared-module/gamepad/GamePad.c index 540c882da..88ab23fc1 100644 --- a/shared-module/gamepad/GamePad.c +++ b/shared-module/gamepad/GamePad.c @@ -35,13 +35,12 @@ void gamepad_init(size_t n_pins, const mp_obj_t* pins) { - for (size_t i=0; i<8; ++i) { + for (size_t i = 0; i < 8; ++i) { gamepad_singleton->pins[i] = NULL; } gamepad_singleton->pulls = 0; - for (size_t i=0; i<n_pins; ++i) { + for (size_t i = 0; i < n_pins; ++i) { digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(pins[i]); - raise_error_if_deinited(common_hal_digitalio_digitalinout_deinited(pin)); digitalio_direction_t direction = common_hal_digitalio_digitalinout_get_direction(pin); if (direction != DIRECTION_INPUT) { common_hal_digitalio_digitalinout_switch_to_input(pin, PULL_UP); |
