diff --git a/src/if_lua.c b/src/if_lua.c
index 78bc190..6941789 100644
--- a/src/if_lua.c
+++ b/src/if_lua.c
@@ -505,18 +505,20 @@
 {
     void *p = lua_touserdata(L, ud);
 
-    if (p != NULL) // value is userdata?
+    if (p == NULL)
+	return NULL;
+
+    // value is userdata
+    if (lua_getmetatable(L, ud)) // does it have a metatable?
     {
-	if (lua_getmetatable(L, ud)) // does it have a metatable?
+	luaV_getfield(L, tname); // get metatable
+	if (lua_rawequal(L, -1, -2)) // MTs match?
 	{
-	    luaV_getfield(L, tname); // get metatable
-	    if (lua_rawequal(L, -1, -2)) // MTs match?
-	    {
-		lua_pop(L, 2); // MTs
-		return p;
-	    }
+	    lua_pop(L, 2); // MTs
+	    return p;
 	}
     }
+
     return NULL;
 }
 
@@ -1090,17 +1092,19 @@
     dictitem_T *di = dict_find(d, key, -1);
 
     if (di == NULL)
-	lua_pushnil(L);
-    else
     {
-	luaV_pushtypval(L, &di->di_tv);
-	if (di->di_tv.v_type == VAR_FUNC) // funcref?
-	{
-	    luaV_Funcref *f = (luaV_Funcref *) lua_touserdata(L, -1);
-	    f->self = d; // keep "self" reference
-	    d->dv_refcount++;
-	}
+	lua_pushnil(L);
+	return 1;
     }
+
+    luaV_pushtypval(L, &di->di_tv);
+    if (di->di_tv.v_type == VAR_FUNC) // funcref?
+    {
+	luaV_Funcref *f = (luaV_Funcref *) lua_touserdata(L, -1);
+	f->self = d; // keep "self" reference
+	d->dv_refcount++;
+    }
+
     return 1;
 }
 
@@ -1235,20 +1239,22 @@
     blob_T *b = luaV_unbox(L, luaV_Blob, 1);
     if (b->bv_lock)
 	luaL_error(L, "blob is locked");
-    if (lua_isnumber(L, 2))
+
+    if (!lua_isnumber(L, 2))
+	return 0;
+
+    long len = blob_len(b);
+    int idx = luaL_checkinteger(L, 2);
+    int val = luaL_checkinteger(L, 3);
+    if (idx < len || (idx == len && ga_grow(&b->bv_ga, 1) == OK))
     {
-	long len = blob_len(b);
-	int idx = luaL_checkinteger(L, 2);
-	int val = luaL_checkinteger(L, 3);
-	if (idx < len || (idx == len && ga_grow(&b->bv_ga, 1) == OK))
-	{
-	    blob_set(b, idx, (char_u) val);
-	    if (idx == len)
-		++b->bv_ga.ga_len;
-	}
-	else
-	    luaL_error(L, "index out of range");
+	blob_set(b, idx, (char_u) val);
+	if (idx == len)
+	    ++b->bv_ga.ga_len;
     }
+    else
+	luaL_error(L, "index out of range");
+
     return 0;
 }
 
@@ -1943,30 +1949,34 @@
 
     if (initarg && lua_type(L, 1) != LUA_TTABLE)
 	luaL_error(L, "table expected, got %s", luaL_typename(L, 1));
+
     l = list_alloc();
     if (l == NULL)
-	lua_pushnil(L);
-    else
     {
-	luaV_newlist(L, l);
-	if (initarg) // traverse table to init list
-	{
-	    int notnil, i = 0;
-	    typval_T v;
-	    do
-	    {
-		lua_rawgeti(L, 1, ++i);
-		notnil = !lua_isnil(L, -1);
-		if (notnil)
-		{
-		    luaV_checktypval(L, -1, &v, "vim.list");
-		    list_append_tv(l, &v);
-		    clear_tv(&v);
-		}
-		lua_pop(L, 1); // value
-	    } while (notnil);
-	}
+	lua_pushnil(L);
+	return 1;
     }
+
+    luaV_newlist(L, l);
+    if (!initarg)
+	return 1;
+
+    // traverse table to init list
+    int notnil, i = 0;
+    typval_T v;
+    do
+    {
+	lua_rawgeti(L, 1, ++i);
+	notnil = !lua_isnil(L, -1);
+	if (notnil)
+	{
+	    luaV_checktypval(L, -1, &v, "vim.list");
+	    list_append_tv(l, &v);
+	    clear_tv(&v);
+	}
+	lua_pop(L, 1); // value
+    } while (notnil);
+
     return 1;
 }
 
@@ -1978,43 +1988,47 @@
 
     if (initarg && lua_type(L, 1) != LUA_TTABLE)
 	luaL_error(L, "table expected, got %s", luaL_typename(L, 1));
+
     d = dict_alloc();
     if (d == NULL)
