@@ -110,7 +110,15 @@ export class _Lexer<ParserOutput = string, RendererOutput = string> {
110110 src = src . replace ( other . tabCharGlobal , ' ' ) . replace ( other . spaceLine , '' ) ;
111111 }
112112
113+ let srcLength = Infinity ;
113114 while ( src ) {
115+ if ( src . length < srcLength ) {
116+ srcLength = src . length ;
117+ } else {
118+ this . infiniteLoopError ( src . charCodeAt ( 0 ) ) ;
119+ break ;
120+ }
121+
114122 let token : Tokens . Generic | undefined ;
115123
116124 if ( this . options . extensions ?. block ?. some ( ( extTokenizer ) => {
@@ -275,13 +283,8 @@ export class _Lexer<ParserOutput = string, RendererOutput = string> {
275283 }
276284
277285 if ( src ) {
278- const errMsg = 'Infinite loop on byte: ' + src . charCodeAt ( 0 ) ;
279- if ( this . options . silent ) {
280- console . error ( errMsg ) ;
281- break ;
282- } else {
283- throw new Error ( errMsg ) ;
284- }
286+ this . infiniteLoopError ( src . charCodeAt ( 0 ) ) ;
287+ break ;
285288 }
286289 }
287290
@@ -334,7 +337,15 @@ export class _Lexer<ParserOutput = string, RendererOutput = string> {
334337
335338 let keepPrevChar = false ;
336339 let prevChar = '' ;
340+ let srcLength = Infinity ;
337341 while ( src ) {
342+ if ( src . length < srcLength ) {
343+ srcLength = src . length ;
344+ } else {
345+ this . infiniteLoopError ( src . charCodeAt ( 0 ) ) ;
346+ break ;
347+ }
348+
338349 if ( ! keepPrevChar ) {
339350 prevChar = '' ;
340351 }
@@ -464,16 +475,20 @@ export class _Lexer<ParserOutput = string, RendererOutput = string> {
464475 }
465476
466477 if ( src ) {
467- const errMsg = 'Infinite loop on byte: ' + src . charCodeAt ( 0 ) ;
468- if ( this . options . silent ) {
469- console . error ( errMsg ) ;
470- break ;
471- } else {
472- throw new Error ( errMsg ) ;
473- }
478+ this . infiniteLoopError ( src . charCodeAt ( 0 ) ) ;
479+ break ;
474480 }
475481 }
476482
477483 return tokens ;
478484 }
485+
486+ private infiniteLoopError ( byte : number ) {
487+ const errMsg = 'Infinite loop on byte: ' + byte ;
488+ if ( this . options . silent ) {
489+ console . error ( errMsg ) ;
490+ } else {
491+ throw new Error ( errMsg ) ;
492+ }
493+ }
479494}
0 commit comments