@@ -138,6 +138,7 @@ static void inclinenumber (LexState *ls) {
138138
139139
140140void luaX_setinput (lua_State * L , LexState * ls , ZIO * z , TString * source ) {
141+ ls -> t .token = 0 ;
141142 ls -> decpoint = '.' ;
142143 ls -> L = L ;
143144 ls -> lookahead .token = TK_EOS ; /* no look-ahead token */
@@ -207,20 +208,23 @@ static void read_numeral (LexState *ls, SemInfo *seminfo) {
207208}
208209
209210
210- static int skip_sep (LexState * ls ) {
211- int count = 0 ;
211+ static size_t skip_sep (LexState * ls ) {
212+ size_t count = 0 ;
212213 int s = ls -> current ;
213214 lua_assert (s == '[' || s == ']' );
214215 save_and_next (ls );
215216 while (ls -> current == '=' ) {
216217 save_and_next (ls );
217218 count ++ ;
218219 }
219- return (ls -> current == s ) ? count : (- count ) - 1 ;
220+
221+ return (ls -> current == s ) ? count + 2
222+ : (count == 0 ) ? 1
223+ : 0 ;
220224}
221225
222226
223- static void read_long_string (LexState * ls , SemInfo * seminfo , int sep ) {
227+ static void read_long_string (LexState * ls , SemInfo * seminfo , size_t sep ) {
224228 int cont = 0 ;
225229 (void )(cont ); /* avoid warnings when `cont' is not used */
226230 save_and_next (ls ); /* skip 2nd `[' */
@@ -270,8 +274,8 @@ static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
270274 }
271275 } endloop :
272276 if (seminfo )
273- seminfo -> ts = luaX_newstring (ls , luaZ_buffer (ls -> buff ) + ( 2 + sep ) ,
274- luaZ_bufflen (ls -> buff ) - 2 * ( 2 + sep ) );
277+ seminfo -> ts = luaX_newstring (ls , luaZ_buffer (ls -> buff ) + sep ,
278+ luaZ_bufflen (ls -> buff ) - 2 * sep );
275279}
276280
277281
@@ -346,9 +350,9 @@ static int llex (LexState *ls, SemInfo *seminfo) {
346350 /* else is a comment */
347351 next (ls );
348352 if (ls -> current == '[' ) {
349- int sep = skip_sep (ls );
353+ size_t sep = skip_sep (ls );
350354 luaZ_resetbuffer (ls -> buff ); /* `skip_sep' may dirty the buffer */
351- if (sep >= 0 ) {
355+ if (sep >= 2 ) {
352356 read_long_string (ls , NULL , sep ); /* long comment */
353357 luaZ_resetbuffer (ls -> buff );
354358 continue ;
@@ -360,13 +364,14 @@ static int llex (LexState *ls, SemInfo *seminfo) {
360364 continue ;
361365 }
362366 case '[' : {
363- int sep = skip_sep (ls );
364- if (sep >= 0 ) {
367+ size_t sep = skip_sep (ls );
368+ if (sep >= 2 ) {
365369 read_long_string (ls , seminfo , sep );
366370 return TK_STRING ;
367371 }
368- else if (sep == -1 ) return '[' ;
369- else luaX_lexerror (ls , "invalid long string delimiter" , TK_STRING );
372+ else if (sep == 0 ) /* '[=...' missing second bracket */
373+ luaX_lexerror (ls , "invalid long string delimiter" , TK_STRING );
374+ return '[' ;
370375 }
371376 case '=' : {
372377 next (ls );
0 commit comments