-	lua_pushnil(L);
-    else
     {
-	luaV_newdict(L, d);
-	if (initarg) // traverse table to init dict
+	lua_pushnil(L);
+	return 1;
+    }
+
+    luaV_newdict(L, d);
+    if (!initarg)
+	return 1;
+
+    // traverse table to init dict
+    lua_pushnil(L);
+    while (lua_next(L, 1))
+    {
+	char_u *key;
+	dictitem_T *di;
+	typval_T v;
+
+	lua_pushvalue(L, -2); // dup key in case it's a number
+	key = (char_u *) lua_tostring(L, -1);
+	if (key == NULL)
 	{
 	    lua_pushnil(L);
-	    while (lua_next(L, 1))
-	    {
-		char_u *key;
-		dictitem_T *di;
-		typval_T v;
-
-		lua_pushvalue(L, -2); // dup key in case it's a number
-		key = (char_u *) lua_tostring(L, -1);
-		if (key == NULL)
-		{
-		    lua_pushnil(L);
-		    return 1;
-		}
-		if (*key == NUL)
-		    luaL_error(L, "table has empty key");
-		luaV_checktypval(L, -2, &v, "vim.dict"); // value
-		di = dictitem_alloc(key);
-		if (di == NULL || dict_add(d, di) == FAIL)
-		{
-		    vim_free(di);
-		    lua_pushnil(L);
-		    return 1;
-		}
-		di->di_tv = v;
-		lua_pop(L, 2); // key copy and value
-	    }
+	    return 1;
 	}
+	if (*key == NUL)
+	    luaL_error(L, "table has empty key");
+	luaV_checktypval(L, -2, &v, "vim.dict"); // value
+	di = dictitem_alloc(key);
+	if (di == NULL || dict_add(d, di) == FAIL)
+	{
+	    vim_free(di);
+	    lua_pushnil(L);
+	    return 1;
+	}
+	di->di_tv = v;
+	lua_pop(L, 2); // key copy and value
     }
+
     return 1;
 }
 
@@ -2026,22 +2040,26 @@
 
     if (initarg && !lua_isstring(L, 1))
 	luaL_error(L, "string expected, got %s", luaL_typename(L, 1));
+
     b = blob_alloc();
     if (b == NULL)
-	lua_pushnil(L);
-    else
     {
-	luaV_newblob(L, b);
-	if (initarg)
-	{
-	    size_t i, l = 0;
-	    const char *s = lua_tolstring(L, 1, &l);
-
-	    if (ga_grow(&b->bv_ga, (int)l) == OK)
-		for (i = 0; i < l; ++i)
-		    ga_append(&b->bv_ga, s[i]);
-	}
+	lua_pushnil(L);
+	return 1;
     }
+
+    luaV_newblob(L, b);
+    if (!initarg)
+	return 1;
+
+    // traverse table to init blob
+    size_t i, l = 0;
+    const char *s = lua_tolstring(L, 1, &l);
+
+    if (ga_grow(&b->bv_ga, (int)l) == OK)
+	for (i = 0; i < l; ++i)
+	    ga_append(&b->bv_ga, s[i]);
+
     return 1;
 }
 
@@ -2548,28 +2566,29 @@
     static int
 lua_init(void)
 {
-    if (!lua_isopen())
-    {
+    if (lua_isopen())
+	return OK;
+
 #ifdef DYNAMIC_LUA
-	if (!lua_enabled(TRUE))
-	{
-	    emsg(_("Lua library cannot be loaded."));
-	    return FAIL;
-	}
-#endif
-	L = luaV_newstate();
+    if (!lua_enabled(TRUE))
+    {
+	emsg(_("Lua library cannot be loaded."));
+	return FAIL;
     }
+#endif
+    L = luaV_newstate();
+
     return OK;
 }
 
     void
 lua_end(void)
 {
-    if (lua_isopen())
-    {
-	lua_close(L);
-	L = NULL;
-    }
+    if (!lua_isopen())
+	return;
+
+    lua_close(L);
+    L = NULL;
 }
 
 /*
@@ -2698,31 +2717,32 @@
 {
     int aborted = 0;
 
-    if (lua_isopen())
-    {
-	luaV_getfield(L, LUAVIM_SETREF);
-	// call the function with 1 arg, getting 1 result back
-	lua_pushinteger(L, copyID);
-	lua_call(L, 1, 1);
-	// get the result
-	aborted = lua_tointeger(L, -1);
-	// pop result off the stack
-	lua_pop(L, 1);
-    }
+    if (!lua_isopen())
+	return 0;
+
+    luaV_getfield(L, LUAVIM_SETREF);
+    // call the function with 1 arg, getting 1 result back
+    lua_pushinteger(L, copyID);
+    lua_call(L, 1, 1);
+    // get the result
+    aborted = lua_tointeger(L, -1);
+    // pop result off the stack
+    lua_pop(L, 1);
+
     return aborted;
 }
 
     void
 update_package_paths_in_lua()
 {
-    if (lua_isopen())
-    {
-	lua_getglobal(L, "vim");
-	lua_getfield(L, -1, "_update_package_paths");
+    if (!lua_isopen())
+	return;
 
-	if (lua_pcall(L, 0, 0, 0))
-	    luaV_emsg(L);
-    }
+    lua_getglobal(L, "vim");
+    lua_getfield(L, -1, "_update_package_paths");
+
+    if (lua_pcall(L, 0, 0, 0))
+	luaV_emsg(L);
 }
 
 /*
