Merge branch 'master' of github.com:micropython/micropython
diff --git a/py/obj.c b/py/obj.c
index c2f726b..660df4d 100644
--- a/py/obj.c
+++ b/py/obj.c
@@ -66,7 +66,7 @@
 }
 
 bool mp_obj_is_callable(mp_obj_t o_in) {
-    if (MP_OBJ_IS_SMALL_INT(o_in)) {
+    if (!MP_OBJ_IS_OBJ(o_in)) {
         return false;
     } else {
         mp_obj_base_t *o = o_in;
diff --git a/py/objstr.c b/py/objstr.c
index 09d4958..337b42e 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -278,6 +278,16 @@
     }
 }
 
+// TODO: (Much) more variety in args
+static mp_obj_t str_startswith(mp_obj_t self_in, mp_obj_t arg) {
+    GET_STR_DATA_LEN(self_in, str, str_len);
+    GET_STR_DATA_LEN(arg, prefix, prefix_len);
+    if (prefix_len > str_len) {
+        return mp_const_false;
+    }
+    return MP_BOOL(memcmp(str, prefix, prefix_len) == 0);
+}
+
 static bool chr_in_str(const byte* const str, const size_t str_len, int c) {
     for (size_t i = 0; i < str_len; i++) {
         if (str[i] == c) {
@@ -364,6 +374,7 @@
 static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_find_obj, 2, 4, str_find);
 static MP_DEFINE_CONST_FUN_OBJ_2(str_join_obj, str_join);
 static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_split_obj, 1, 3, str_split);
+static MP_DEFINE_CONST_FUN_OBJ_2(str_startswith_obj, str_startswith);
 static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_strip_obj, 1, 2, str_strip);
 static MP_DEFINE_CONST_FUN_OBJ_VAR(str_format_obj, 1, str_format);
 
@@ -371,6 +382,7 @@
     { "find", &str_find_obj },
     { "join", &str_join_obj },
     { "split", &str_split_obj },
+    { "startswith", &str_startswith_obj },
     { "strip", &str_strip_obj },
     { "format", &str_format_obj },
     { NULL, NULL }, // end-of-list sentinel
diff --git a/stm/string0.c b/stm/string0.c
index 4899e7b..79fd4cc 100644
--- a/stm/string0.c
+++ b/stm/string0.c
@@ -34,6 +34,16 @@
     return s;
 }
 
+int memcmp(const char *s1, const char *s2, size_t n) {
+    while (n--) {
+        char c1 = *s1++;
+        char c2 = *s2++;
+        if (c1 < c2) return -1;
+        else if (c1 > c2) return 1;
+    }
+    return 0;
+}
+
 size_t strlen(const char *str) {
     int len = 0;
     for (const char *s = str; *s; s++) {
diff --git a/tests/basics/builtin-callable.py b/tests/basics/builtin-callable.py
new file mode 100644
index 0000000..caddb88
--- /dev/null
+++ b/tests/basics/builtin-callable.py
@@ -0,0 +1,5 @@
+import sys
+print(callable(1))
+print(callable("dfsd"))
+print(callable(callable))
+print(callable(sys))
diff --git a/tests/basics/string_startswith.py b/tests/basics/string_startswith.py
new file mode 100644
index 0000000..99d653e
--- /dev/null
+++ b/tests/basics/string_startswith.py
@@ -0,0 +1,5 @@
+print("foobar".startswith("foo"))
+print("foobar".startswith("Foo"))
+print("foobar".startswith("foo1"))
+print("foobar".startswith("foobar"))
+print("foobar".startswith(""))