empty kw dict is ok for builtins
diff --git a/Python/ceval.c b/Python/ceval.c
index a0431aa..d725d35 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -2281,6 +2281,11 @@
 	else
 		INCREF(arg);
 
+	if (kw != NULL && !is_dictobject(kw)) {
+		err_setstr(TypeError, "keyword list must be a dictionary");
+		return NULL;
+	}
+
         if (call = func->ob_type->tp_call)
                 result = (*call)(func, arg, kw);
         else if (is_instancemethodobject(func) || is_funcobject(func))
@@ -2316,7 +2321,7 @@
 		}
 		if (flags & METH_KEYWORDS)
 			return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
-		if (kw != NULL) {
+		if (kw != NULL && getmappingsize(kw) != 0) {
 			err_setstr(TypeError,
 				   "this function takes no keyword arguments");
 			return NULL;