Changeset 6adae6a0 in OpenModelica


Ignore:
Timestamp:
2021-04-06T08:26:47+02:00 (3 years ago)
Author:
GitHub <noreply@…>
Branches:
maintenance/v1.16
Parents:
11fcab4
git-author:
Martin Sjölund <martin@…> (04/06/21 08:26:47)
git-committer:
GitHub <noreply@…> (04/06/21 08:26:47)
Message:

Fix artificial limits in the JSON lexer (#7353)

Location:
OMCompiler/Compiler/Lexers
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • OMCompiler/Compiler/Lexers/LexerJSON.mo

    r54f309f r6adae6a0  
    237237  output list<Token> errorTokens={};
    238238protected
    239   Integer startSt,numStates,i,r,cTok,cTok2,currSt,pos,sPos,ePos,linenr,contentLen,numBacktrack,buffer,lineNrStart;
     239  Integer startSt,i,r,cTok,cTok2,currSt,pos,sPos,ePos,linenr,contentLen,numBacktrack,buffer,lineNrStart;
    240240  list<Integer> cProg,cProg2;
    241241  list<String> chars;
    242   array<Integer> states;
     242  list<Integer> states;
    243243  String s1,s2;
    244244  import MetaModelica.Dangerous.listReverseInPlace;
     
    257257  buffer := 0;
    258258
    259   states := arrayCreate(128,1);
    260   numStates := 1;
     259  states := {};
    261260
    262261  if (debug==true) then
     
    274273  while i <= contentLen loop
    275274     cTok := stringGet(contents,i);
    276      (tokens,numBacktrack,startSt,currSt,pos,sPos,ePos,linenr,lineNrStart,buffer,states,numStates,errorTokens) := consume(cTok,tokens,contents,startSt,currSt,pos,sPos,ePos,linenr,lineNrStart,buffer,states,numStates,fileName,errorTokens);
     275     (tokens,numBacktrack,startSt,currSt,pos,sPos,ePos,linenr,lineNrStart,buffer,states,errorTokens) := consume(cTok,tokens,contents,startSt,currSt,pos,sPos,ePos,linenr,lineNrStart,buffer,states,fileName,errorTokens);
    277276     i := i - numBacktrack + 1;
    278277  end while;
     
    288287  input Integer currSt,pos,sPos,ePos,linenr,inLineNrStart;
    289288  input Integer inBuffer;
    290   input array<Integer> inStates;
    291   input Integer inNumStates;
     289  input list<Integer> inStates;
    292290  input String fileName;
    293291  input list<Token> inErrorTokens;
     
    297295  output Integer mm_currSt,mm_pos,mm_sPos,mm_ePos,mm_linenr,lineNrStart;
    298296  output Integer buffer;
    299   output array<Integer> states;
    300   output Integer numStates;
     297  output list<Integer> states;
    301298  output list<Token> errorTokens=inErrorTokens;
    302299protected
     
    314311  buffer := inBuffer;
    315312  states := inStates;
    316   numStates := inNumStates;
    317313
    318314  baseCond := LexTable.yy_base[mm_currSt];
     
    352348    mm_currSt := LexTable.yy_nxt[c];
    353349  end if;
    354   numStates := numStates+1; // TODO: BAD BAD BAD. At least arrayUpdate should be a safe operation... We need to grow the number of states on demand though.
    355   arrayUpdate(states,numStates,mm_currSt);
     350  states := mm_currSt::states;
    356351
    357352  baseCond := LexTable.yy_base[mm_currSt];
     
    361356    end if;
    362357
    363     (act, mm_currSt, mm_pos, mm_sPos, mm_linenr, buffer, bkBuffer, states, numStates) := findRule(fileContents, mm_currSt, mm_pos, mm_sPos, mm_ePos, mm_linenr, buffer, bkBuffer, states, numStates);
     358    (act, mm_currSt, mm_pos, mm_sPos, mm_linenr, buffer, bkBuffer, states) := findRule(fileContents, mm_currSt, mm_pos, mm_sPos, mm_ePos, mm_linenr, buffer, bkBuffer, states);
    364359
    365360    if (debug==true) then
     
    374369
    375370    mm_currSt := mm_startSt;
    376     arrayUpdate(states,1,mm_startSt);
    377     numStates := 1;
     371    states := {};
    378372
    379373    /* Either a token was output (get new positions for next token). Or a whitespace was emitted. */
     
    408402  input Integer inBuffer;
    409403  input Integer inBkBuffer;
    410   input array<Integer> inStates;
    411   input Integer inNumStates;
     404  input list<Integer> inStates;
    412405  output Integer action;
    413406  output Integer mm_currSt;
     
    417410  output Integer buffer;
    418411  output Integer bkBuffer;
    419   output array<Integer> states;
    420   output Integer numStates;
     412  output list<Integer> states;
    421413protected
    422414  array<Integer> mm_accept,mm_ec,mm_meta,mm_base,mm_def,mm_nxt,mm_chk,mm_acclist;
    423   Integer lp,lp1,stCmp;
     415  Integer lp,lp1,stCmp,cp;
    424416  Boolean st;
    425417  import arrayGet = MetaModelica.Dangerous.arrayGetNoBoundsChecking; // Bounds checked with debug=true
     
    433425  bkBuffer := inBkBuffer;
    434426  states := inStates;
    435   numStates := inNumStates;
    436 
    437   stCmp := arrayGet(states,numStates);
     427
     428  stCmp := listGet(states, 1);
    438429  lp := LexTable.yy_accept[stCmp];
    439430  lp1 := LexTable.yy_accept[stCmp+1];
    440431
    441432  st := intGt(lp,0) and intLt(lp,lp1);
    442   (action, mm_currSt, mm_pos, mm_sPos, mm_linenr, buffer, bkBuffer, states, numStates) := match(numStates,st)
    443     local
    444       Integer act,cp;
    445       list<Integer> restBuff;
    446     case (_,true)
    447       algorithm
    448         if debug then
    449           checkArrayModelica(LexTable.yy_accept,stCmp,sourceInfo());
    450           checkArrayModelica(LexTable.yy_acclist,lp,sourceInfo());
    451         end if;
    452         lp := LexTable.yy_accept[stCmp];
    453         act := LexTable.yy_acclist[lp];
    454       then (act, mm_currSt, mm_pos, mm_sPos, mm_linenr, buffer, bkBuffer, states, numStates);
    455     case (_,false)
    456       algorithm
    457         cp := stringGet(fileContents,mm_pos-1);
    458         buffer := buffer-1;
    459         bkBuffer := bkBuffer+1;
    460         mm_pos := mm_pos - 1;
    461         mm_sPos := mm_sPos -1;
    462         if (cp==10) then
    463           mm_sPos := mm_ePos;
    464           mm_linenr := mm_linenr-1;
    465         end if;
    466         if debug then
    467           checkArray(states,numStates,sourceInfo());
    468         end if;
    469         mm_currSt := arrayGet(states,numStates);
    470         numStates := numStates - 1;
    471         (act, mm_currSt, mm_pos, mm_sPos, mm_linenr, buffer, bkBuffer, states, numStates) := findRule(fileContents, mm_currSt, mm_pos, mm_sPos, mm_ePos, mm_linenr, buffer, bkBuffer, states, numStates);
    472       then (act, mm_currSt, mm_pos, mm_sPos, mm_linenr, buffer, bkBuffer, states, numStates);
    473 
    474   end match;
     433  if st then
     434    if debug then
     435      checkArrayModelica(LexTable.yy_accept,stCmp,sourceInfo());
     436      checkArrayModelica(LexTable.yy_acclist,lp,sourceInfo());
     437    end if;
     438    lp := LexTable.yy_accept[stCmp];
     439    action := LexTable.yy_acclist[lp];
     440  else
     441    cp := stringGet(fileContents,mm_pos-1);
     442    buffer := buffer-1;
     443    bkBuffer := bkBuffer+1;
     444    mm_pos := mm_pos - 1;
     445    mm_sPos := mm_sPos -1;
     446    if (cp==10) then
     447      mm_sPos := mm_ePos;
     448      mm_linenr := mm_linenr-1;
     449    end if;
     450    mm_currSt::states := states;
     451    (action, mm_currSt, mm_pos, mm_sPos, mm_linenr, buffer, bkBuffer, states) := findRule(fileContents, mm_currSt, mm_pos, mm_sPos, mm_ePos, mm_linenr, buffer, bkBuffer, states);
     452  end if;
    475453end findRule;
    476454
  • OMCompiler/Compiler/Lexers/lexerJSON.l

    r54f309f r6adae6a0  
    44protected
    55import Error;
    6 import StringUtil;
    76public
    87%}
Note: See TracChangeset for help on using the changeset viewer.