aboutsummaryrefslogtreecommitdiff
path: root/src/lua/lobject.c
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2020-07-18 16:45:50 +0800
committerLi Jin <dragon-fly@qq.com>2020-07-18 16:45:50 +0800
commit8c596dc1efa8a1267c222b168a4de9c8ba254760 (patch)
tree699c748e101a48ae267b5f7b19adbfea15f3934e /src/lua/lobject.c
parent8ab0038c09a79fa8401bb10b7a31d03ef5380417 (diff)
downloadyuescript-8c596dc1efa8a1267c222b168a4de9c8ba254760.tar.gz
yuescript-8c596dc1efa8a1267c222b168a4de9c8ba254760.tar.bz2
yuescript-8c596dc1efa8a1267c222b168a4de9c8ba254760.zip
fix issue for using return statement with export.
Diffstat (limited to 'src/lua/lobject.c')
-rw-r--r--src/lua/lobject.c49
1 files changed, 29 insertions, 20 deletions
diff --git a/src/lua/lobject.c b/src/lua/lobject.c
index b4efae4..f8ea917 100644
--- a/src/lua/lobject.c
+++ b/src/lua/lobject.c
@@ -215,37 +215,42 @@ static lua_Number lua_strx2number (const char *s, char **endptr) {
215/* }====================================================== */ 215/* }====================================================== */
216 216
217 217
218/* maximum length of a numeral */ 218/* maximum length of a numeral to be converted to a number */
219#if !defined (L_MAXLENNUM) 219#if !defined (L_MAXLENNUM)
220#define L_MAXLENNUM 200 220#define L_MAXLENNUM 200
221#endif 221#endif
222 222
223/*
224** Convert string 's' to a Lua number (put in 'result'). Return NULL on
225** fail or the address of the ending '\0' on success. ('mode' == 'x')
226** means a hexadecimal numeral.
227*/
223static const char *l_str2dloc (const char *s, lua_Number *result, int mode) { 228static const char *l_str2dloc (const char *s, lua_Number *result, int mode) {
224 char *endptr; 229 char *endptr;
225 *result = (mode == 'x') ? lua_strx2number(s, &endptr) /* try to convert */ 230 *result = (mode == 'x') ? lua_strx2number(s, &endptr) /* try to convert */
226 : lua_str2number(s, &endptr); 231 : lua_str2number(s, &endptr);
227 if (endptr == s) return NULL; /* nothing recognized? */ 232 if (endptr == s) return NULL; /* nothing recognized? */
228 while (lisspace(cast_uchar(*endptr))) endptr++; /* skip trailing spaces */ 233 while (lisspace(cast_uchar(*endptr))) endptr++; /* skip trailing spaces */
229 return (*endptr == '\0') ? endptr : NULL; /* OK if no trailing characters */ 234 return (*endptr == '\0') ? endptr : NULL; /* OK iff no trailing chars */
230} 235}
231 236
232 237
233/* 238/*
234** Convert string 's' to a Lua number (put in 'result'). Return NULL 239** Convert string 's' to a Lua number (put in 'result') handling the
235** on fail or the address of the ending '\0' on success. 240** current locale.
236** 'pmode' points to (and 'mode' contains) special things in the string:
237** - 'x'/'X' means a hexadecimal numeral
238** - 'n'/'N' means 'inf' or 'nan' (which should be rejected)
239** - '.' just optimizes the search for the common case (nothing special)
240** This function accepts both the current locale or a dot as the radix 241** This function accepts both the current locale or a dot as the radix
241** mark. If the conversion fails, it may mean number has a dot but 242** mark. If the conversion fails, it may mean number has a dot but
242** locale accepts something else. In that case, the code copies 's' 243** locale accepts something else. In that case, the code copies 's'
243** to a buffer (because 's' is read-only), changes the dot to the 244** to a buffer (because 's' is read-only), changes the dot to the
244** current locale radix mark, and tries to convert again. 245** current locale radix mark, and tries to convert again.
246** The variable 'mode' checks for special characters in the string:
247** - 'n' means 'inf' or 'nan' (which should be rejected)
248** - 'x' means a hexadecimal numeral
249** - '.' just optimizes the search for the common case (no special chars)
245*/ 250*/
246static const char *l_str2d (const char *s, lua_Number *result) { 251static const char *l_str2d (const char *s, lua_Number *result) {
247 const char *endptr; 252 const char *endptr;
248 const char *pmode = strpbrk(s, ".xXnN"); 253 const char *pmode = strpbrk(s, ".xXnN"); /* look for special chars */
249 int mode = pmode ? ltolower(cast_uchar(*pmode)) : 0; 254 int mode = pmode ? ltolower(cast_uchar(*pmode)) : 0;
250 if (mode == 'n') /* reject 'inf' and 'nan' */ 255 if (mode == 'n') /* reject 'inf' and 'nan' */
251 return NULL; 256 return NULL;
@@ -333,8 +338,15 @@ int luaO_utf8esc (char *buff, unsigned long x) {
333} 338}
334 339
335 340
336/* maximum length of the conversion of a number to a string */ 341/*
337#define MAXNUMBER2STR 50 342** Maximum length of the conversion of a number to a string. Must be
343** enough to accommodate both LUA_INTEGER_FMT and LUA_NUMBER_FMT.
344** (For a long long int, this is 19 digits plus a sign and a final '\0',
345** adding to 21. For a long double, it can go to a sign, 33 digits,
346** the dot, an exponent letter, an exponent sign, 5 exponent digits,
347** and a final '\0', adding to 43.)
348*/
349#define MAXNUMBER2STR 44
338 350
339 351
340/* 352/*
@@ -375,7 +387,7 @@ void luaO_tostring (lua_State *L, TValue *obj) {
375*/ 387*/
376 388
377/* size for buffer space used by 'luaO_pushvfstring' */ 389/* size for buffer space used by 'luaO_pushvfstring' */
378#define BUFVFS 400 390#define BUFVFS 200
379 391
380/* buffer used by 'luaO_pushvfstring' */ 392/* buffer used by 'luaO_pushvfstring' */
381typedef struct BuffFS { 393typedef struct BuffFS {
@@ -387,18 +399,16 @@ typedef struct BuffFS {
387 399
388 400
389/* 401/*
390** Push given string to the stack, as part of the buffer. If the stack 402** Push given string to the stack, as part of the buffer, and
391** is almost full, join all partial strings in the stack into one. 403** join the partial strings in the stack into one.
392*/ 404*/
393static void pushstr (BuffFS *buff, const char *str, size_t l) { 405static void pushstr (BuffFS *buff, const char *str, size_t l) {
394 lua_State *L = buff->L; 406 lua_State *L = buff->L;
395 setsvalue2s(L, L->top, luaS_newlstr(L, str, l)); 407 setsvalue2s(L, L->top, luaS_newlstr(L, str, l));
396 L->top++; /* may use one extra slot */ 408 L->top++; /* may use one extra slot */
397 buff->pushed++; 409 buff->pushed++;
398 if (buff->pushed > 1 && L->top + 1 >= L->stack_last) { 410 luaV_concat(L, buff->pushed); /* join partial results into one */
399 luaV_concat(L, buff->pushed); /* join all partial results into one */ 411 buff->pushed = 1;
400 buff->pushed = 1;
401 }
402} 412}
403 413
404 414
@@ -521,8 +531,7 @@ const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) {
521 } 531 }
522 addstr2buff(&buff, fmt, strlen(fmt)); /* rest of 'fmt' */ 532 addstr2buff(&buff, fmt, strlen(fmt)); /* rest of 'fmt' */
523 clearbuff(&buff); /* empty buffer into the stack */ 533 clearbuff(&buff); /* empty buffer into the stack */
524 if (buff.pushed > 1) 534 lua_assert(buff.pushed == 1);
525 luaV_concat(L, buff.pushed); /* join all partial results */
526 return svalue(s2v(L->top - 1)); 535 return svalue(s2v(L->top - 1));
527} 536}
528 537