From 9a58316de235fed23566f9898de43b57fab85d7d Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Wed, 16 Mar 2016 08:22:26 +0000
Subject: [PATCH] py/objfun: Allow inline-asm functions to be called with 4
 arguments.

---
 py/objfun.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/py/objfun.c b/py/objfun.c
index 3deb0c01d..293d06427 100644
--- a/py/objfun.c
+++ b/py/objfun.c
@@ -459,6 +459,7 @@ typedef mp_uint_t (*inline_asm_fun_0_t)(void);
 typedef mp_uint_t (*inline_asm_fun_1_t)(mp_uint_t);
 typedef mp_uint_t (*inline_asm_fun_2_t)(mp_uint_t, mp_uint_t);
 typedef mp_uint_t (*inline_asm_fun_3_t)(mp_uint_t, mp_uint_t, mp_uint_t);
+typedef mp_uint_t (*inline_asm_fun_4_t)(mp_uint_t, mp_uint_t, mp_uint_t, mp_uint_t);
 
 // convert a Micro Python object to a sensible value for inline asm
 STATIC mp_uint_t convert_obj_for_inline_asm(mp_obj_t obj) {
@@ -527,8 +528,14 @@ STATIC mp_obj_t fun_asm_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const
     } else if (n_args == 3) {
         ret = ((inline_asm_fun_3_t)fun)(convert_obj_for_inline_asm(args[0]), convert_obj_for_inline_asm(args[1]), convert_obj_for_inline_asm(args[2]));
     } else {
-        assert(0);
-        ret = 0;
+        // compiler allows at most 4 arguments
+        assert(n_args == 4);
+        ret = ((inline_asm_fun_4_t)fun)(
+            convert_obj_for_inline_asm(args[0]),
+            convert_obj_for_inline_asm(args[1]),
+            convert_obj_for_inline_asm(args[2]),
+            convert_obj_for_inline_asm(args[3])
+        );
     }
 
     return mp_convert_native_to_obj(ret, self->type_sig);
-- 
GitLab