diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2023-08-23 15:14:03 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2023-08-23 15:14:03 -0300 |
| commit | c815c2f0eb7a4ac01d4f664f3db44c199ee4e211 (patch) | |
| tree | 63cdeea69af0df9ff82303d05c517068eb54e56e /lvm.c | |
| parent | ab6a94952215b1f66436d8eeebded1dad9fa5409 (diff) | |
| parent | 9363a8b9901a5643c9da061ea8dda8a86cdc7ef1 (diff) | |
| download | lua-c815c2f0eb7a4ac01d4f664f3db44c199ee4e211.tar.gz lua-c815c2f0eb7a4ac01d4f664f3db44c199ee4e211.tar.bz2 lua-c815c2f0eb7a4ac01d4f664f3db44c199ee4e211.zip | |
Merge branch 'master' into nextversion
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 30 |
1 files changed, 13 insertions, 17 deletions
| @@ -91,8 +91,10 @@ static int l_strton (const TValue *obj, TValue *result) { | |||
| 91 | lua_assert(obj != result); | 91 | lua_assert(obj != result); |
| 92 | if (!cvt2num(obj)) /* is object not a string? */ | 92 | if (!cvt2num(obj)) /* is object not a string? */ |
| 93 | return 0; | 93 | return 0; |
| 94 | else | 94 | else { |
| 95 | return (luaO_str2num(svalue(obj), result) == vslen(obj) + 1); | 95 | TString *st = tsvalue(obj); |
| 96 | return (luaO_str2num(getstr(st), result) == tsslen(st) + 1); | ||
| 97 | } | ||
| 96 | } | 98 | } |
| 97 | 99 | ||
| 98 | 100 | ||
| @@ -627,8 +629,9 @@ int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) { | |||
| 627 | static void copy2buff (StkId top, int n, char *buff) { | 629 | static void copy2buff (StkId top, int n, char *buff) { |
| 628 | size_t tl = 0; /* size already copied */ | 630 | size_t tl = 0; /* size already copied */ |
| 629 | do { | 631 | do { |
| 630 | size_t l = vslen(s2v(top - n)); /* length of string being copied */ | 632 | TString *st = tsvalue(s2v(top - n)); |
| 631 | memcpy(buff + tl, svalue(s2v(top - n)), l * sizeof(char)); | 633 | size_t l = tsslen(st); /* length of string being copied */ |
| 634 | memcpy(buff + tl, getstr(st), l * sizeof(char)); | ||
| 632 | tl += l; | 635 | tl += l; |
| 633 | } while (--n > 0); | 636 | } while (--n > 0); |
| 634 | } | 637 | } |
| @@ -654,11 +657,11 @@ void luaV_concat (lua_State *L, int total) { | |||
| 654 | } | 657 | } |
| 655 | else { | 658 | else { |
| 656 | /* at least two non-empty string values; get as many as possible */ | 659 | /* at least two non-empty string values; get as many as possible */ |
| 657 | size_t tl = vslen(s2v(top - 1)); | 660 | size_t tl = tsslen(tsvalue(s2v(top - 1))); |
| 658 | TString *ts; | 661 | TString *ts; |
| 659 | /* collect total length and number of strings */ | 662 | /* collect total length and number of strings */ |
| 660 | for (n = 1; n < total && tostring(L, s2v(top - n - 1)); n++) { | 663 | for (n = 1; n < total && tostring(L, s2v(top - n - 1)); n++) { |
| 661 | size_t l = vslen(s2v(top - n - 1)); | 664 | size_t l = tsslen(tsvalue(s2v(top - n - 1))); |
| 662 | if (l_unlikely(l >= (MAX_SIZE/sizeof(char)) - tl)) { | 665 | if (l_unlikely(l >= (MAX_SIZE/sizeof(char)) - tl)) { |
| 663 | L->top.p = top - total; /* pop strings to avoid wasting stack */ | 666 | L->top.p = top - total; /* pop strings to avoid wasting stack */ |
| 664 | luaG_runerror(L, "string length overflow"); | 667 | luaG_runerror(L, "string length overflow"); |
| @@ -672,7 +675,7 @@ void luaV_concat (lua_State *L, int total) { | |||
| 672 | } | 675 | } |
| 673 | else { /* long string; copy strings directly to final result */ | 676 | else { /* long string; copy strings directly to final result */ |
| 674 | ts = luaS_createlngstrobj(L, tl); | 677 | ts = luaS_createlngstrobj(L, tl); |
| 675 | copy2buff(top, n, getstr(ts)); | 678 | copy2buff(top, n, getlngstr(ts)); |
| 676 | } | 679 | } |
| 677 | setsvalue2s(L, top - n, ts); /* create result */ | 680 | setsvalue2s(L, top - n, ts); /* create result */ |
| 678 | } | 681 | } |
| @@ -1158,18 +1161,11 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
| 1158 | startfunc: | 1161 | startfunc: |
| 1159 | trap = L->hookmask; | 1162 | trap = L->hookmask; |
| 1160 | returning: /* trap already set */ | 1163 | returning: /* trap already set */ |
| 1161 | cl = clLvalue(s2v(ci->func.p)); | 1164 | cl = ci_func(ci); |
| 1162 | k = cl->p->k; | 1165 | k = cl->p->k; |
| 1163 | pc = ci->u.l.savedpc; | 1166 | pc = ci->u.l.savedpc; |
| 1164 | if (l_unlikely(trap)) { | 1167 | if (l_unlikely(trap)) |
| 1165 | if (pc == cl->p->code) { /* first instruction (not resuming)? */ | 1168 | trap = luaG_tracecall(L); |
| 1166 | if (cl->p->is_vararg) | ||
| 1167 | trap = 0; /* hooks will start after VARARGPREP instruction */ | ||
| 1168 | else /* check 'call' hook */ | ||
| 1169 | luaD_hookcall(L, ci); | ||
| 1170 | } | ||
| 1171 | ci->u.l.trap = 1; /* assume trap is on, for now */ | ||
| 1172 | } | ||
| 1173 | base = ci->func.p + 1; | 1169 | base = ci->func.p + 1; |
| 1174 | /* main loop of interpreter */ | 1170 | /* main loop of interpreter */ |
| 1175 | for (;;) { | 1171 | for (;;) { |
