diff --git a/py/nativeglue.c b/py/nativeglue.c
index e27d69e14e4cfead3b7b6daf0d3d442529320dd4..bc2f4ff5e75091aeb8f3bfc910615ec3b45737a9 100644
--- a/py/nativeglue.c
+++ b/py/nativeglue.c
@@ -50,10 +50,14 @@ mp_uint_t mp_convert_obj_to_native(mp_obj_t obj, mp_uint_t type) {
         case MP_NATIVE_TYPE_BOOL:
         case MP_NATIVE_TYPE_INT:
         case MP_NATIVE_TYPE_UINT: return mp_obj_get_int_truncated(obj);
-        default: { // a pointer
+        default: { // cast obj to a pointer
             mp_buffer_info_t bufinfo;
-            mp_get_buffer_raise(obj, &bufinfo, MP_BUFFER_RW);
-            return (mp_uint_t)bufinfo.buf;
+            if (mp_get_buffer(obj, &bufinfo, MP_BUFFER_RW)) {
+                return (mp_uint_t)bufinfo.buf;
+            } else {
+                // assume obj is an integer that represents an address
+                return mp_obj_get_int_truncated(obj);
+            }
         }
     }
 }
diff --git a/tests/micropython/viper_addr.py b/tests/micropython/viper_addr.py
new file mode 100644
index 0000000000000000000000000000000000000000..cd953ce07d02d5e93ad0d94f8ef30ab37769b662
--- /dev/null
+++ b/tests/micropython/viper_addr.py
@@ -0,0 +1,29 @@
+# test passing addresses to viper
+
+@micropython.viper
+def get_addr(x:ptr) -> ptr:
+    return x
+
+@micropython.viper
+def memset(dest:ptr8, c:int, n:int):
+    for i in range(n):
+        dest[i] = c
+
+# create array and get its address
+ar = bytearray('0000')
+addr = get_addr(ar)
+print(type(ar))
+print(type(addr))
+print(ar)
+
+# pass array as an object
+memset(ar, ord('1'), len(ar))
+print(ar)
+
+# pass direct pointer to array buffer
+memset(addr, ord('2'), len(ar))
+print(ar)
+
+# pass direct pointer to array buffer, with offset
+memset(addr + 2, ord('3'), len(ar) - 2)
+print(ar)
diff --git a/tests/micropython/viper_addr.py.exp b/tests/micropython/viper_addr.py.exp
new file mode 100644
index 0000000000000000000000000000000000000000..87a18e1e2a067baba9063372504c6ff9b5632d99
--- /dev/null
+++ b/tests/micropython/viper_addr.py.exp
@@ -0,0 +1,6 @@
+<class 'bytearray'>
+<class 'int'>
+bytearray(b'0000')
+bytearray(b'1111')
+bytearray(b'2222')
+bytearray(b'2233')