diff options
-rw-r--r-- | ldblib.c | 3 | ||||
-rw-r--r-- | ldebug.c | 14 | ||||
-rw-r--r-- | llimits.h | 4 | ||||
-rw-r--r-- | lobject.c | 27 | ||||
-rw-r--r-- | lobject.h | 2 | ||||
-rw-r--r-- | lua.h | 1 |
6 files changed, 31 insertions, 20 deletions
@@ -167,7 +167,8 @@ static int db_getinfo (lua_State *L) { | |||
167 | return luaL_argerror(L, arg+2, "invalid option"); | 167 | return luaL_argerror(L, arg+2, "invalid option"); |
168 | lua_newtable(L); /* table to collect results */ | 168 | lua_newtable(L); /* table to collect results */ |
169 | if (strchr(options, 'S')) { | 169 | if (strchr(options, 'S')) { |
170 | settabss(L, "source", ar.source); | 170 | lua_pushlstring(L, ar.source, ar.srclen); |
171 | lua_setfield(L, -2, "source"); | ||
171 | settabss(L, "short_src", ar.short_src); | 172 | settabss(L, "short_src", ar.short_src); |
172 | settabsi(L, "linedefined", ar.linedefined); | 173 | settabsi(L, "linedefined", ar.linedefined); |
173 | settabsi(L, "lastlinedefined", ar.lastlinedefined); | 174 | settabsi(L, "lastlinedefined", ar.lastlinedefined); |
@@ -262,18 +262,26 @@ LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { | |||
262 | static void funcinfo (lua_Debug *ar, Closure *cl) { | 262 | static void funcinfo (lua_Debug *ar, Closure *cl) { |
263 | if (noLuaClosure(cl)) { | 263 | if (noLuaClosure(cl)) { |
264 | ar->source = "=[C]"; | 264 | ar->source = "=[C]"; |
265 | ar->srclen = LL("=[C]"); | ||
265 | ar->linedefined = -1; | 266 | ar->linedefined = -1; |
266 | ar->lastlinedefined = -1; | 267 | ar->lastlinedefined = -1; |
267 | ar->what = "C"; | 268 | ar->what = "C"; |
268 | } | 269 | } |
269 | else { | 270 | else { |
270 | const Proto *p = cl->l.p; | 271 | const Proto *p = cl->l.p; |
271 | ar->source = p->source ? getstr(p->source) : "=?"; | 272 | if (p->source) { |
273 | ar->source = getstr(p->source); | ||
274 | ar->srclen = tsslen(p->source); | ||
275 | } | ||
276 | else { | ||
277 | ar->source = "=?"; | ||
278 | ar->srclen = LL("=?"); | ||
279 | } | ||
272 | ar->linedefined = p->linedefined; | 280 | ar->linedefined = p->linedefined; |
273 | ar->lastlinedefined = p->lastlinedefined; | 281 | ar->lastlinedefined = p->lastlinedefined; |
274 | ar->what = (ar->linedefined == 0) ? "main" : "Lua"; | 282 | ar->what = (ar->linedefined == 0) ? "main" : "Lua"; |
275 | } | 283 | } |
276 | luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); | 284 | luaO_chunkid(ar->short_src, ar->source, ar->srclen); |
277 | } | 285 | } |
278 | 286 | ||
279 | 287 | ||
@@ -750,7 +758,7 @@ const char *luaG_addinfo (lua_State *L, const char *msg, TString *src, | |||
750 | int line) { | 758 | int line) { |
751 | char buff[LUA_IDSIZE]; | 759 | char buff[LUA_IDSIZE]; |
752 | if (src) | 760 | if (src) |
753 | luaO_chunkid(buff, getstr(src), LUA_IDSIZE); | 761 | luaO_chunkid(buff, getstr(src), tsslen(src)); |
754 | else { /* no source available; use "?" instead */ | 762 | else { /* no source available; use "?" instead */ |
755 | buff[0] = '?'; buff[1] = '\0'; | 763 | buff[0] = '?'; buff[1] = '\0'; |
756 | } | 764 | } |
@@ -65,6 +65,10 @@ typedef signed char ls_byte; | |||
65 | #define ispow2(x) (((x) & ((x) - 1)) == 0) | 65 | #define ispow2(x) (((x) & ((x) - 1)) == 0) |
66 | 66 | ||
67 | 67 | ||
68 | /* number of chars of a literal string without the ending \0 */ | ||
69 | #define LL(x) (sizeof(x)/sizeof(char) - 1) | ||
70 | |||
71 | |||
68 | /* | 72 | /* |
69 | ** conversion of pointer to unsigned integer: | 73 | ** conversion of pointer to unsigned integer: |
70 | ** this is for hashing only; there is no problem if the integer | 74 | ** this is for hashing only; there is no problem if the integer |
@@ -473,45 +473,42 @@ const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) { | |||
473 | } | 473 | } |
474 | 474 | ||
475 | 475 | ||
476 | /* number of chars of a literal string without the ending \0 */ | ||
477 | #define LL(x) (sizeof(x)/sizeof(char) - 1) | ||
478 | |||
479 | #define RETS "..." | 476 | #define RETS "..." |
480 | #define PRE "[string \"" | 477 | #define PRE "[string \"" |
481 | #define POS "\"]" | 478 | #define POS "\"]" |
482 | 479 | ||
483 | #define addstr(a,b,l) ( memcpy(a,b,(l) * sizeof(char)), a += (l) ) | 480 | #define addstr(a,b,l) ( memcpy(a,b,(l) * sizeof(char)), a += (l) ) |
484 | 481 | ||
485 | void luaO_chunkid (char *out, const char *source, size_t bufflen) { | 482 | void luaO_chunkid (char *out, const char *source, size_t srclen) { |
486 | size_t l = strlen(source); | 483 | size_t bufflen = LUA_IDSIZE; /* free space in buffer */ |
487 | if (*source == '=') { /* 'literal' source */ | 484 | if (*source == '=') { /* 'literal' source */ |
488 | if (l <= bufflen) /* small enough? */ | 485 | if (srclen <= bufflen) /* small enough? */ |
489 | memcpy(out, source + 1, l * sizeof(char)); | 486 | memcpy(out, source + 1, srclen * sizeof(char)); |
490 | else { /* truncate it */ | 487 | else { /* truncate it */ |
491 | addstr(out, source + 1, bufflen - 1); | 488 | addstr(out, source + 1, bufflen - 1); |
492 | *out = '\0'; | 489 | *out = '\0'; |
493 | } | 490 | } |
494 | } | 491 | } |
495 | else if (*source == '@') { /* file name */ | 492 | else if (*source == '@') { /* file name */ |
496 | if (l <= bufflen) /* small enough? */ | 493 | if (srclen <= bufflen) /* small enough? */ |
497 | memcpy(out, source + 1, l * sizeof(char)); | 494 | memcpy(out, source + 1, srclen * sizeof(char)); |
498 | else { /* add '...' before rest of name */ | 495 | else { /* add '...' before rest of name */ |
499 | addstr(out, RETS, LL(RETS)); | 496 | addstr(out, RETS, LL(RETS)); |
500 | bufflen -= LL(RETS); | 497 | bufflen -= LL(RETS); |
501 | memcpy(out, source + 1 + l - bufflen, bufflen * sizeof(char)); | 498 | memcpy(out, source + 1 + srclen - bufflen, bufflen * sizeof(char)); |
502 | } | 499 | } |
503 | } | 500 | } |
504 | else { /* string; format as [string "source"] */ | 501 | else { /* string; format as [string "source"] */ |
505 | const char *nl = strchr(source, '\n'); /* find first new line (if any) */ | 502 | const char *nl = strchr(source, '\n'); /* find first new line (if any) */ |
506 | addstr(out, PRE, LL(PRE)); /* add prefix */ | 503 | addstr(out, PRE, LL(PRE)); /* add prefix */ |
507 | bufflen -= LL(PRE RETS POS) + 1; /* save space for prefix+suffix+'\0' */ | 504 | bufflen -= LL(PRE RETS POS) + 1; /* save space for prefix+suffix+'\0' */ |
508 | if (l < bufflen && nl == NULL) { /* small one-line source? */ | 505 | if (srclen < bufflen && nl == NULL) { /* small one-line source? */ |
509 | addstr(out, source, l); /* keep it */ | 506 | addstr(out, source, srclen); /* keep it */ |
510 | } | 507 | } |
511 | else { | 508 | else { |
512 | if (nl != NULL) l = nl - source; /* stop at first newline */ | 509 | if (nl != NULL) srclen = nl - source; /* stop at first newline */ |
513 | if (l > bufflen) l = bufflen; | 510 | if (srclen > bufflen) srclen = bufflen; |
514 | addstr(out, source, l); | 511 | addstr(out, source, srclen); |
515 | addstr(out, RETS, LL(RETS)); | 512 | addstr(out, RETS, LL(RETS)); |
516 | } | 513 | } |
517 | memcpy(out, POS, (LL(POS) + 1) * sizeof(char)); | 514 | memcpy(out, POS, (LL(POS) + 1) * sizeof(char)); |
@@ -747,7 +747,7 @@ LUAI_FUNC void luaO_tostring (lua_State *L, TValue *obj); | |||
747 | LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, | 747 | LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, |
748 | va_list argp); | 748 | va_list argp); |
749 | LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); | 749 | LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); |
750 | LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len); | 750 | LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t srclen); |
751 | 751 | ||
752 | 752 | ||
753 | #endif | 753 | #endif |
@@ -469,6 +469,7 @@ struct lua_Debug { | |||
469 | const char *namewhat; /* (n) 'global', 'local', 'field', 'method' */ | 469 | const char *namewhat; /* (n) 'global', 'local', 'field', 'method' */ |
470 | const char *what; /* (S) 'Lua', 'C', 'main', 'tail' */ | 470 | const char *what; /* (S) 'Lua', 'C', 'main', 'tail' */ |
471 | const char *source; /* (S) */ | 471 | const char *source; /* (S) */ |
472 | size_t srclen; /* (S) */ | ||
472 | int currentline; /* (l) */ | 473 | int currentline; /* (l) */ |
473 | int linedefined; /* (S) */ | 474 | int linedefined; /* (S) */ |
474 | int lastlinedefined; /* (S) */ | 475 | int lastlinedefined; /* (S) */ |