error when indexing strings with invalid keys

This commit is contained in:
Roberto Ierusalimschy 2010-12-20 15:25:36 -02:00
parent 8d579c5bc5
commit 8980c630bf

View File

@ -1,5 +1,5 @@
/* /*
** $Id: lstrlib.c,v 1.159 2010/11/19 16:25:51 roberto Exp roberto $ ** $Id: lstrlib.c,v 1.160 2010/12/10 19:03:46 roberto Exp roberto $
** Standard library for string operations and pattern-matching ** Standard library for string operations and pattern-matching
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -903,6 +903,15 @@ static int str_format (lua_State *L) {
/* }====================================================== */ /* }====================================================== */
static int noindex (lua_State *L) {
const char *f = lua_tostring(L, 2);
if (f)
return luaL_error(L, "no field '%s' in strings", f);
else
return luaL_error(L, "no such field in strings");
}
static const luaL_Reg strlib[] = { static const luaL_Reg strlib[] = {
{"byte", str_byte}, {"byte", str_byte},
{"char", str_char}, {"char", str_char},
@ -918,19 +927,22 @@ static const luaL_Reg strlib[] = {
{"reverse", str_reverse}, {"reverse", str_reverse},
{"sub", str_sub}, {"sub", str_sub},
{"upper", str_upper}, {"upper", str_upper},
{"__index", noindex},
{NULL, NULL} {NULL, NULL}
}; };
static void createmetatable (lua_State *L) { static void createmetatable (lua_State *L) {
lua_createtable(L, 0, 1); /* create metatable for strings */ /* setmetatable("", {__index = string}) */
lua_pushliteral(L, ""); /* dummy string */ lua_pushliteral(L, ""); /* dummy string */
lua_pushvalue(L, -2); lua_createtable(L, 0, 1); /* create metatable for strings */
lua_setmetatable(L, -2); /* set string metatable */ lua_pushvalue(L, -3); /* set the string library... */
lua_setfield(L, -2, "__index"); /* ...as the __index metamethod */
lua_setmetatable(L, -2); /* set metatable for strings */
lua_pop(L, 1); /* pop dummy string */ lua_pop(L, 1); /* pop dummy string */
lua_pushvalue(L, -2); /* string library... */ /* setmetatable(string, string) */
lua_setfield(L, -2, "__index"); /* ...is the __index metamethod */ lua_pushvalue(L, -1); /* push string library */
lua_pop(L, 1); /* pop metatable */ lua_setmetatable(L, -2); /* set it as its own metatable */
} }