summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRadomir Dopieralski <openstack@sheep.art.pl>2018-05-23 21:39:06 +0200
committerRadomir Dopieralski <openstack@sheep.art.pl>2018-05-23 21:39:06 +0200
commit240678e71403f54ab31452a7138dfd8ddcfc7f0c (patch)
tree31ab1ad2b797649051d01324f75524850b050846
parentedf2935ab166d3db765eec600ffccaedee79e5a5 (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.c15
-rw-r--r--shared-module/gamepad/GamePad.c5
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);