summaryrefslogtreecommitdiff
path: root/shared-bindings/gamepad
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 /shared-bindings/gamepad
parentedf2935ab166d3db765eec600ffccaedee79e5a5 (diff)
Avoid uninitialized gamepad on exception
Raise exceptions before the gamepad_singleton is created. Also, use mp_raise for creating the exceptions.
Diffstat (limited to 'shared-bindings/gamepad')
-rw-r--r--shared-bindings/gamepad/GamePad.c15
1 files changed, 9 insertions, 6 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);