summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2016-02-26 16:20:15 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2016-02-26 16:20:15 -0300
commit7777b412deb46d051967b699697d1d6e6286a7b6 (patch)
treed6af032d014eb42f7328d071934156a37050fbbc
parentc3e9b14d24afe14b2fc59c83d134430be5568769 (diff)
downloadlua-7777b412deb46d051967b699697d1d6e6286a7b6.tar.gz
lua-7777b412deb46d051967b699697d1d6e6286a7b6.tar.bz2
lua-7777b412deb46d051967b699697d1d6e6286a7b6.zip
When available, use metafield '__name' in error messages
-rw-r--r--ldebug.c10
-rw-r--r--ltm.c18
-rw-r--r--ltm.h5
3 files changed, 25 insertions, 8 deletions
diff --git a/ldebug.c b/ldebug.c
index 5daa3c02..1db451b7 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldebug.c,v 2.117 2015/11/02 18:48:07 roberto Exp roberto $ 2** $Id: ldebug.c,v 2.118 2015/12/16 16:40:07 roberto Exp roberto $
3** Debug Interface 3** Debug Interface
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -564,7 +564,7 @@ static const char *varinfo (lua_State *L, const TValue *o) {
564 564
565 565
566l_noret luaG_typeerror (lua_State *L, const TValue *o, const char *op) { 566l_noret luaG_typeerror (lua_State *L, const TValue *o, const char *op) {
567 const char *t = objtypename(o); 567 const char *t = luaT_objtypename(L, o);
568 luaG_runerror(L, "attempt to %s a %s value%s", op, t, varinfo(L, o)); 568 luaG_runerror(L, "attempt to %s a %s value%s", op, t, varinfo(L, o));
569} 569}
570 570
@@ -596,9 +596,9 @@ l_noret luaG_tointerror (lua_State *L, const TValue *p1, const TValue *p2) {
596 596
597 597
598l_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) { 598l_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) {
599 const char *t1 = objtypename(p1); 599 const char *t1 = luaT_objtypename(L, p1);
600 const char *t2 = objtypename(p2); 600 const char *t2 = luaT_objtypename(L, p2);
601 if (t1 == t2) 601 if (strcmp(t1, t2) == 0)
602 luaG_runerror(L, "attempt to compare two %s values", t1); 602 luaG_runerror(L, "attempt to compare two %s values", t1);
603 else 603 else
604 luaG_runerror(L, "attempt to compare %s with %s", t1, t2); 604 luaG_runerror(L, "attempt to compare %s with %s", t1, t2);
diff --git a/ltm.c b/ltm.c
index 3f400d4b..cc28a414 100644
--- a/ltm.c
+++ b/ltm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltm.c,v 2.35 2015/11/02 18:48:07 roberto Exp roberto $ 2** $Id: ltm.c,v 2.36 2015/11/03 15:47:30 roberto Exp roberto $
3** Tag methods 3** Tag methods
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -83,6 +83,22 @@ const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {
83} 83}
84 84
85 85
86/*
87** Return the name of the type of an object. For tables and userdata
88** with metatable, use their '__name' metafield, if present.
89*/
90const char *luaT_objtypename (lua_State *L, const TValue *o) {
91 Table *mt;
92 if ((ttistable(o) && (mt = hvalue(o)->metatable) != NULL) ||
93 (ttisfulluserdata(o) && (mt = uvalue(o)->metatable) != NULL)) {
94 const TValue *name = luaH_getshortstr(mt, luaS_new(L, "__name"));
95 if (ttisstring(name)) /* is '__name' a string? */
96 return getstr(tsvalue(name)); /* use it as type name */
97 }
98 return ttypename(ttnov(o)); /* else use standard type name */
99}
100
101
86void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, 102void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,
87 const TValue *p2, TValue *p3, int hasres) { 103 const TValue *p2, TValue *p3, int hasres) {
88 ptrdiff_t result = savestack(L, p3); 104 ptrdiff_t result = savestack(L, p3);
diff --git a/ltm.h b/ltm.h
index 19660b20..70569f82 100644
--- a/ltm.h
+++ b/ltm.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltm.h,v 2.20 2014/06/10 18:53:18 roberto Exp roberto $ 2** $Id: ltm.h,v 2.21 2014/10/25 11:50:46 roberto Exp roberto $
3** Tag methods 3** Tag methods
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -51,11 +51,12 @@ typedef enum {
51#define fasttm(l,et,e) gfasttm(G(l), et, e) 51#define fasttm(l,et,e) gfasttm(G(l), et, e)
52 52
53#define ttypename(x) luaT_typenames_[(x) + 1] 53#define ttypename(x) luaT_typenames_[(x) + 1]
54#define objtypename(x) ttypename(ttnov(x))
55 54
56LUAI_DDEC const char *const luaT_typenames_[LUA_TOTALTAGS]; 55LUAI_DDEC const char *const luaT_typenames_[LUA_TOTALTAGS];
57 56
58 57
58LUAI_FUNC const char *luaT_objtypename (lua_State *L, const TValue *o);
59
59LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename); 60LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename);
60LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, 61LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o,
61 TMS event); 62 TMS event);