CoolFace
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes838downloads
PrsStmt.txt1224 linesDownload Raw Back to Compiler
1 2CHashClass *PrsClass(CCmpCtrl *cc,I64 keyword,I64 fsp_flags,Bool is_extern)3{4  CHashClass *tmpc,*base_class;5  if (cc->token!=TK_IDENT)6    LexExcept(cc,"Expecting identifier at ");7  if (is_extern) {8    tmpc=PrsClassNew;9    tmpc->str=cc->cur_str;10    cc->cur_str=NULL;11    HashAdd(tmpc,cc->htc.glbl_hash_table);12    LBts(&tmpc->flags,Cf_EXTERN);13    HashSrcFileSet(cc,tmpc);14    Lex(cc);15  } else {16    if (cc->flags&CCF_AOT_COMPILE)17      tmpc=HashFind(cc->cur_str,cc->htc.glbl_hash_table,HTT_CLASS);18    else19      tmpc=HashSingleTableFind(cc->cur_str,cc->htc.glbl_hash_table,HTT_CLASS);20    if (tmpc) {21      if (!Bt(&tmpc->flags,Cf_EXTERN))22        tmpc=NULL;23      else if (tmpc->use_cnt<3)24        UnusedExternWarning(cc,tmpc);25    }26    if (tmpc) {27      Free(tmpc->src_link);28      tmpc->src_link=NULL;29      Free(tmpc->idx);30      tmpc->idx=NULL;31    } else {32      tmpc=PrsClassNew;33      tmpc->str=cc->cur_str;34      cc->cur_str=NULL;35      HashAdd(tmpc,cc->htc.glbl_hash_table);36    }37    LBtr(&tmpc->flags,Cf_EXTERN);38    if (fsp_flags&FSF_PUBLIC)39      tmpc->type|=HTF_PUBLIC;40    tmpc->use_cnt=0;41    if (cc->last_U16=='\n')42      HashSrcFileSet(cc,tmpc,-1);43    else44      HashSrcFileSet(cc,tmpc,0);45    if (Lex(cc)==':') {46      if (Lex(cc)!=TK_IDENT || !(base_class=cc->hash_entry) ||47            !(base_class->type&HTT_CLASS))48        LexExcept(cc,"Invalid class at ");49      if (Lex(cc)==',')50        LexExcept(cc,"Only one base class allowed at this time at ");51      tmpc->base_class=base_class;52      tmpc->size+=base_class->size;53    }54    if (keyword==KW_UNION)55      PrsVarLst(cc,tmpc,PRS0_NULL|PRS1_CLASS|PRSF_UNION);56    else57      PrsVarLst(cc,tmpc,PRS0_NULL|PRS1_CLASS);58    tmpc->size+=tmpc->neg_offset;59  }60  return tmpc;61}62 63CHashFun *PrsFunJoin(CCmpCtrl *cc,CHashClass *tmp_return,64        U8 *name,I64 fsp_flags)65{66  CMemberLst *tmpm,*header_lst;67  CAOTCtrl *aotc=cc->aotc;68  CHashClass *header_return;69  CHashFun *tmpf;70  I64 header_arg_cnt;71  if (name) {//if not fun_ptr72    if (cc->flags&CCF_AOT_COMPILE) {73      if ((tmpf=HashFind(name,cc->htc.glbl_hash_table,HTT_FUN)) &&74            tmpf->type & HTF_IMPORT)75        tmpf=NULL;76    } else77      if ((tmpf=HashSingleTableFind(name,cc->htc.glbl_hash_table,HTT_FUN)) &&78            !Bt(&tmpf->flags,Cf_EXTERN))79        tmpf=NULL;80    if (tmpf && tmpf->use_cnt<3)81      UnusedExternWarning(cc,tmpf);82  } else83    tmpf=NULL;84  if (tmpf) {85    tmpf->used_reg_mask=REGG_CLOBBERED+REGG_SAVED+REGG_STK_TMP;86    Free(tmpf->src_link);87    tmpf->src_link=NULL;88    Free(tmpf->idx);89    tmpf->idx=NULL;90    Free(name);91    header_arg_cnt=tmpf->arg_cnt;92    header_lst=tmpf->member_lst_and_root;93    header_return=tmpf->return_class;94    tmpf->member_lst_and_root=NULL;95    ClassMemberLstDel(tmpf);96  } else {97    tmpf=PrsFunNew;98    header_return=NULL;99    tmpf->used_reg_mask=REGG_CLOBBERED+REGG_SAVED+REGG_STK_TMP;100    tmpf->clobbered_reg_mask=REGG_CLOBBERED+REGG_STK_TMP;101    tmpf->str=name;102    if (cc->flags&CCF_AOT_COMPILE)103      tmpf->exe_addr=aotc->rip;104    else105      tmpf->exe_addr=&UndefinedExtern;106    LBts(&tmpf->flags,Cf_EXTERN);107    tmpf->flags|=fsp_flags&FSG_FUN_FLAGS1;108    if (name) //if not fun_ptr109      HashAdd(tmpf,cc->htc.glbl_hash_table);110  }111  BEqu(&tmpf->type,HTf_PUBLIC,fsp_flags&FSF_PUBLIC);112  tmpf->return_class=tmp_return;113  tmpf->use_cnt=0;114  HashSrcFileSet(cc,tmpf);115  PrsVarLst(cc,tmpf,PRS0_NULL|PRS1_FUN_ARG);116  tmpf->arg_cnt=tmpf->member_cnt;117  if (0<tmpf->arg_cnt<<3<=I16_MAX && !Bt(&tmpf->flags,Ff_DOT_DOT_DOT))118    LBts(&tmpf->flags,Ff_RET1);119  tmpm=tmpf->member_lst_and_root;120  while (tmpm) {121    tmpm->offset+=16; //RBP+RETURN122    tmpm=tmpm->next;123  }124  tmpf->size=0;125  if (header_return) {126    if (GetOption(OPTf_WARN_HEADER_MISMATCH)) {127      if (tmpf->return_class!=header_return) {128        PrintWarn("Fun Header return mismatch '%s'\n",tmpf->str);129        cc->warning_cnt++;130      }131      if (!MemberLstCmp(tmpf->member_lst_and_root,header_lst,header_arg_cnt)) {132        PrintWarn("Fun header args mismatch '%s'\n",tmpf->str);133        cc->warning_cnt++;134      }135    }136    MemberLstDel(header_lst);137  }138  return tmpf;139}140 141U0 PrsFun(CCmpCtrl *cc,CHashClass *tmp_return,U8 *name,I64 fsp_flags)142{143  CMemberLst *tmpm;144  CCodeMisc *saved_leave_label;145  I64 i,j,size,*r;146  Bool old_trace;147 148  cc->fun_lex_file=cc->lex_include_stk;149  cc->min_line=cc->max_line=cc->lex_include_stk->line_num;150 151  cc->flags&=~CCF_NO_REG_OPT;152  cc->htc.local_var_lst=cc->htc.fun=PrsFunJoin(cc,tmp_return,name,fsp_flags);153 154  COCPush(cc);155  Btr(&cc->flags,CCf_PASS_TRACE_PRESENT);156  COCInit(cc);157  ICAdd(cc,IC_ENTER,0,0);158  saved_leave_label=cc->lb_leave;159  cc->lb_leave=COCMiscNew(cc,CMT_LABEL);160  cc->flags&=~CCF_HAS_RETURN;161  PrsStmt(cc,,,0);162 163  if (cc->max_line<cc->min_line)164    cc->max_line=cc->min_line;165 166  if (cc->htc.fun->return_class->size && !(cc->flags&CCF_HAS_RETURN))167    LexWarn(cc,"Function should return val ");168  ICAdd(cc,IC_LABEL,cc->lb_leave,0);169  cc->lb_leave=saved_leave_label;170  ICAdd(cc,IC_LEAVE,0,cc->htc.fun->return_class);171  cc->htc.fun->size&=~7;172  if (cc->flags&CCF_AOT_COMPILE) {173    cc->htc.fun->exe_addr=cc->aotc->rip;174    cc->htc.fun->type|=HTF_EXPORT|HTF_RESOLVE;175    r=COCCompile(cc,&size,&cc->htc.fun->dbg_info,NULL);176    if (r) {177      j=(size+7)>>3;178      for (i=0;i<j;i++)179        AOTStoreCodeU64(cc,r[i]);180      Free(r);181    }182  } else {183    old_trace=Btr(&cc->opts,OPTf_TRACE);184    cc->htc.fun->exe_addr=COCCompile(185          cc,&size,&cc->htc.fun->dbg_info,NULL);186    if (old_trace) {187      Bts(&cc->opts,OPTf_TRACE);188      Un(cc->htc.fun->exe_addr,size,64);189    }190    SysSymImportsResolve(cc->htc.fun->str);191  }192  LBtr(&cc->htc.fun->flags,Cf_EXTERN);193  COCPop(cc);194  tmpm=cc->htc.fun->member_lst_and_root;195  while (tmpm) {196    if (tmpm->flags & MLF_NO_UNUSED_WARN) {197      if (tmpm->use_cnt>1&&StrCmp(tmpm->str,"_anon_"))198        PrintWarn("Unneeded no_warn\n $LK,\"FL:%s,%d\"$ '%s' in '%s'\n",199              cc->lex_include_stk->full_name,cc->lex_include_stk->line_num,200              tmpm->str,cc->htc.fun->str);201    } else if (!tmpm->use_cnt && GetOption(OPTf_WARN_UNUSED_VAR))202      PrintWarn("Unused var\n $LK,\"FL:%s,%d\"$ '%s' in '%s'\n",203            cc->lex_include_stk->full_name,cc->lex_include_stk->line_num,204            tmpm->str,cc->htc.fun->str);205    tmpm=tmpm->next;206  }207  cc->htc.local_var_lst=cc->htc.fun=cc->fun_lex_file=NULL;208}209 210U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tmpc,211  I64 saved_val,I64 fsp_flags)212{213  I64 i,j,mode,k,val;214  U8 *st;215  CHashExport *tmpex;216  CHashGlblVar *tmpg;217  CAOTCtrl *aotc=cc->aotc;218  CAOTHeapGlbl *tmphg;219  CHashClass *tmpc;220  CHashFun *tmpf,*tmpf_fun_ptr;221  CArrayDim tmpad;222  Bool has_alias,undef_array_size,is_array;223  while (TRUE) {224    tmpc=PrsType(cc,&saved_tmpc,&saved_mode,NULL,&st,225          &tmpf_fun_ptr,&tmpex,&tmpad,fsp_flags);226 227    if (!st) return;228    if (tmpad.next)229      is_array=TRUE;230    else if (tmpad.total_cnt<0) {231      is_array=TRUE;232      tmpc--;233    } else234      is_array=FALSE;235 236    val=saved_val;237    mode=saved_mode;238    if (tmpex && mode&255==PRS0_EXTERN && !(cc->flags&CCF_AOT_COMPILE) &&239          tmpex->type&HTT_EXPORT_SYS_SYM) {240      val=tmpex->val;241      mode=PRS0__EXTERN|PRS1_NOT_REALLY__EXTERN;242    }243    if (cc->token=='(') {244      switch (mode&255) {245        case PRS0__INTERN:246          tmpf=PrsFunJoin(cc,tmpc,st,fsp_flags);247          tmpf->exe_addr=val;248          Bts(&tmpf->flags,Ff_INTERNAL);249          LBtr(&tmpf->flags,Cf_EXTERN);250          return;251        case PRS0__EXTERN:252          if (!(fsp_flags&FSF__) && !(mode&PRS1_NOT_REALLY__EXTERN))253            LexExcept(cc,"Expecting label with underscore at ");254          tmpf=PrsFunJoin(cc,tmpc,st,fsp_flags);255          tmpf->exe_addr=val;256          SysSymImportsResolve(tmpf->str);257          LBtr(&tmpf->flags,Cf_EXTERN);258          if (saved_mode&255==PRS0__EXTERN)259            LBts(&tmpf->flags,Ff__EXTERN);260          if (cc->flags&CCF_AOT_COMPILE)261            tmpf->type|=HTF_RESOLVE;262          return;263        case PRS0_EXTERN:264          PrsFunJoin(cc,tmpc,st,fsp_flags);265          return;266        case PRS0__IMPORT:267          if (!(fsp_flags&FSF__))268            LexExcept(cc,"Expecting label with underscore at ");269        case PRS0_IMPORT:270          if (!(cc->flags&CCF_AOT_COMPILE))271            LexExcept(cc,"import not needed at ");272          else {273            tmpf=PrsFunJoin(cc,tmpc,st,fsp_flags);274            tmpf->type|=HTF_IMPORT;275            if (mode&255==PRS0__IMPORT)276              tmpf->import_name=StrNew(val);277            else278              tmpf->import_name=StrNew(st);279          }280          return;281        default:282          PrsFun(cc,tmpc,st,fsp_flags);283          return;284      }285    } else {286      if (tmpad.total_cnt<0) {287        i=0;288        undef_array_size=TRUE;289      } else {290        i=tmpad.total_cnt;291        undef_array_size=FALSE;292      }293      if (tmpf_fun_ptr)294        j=sizeof(U8 *);295      else296        j=tmpc->size;297      j*=i;298      has_alias=FALSE;299      tmphg=NULL;300      switch (mode&255) {301        case PRS0__EXTERN:302          if (cc->flags&CCF_AOT_COMPILE) {303            tmpg=CAlloc(sizeof(CHashGlblVar));304            tmpg->data_addr_rip=val;305            tmpg->type=HTT_GLBL_VAR | HTF_EXPORT;306          } else {307            tmpg=CAlloc(sizeof(CHashGlblVar),Fs->code_heap);308            tmpg->data_addr=val;309            tmpg->type=HTT_GLBL_VAR;310          }311          tmpg->flags|=GVF_ALIAS;312          break;313        case PRS0__IMPORT:314        case PRS0_IMPORT:315          if (!(cc->flags&CCF_AOT_COMPILE))316            LexExcept(cc,"import not needed at ");317          else {318            tmpg=CAlloc(sizeof(CHashGlblVar));319            tmpg->type=HTT_GLBL_VAR | HTF_IMPORT;320            if (mode&255==PRS0__IMPORT)321              tmpg->import_name=StrNew(val);322            else323              tmpg->import_name=StrNew(st);324          }325          break;326        case PRS0_EXTERN:327          if (cc->flags&CCF_AOT_COMPILE) {328            tmpg=CAlloc(sizeof(CHashGlblVar));329            tmpg->type=HTT_GLBL_VAR;330          } else {331            tmpg=CAlloc(sizeof(CHashGlblVar),Fs->code_heap);332            tmpg->type=HTT_GLBL_VAR|HTF_UNRESOLVED;333          }334          break;335        default:336          if (cc->flags&CCF_AOT_COMPILE) {337            if (Bt(&cc->opts,OPTf_GLBLS_ON_DATA_HEAP)) {338              if (cc->token=='=')339                LexExcept(cc,"Can't init glbl var on data heap in AOT module ");340              tmpg=CAlloc(sizeof(CHashGlblVar));341              tmphg=tmpg->heap_glbl=CAlloc(sizeof(CAOTHeapGlbl));342              tmphg->size=j;343              tmphg->str=StrNew(st);344              tmphg->next=aotc->heap_glbls;345              aotc->heap_glbls=tmphg;346              tmpg->flags=GVF_DATA_HEAP;347              tmpg->type=HTT_GLBL_VAR; //TODO: HTF_EXPORT348              if (tmpex && tmpex->type & HTT_GLBL_VAR) //TODO!! extern349                LexExcept(cc,"Feature not implemented ");350            } else {351              tmpg=CAlloc(sizeof(CHashGlblVar));352              if (cc->token=='=')353                tmpg->data_addr=CAlloc(j);354              if (tmpc->size>=8) //align355                while (aotc->rip&7)356                  AOTStoreCodeU8(cc,0);357              else if (tmpc->size==4)358                while (aotc->rip&3)359                  AOTStoreCodeU8(cc,0);360              else if (tmpc->size==2)361                while (aotc->rip&1)362                  AOTStoreCodeU8(cc,0);363              tmpg->data_addr_rip=aotc->rip;364              tmpg->type=HTT_GLBL_VAR | HTF_EXPORT;365              if (tmpex && tmpex->type & HTT_GLBL_VAR)366                has_alias=TRUE;367              for (k=0;k<j;k++)368                AOTStoreCodeU8(cc,0); //Init AOT glbl to zero.369            }370          } else {371            if (Bt(&cc->opts,OPTf_GLBLS_ON_DATA_HEAP)) {372              tmpg=CAlloc(sizeof(CHashGlblVar),Fs->code_heap);373              tmpg->data_addr=MAlloc(j);374              tmpg->flags=GVF_DATA_HEAP;375            } else {376              tmpg=CAlloc(sizeof(CHashGlblVar),Fs->code_heap);377              tmpg->data_addr=MAlloc(j,Fs->code_heap);378            }379            tmpg->type=HTT_GLBL_VAR;380            if (tmpex && tmpex->type&HTT_GLBL_VAR &&381                  tmpex->type&HTF_UNRESOLVED &&382                  MHeapCtrl(tmpex)==MHeapCtrl(tmpg))383              has_alias=TRUE;384            if (sys_var_init_flag)385              MemSet(tmpg->data_addr,sys_var_init_val,j);386          }387      }388      tmpg->dim.next=tmpad.next;389      if (fsp_flags&FSF_PUBLIC)390        tmpg->type|=HTF_PUBLIC;391      tmpg->var_class=tmpc;392      tmpg->str=st;393      tmpg->size=j;394      tmpg->dim.total_cnt=i;395      tmpg->use_cnt=0;396      if (cc->last_U16=='\n')397        HashSrcFileSet(cc,tmpg,-1);398      else399        HashSrcFileSet(cc,tmpg,0);400      if (mode&255==PRS0_IMPORT || mode&255==PRS0__IMPORT)401        tmpg->flags|=GVF_IMPORT;402      if (mode&255==PRS0_EXTERN)403        tmpg->flags|=GVF_EXTERN;404      if (tmpf_fun_ptr) {405        tmpg->fun_ptr=tmpf_fun_ptr;406        tmpg->flags|=GVF_FUN;407      }408      if (is_array)409        tmpg->flags|=GVF_ARRAY;410      HashAdd(tmpg,cc->htc.glbl_hash_table);411      if (!(cc->flags&CCF_AOT_COMPILE) && !(tmpg->flags&GVF_EXTERN))412        SysSymImportsResolve(tmpg->str);413      if (cc->token=='=') {414        if (undef_array_size) {415          LexPush(cc);416          LexPush(cc);417          Lex(cc);418          PrsGlblInit(cc,tmpg,1);419          LexPopNoRestore(cc);420          tmpg->size=tmpg->dim.total_cnt*tmpc->size;421          if (tmphg)422            tmphg->size=tmpg->size;423          if (cc->flags&CCF_AOT_COMPILE)424            for (k=0;k<tmpg->size;k++)425              AOTStoreCodeU8(cc,0);426          else427            if (sys_var_init_flag)428              MemSet(tmpg->data_addr,sys_var_init_val,k);429          LexPopRestore(cc);430        }431        LexPush(cc);432        Lex(cc);433        PrsGlblInit(cc,tmpg,2);434        if (cc->flags&CCF_AOT_COMPILE)435          for (k=0;k<tmpg->size;k++)436            AOTStoreCodeU8At(cc,tmpg->data_addr_rip+k,tmpg->data_addr[k]);437        LexPopNoRestore(cc);438      }439      if (has_alias) {440        if (tmpex(CHashGlblVar *)->use_cnt<2) {441          PrintWarn("Unused extern '%s'\n",tmpex(CHashGlblVar *)->str);442          cc->warning_cnt++;443        }444        tmpex(CHashGlblVar *)->flags|=GVF_ALIAS;445        tmpex(CHashGlblVar *)->data_addr=tmpg->data_addr;446        tmpex(CHashGlblVar *)->data_addr_rip=tmpg->data_addr_rip;447      }448      if (cc->token==',')449        Lex(cc);450      else {451        if (cc->token!=';')452          LexExcept(cc,"Missing ';' at");453        Lex(cc);454        return;455      }456    }457  }458}459 460U0 PrsIf(CCmpCtrl *cc,I64 try_cnt,CCodeMisc *lb_break)461{462  CCodeMisc *lb,*lb1;463  I64 k;464  if (cc->token!='(')465    LexExcept(cc,"Expecting '(' at ");466  Lex(cc);467  if (!PrsExpression(cc,NULL,FALSE))468    throw('Compiler');469  if (cc->token!=')')470    LexExcept(cc,"Missing ')' at ");471  Lex(cc);472  lb=COCMiscNew(cc,CMT_LABEL);473  ICAdd(cc,IC_BR_ZERO,lb,0);474  PrsStmt(cc,try_cnt,lb_break);475  k=PrsKeyWord(cc);476  if (k==KW_ELSE) {477    Lex(cc);478    lb1=COCMiscNew(cc,CMT_LABEL);479    ICAdd(cc,IC_JMP,lb1,0);480    ICAdd(cc,IC_LABEL,lb,0);481    PrsStmt(cc,try_cnt,lb_break);482    ICAdd(cc,IC_LABEL,lb1,0);483  } else484    ICAdd(cc,IC_LABEL,lb,0);485}486 487U0 PrsWhile(CCmpCtrl *cc,I64 try_cnt)488{489  CCodeMisc *lb,*lb_done;490  if (cc->token!='(')491    LexExcept(cc,"Expecting '(' at ");492  Lex(cc);493  lb=COCMiscNew(cc,CMT_LABEL);494  ICAdd(cc,IC_LABEL,lb,0);495  if (!PrsExpression(cc,NULL,FALSE))496    throw('Compiler');497  if (cc->token!=')')498    LexExcept(cc,"Missing ')' at ");499  Lex(cc);500  lb_done=COCMiscNew(cc,CMT_LABEL);501  ICAdd(cc,IC_BR_ZERO,lb_done,0);502  PrsStmt(cc,try_cnt,lb_done);503  ICAdd(cc,IC_JMP,lb,0);504  ICAdd(cc,IC_LABEL,lb_done,0);505}506 507U0 PrsDoWhile(CCmpCtrl *cc,I64 try_cnt)508{509  CCodeMisc *lb,*lb_done;510  lb=COCMiscNew(cc,CMT_LABEL);511  lb_done=COCMiscNew(cc,CMT_LABEL);512  ICAdd(cc,IC_LABEL,lb,0);513  PrsStmt(cc,try_cnt,lb_done);514  if (PrsKeyWord(cc)!=KW_WHILE)515    LexExcept(cc,"Missing 'while' at");516  if (Lex(cc)!='(')517    LexExcept(cc,"Expecting '(' at ");518  Lex(cc);519  if (!PrsExpression(cc,NULL,FALSE))520    throw('Compiler');521  if (cc->token!=')')522    LexExcept(cc,"Missing ')' at ");523  ICAdd(cc,IC_BR_NOT_ZERO,lb,0);524  ICAdd(cc,IC_LABEL,lb_done,0);525  if (Lex(cc)!=';')526    LexExcept(cc,"Missing ';' at");527  Lex(cc);528}529 530U0 PrsFor(CCmpCtrl *cc,I64 try_cnt)531{532  CCodeCtrl *tmpcbh;533  CCodeMisc *lb,*lb_done;534 535  if (cc->token!='(')536    LexExcept(cc,"Expecting '(' at ");537  Lex(cc);538  PrsStmt(cc,try_cnt);539 540  lb=COCMiscNew(cc,CMT_LABEL);541  ICAdd(cc,IC_LABEL,lb,0);542  if (!PrsExpression(cc,NULL,FALSE))543    throw('Compiler');544  lb_done=COCMiscNew(cc,CMT_LABEL);545  ICAdd(cc,IC_BR_ZERO,lb_done,0);546  if (cc->token!=';')547    LexExcept(cc,"Missing ';' at");548  Lex(cc);549 550  COCPush(cc);551  COCInit(cc);552  if (cc->token!=')')553    PrsStmt(cc,try_cnt,NULL,0);554  COCPush(cc);555  tmpcbh=COCPopNoFree(cc);556  COCPop(cc);557  if (cc->token!=')')558    LexExcept(cc,"Missing ')' at ");559  Lex(cc);560 561  PrsStmt(cc,try_cnt,lb_done);562  COCAppend(cc,tmpcbh);563  ICAdd(cc,IC_JMP,lb,0);564  ICAdd(cc,IC_LABEL,lb_done,0);565}566 567class CSubSwitch {568  CSubSwitch *next,*last;569  CCodeMisc *lb_start,*lb_break;570};571 572class CSwitchCase {573  CSwitchCase *next;574  CCodeMisc *label;575  I64 val;576  CSubSwitch *ss;577};578 579U0 PrsSwitch(CCmpCtrl *cc,I64 try_cnt)580{581  CSwitchCase *header=NULL,*tmps,*tmps1;        //Leaks on except582  CSubSwitch head,*tmpss;                       //Leaks on except583  CCodeMisc *lb_dft,*lb_fwd_case,*mc_jt,*lb_entry,**jmp_table;584  CIntermediateCode *tmpi_sub,*tmpi_cmp,*tmpi_jmp,*tmpi_start;585  Bool dft_found=FALSE,nobound;586  I64 i,k_start=I64_MIN,k_end,lo=I64_MAX,hi=I64_MIN,range;587 588  if (cc->token=='(')589    nobound=FALSE;590  else if (cc->token=='[')591    nobound=TRUE;592  else593    LexExcept(cc,"Expecting '(' or '[' at ");594  Lex(cc);595  QueInit(&head);596 597  head.last->lb_break=COCMiscNew(cc,CMT_LABEL);598  head.last->lb_break->use_cnt++;599  lb_dft=COCMiscNew(cc,CMT_LABEL);600  lb_dft->use_cnt++;601  mc_jt=COCMiscNew(cc,CMT_JMP_TABLE);602  mc_jt->begin=COCMiscNew(cc,CMT_LABEL);603  mc_jt->begin->use_cnt++;604  if (!PrsExpression(cc,NULL,FALSE))605    throw('Compiler');606  tmpi_sub=ICAdd(cc,IC_IMM_I64,0,cmp.internal_types[RT_I64]);607  ICAdd(cc,IC_SUB,0,cmp.internal_types[RT_I64]);608  tmpi_cmp=ICAdd(cc,IC_IMM_I64,0,cmp.internal_types[RT_I64]);609  if (nobound) {610    ICAdd(cc,IC_NOBOUND_SWITCH,mc_jt,0);611    if (cc->token!=']')612      LexExcept(cc,"Missing ']' at ");613  } else {614    ICAdd(cc,IC_SWITCH,mc_jt,0);615    if (cc->token!=')')616      LexExcept(cc,"Missing ')' at ");617  }618  if (Lex(cc)!='{')619    LexExcept(cc,"Expecting '{' at ");620  Lex(cc);621  ICAdd(cc,IC_LABEL,mc_jt->begin,0);622  while (TRUE) {623    while (cc->token && cc->token!='}') {624sw_cont:625      switch (PrsKeyWord(cc)) {626        case KW_END:627          goto sw_sub_end;628        case KW_START:629          if (Lex(cc)==':')630            Lex(cc);631          else632            LexExcept(cc,"Expecting ':' at ");633          tmpss=MAlloc(sizeof(CSubSwitch));634          QueIns(tmpss,head.last);635          head.last->lb_break=COCMiscNew(cc,CMT_LABEL);636          head.last->lb_break->use_cnt++;637          lb_fwd_case=COCMiscNew(cc,CMT_LABEL);638          tmpi_jmp=ICAdd(cc,IC_JMP,lb_fwd_case,0);639 640          tmpss->lb_start=COCMiscNew(cc,CMT_LABEL);641          tmpi_start=ICAdd(cc,IC_LABEL,tmpss->lb_start,0);642          while (cc->token && cc->token!='}') {643            switch (PrsKeyWord(cc)) {644              case KW_END:645                OptFree(tmpi_jmp);646                goto sw_sub_end;647              case KW_START:648              case KW_CASE:649              case KW_DFT:650                if (cc->coc.coc_head.last==tmpi_start) {651                  OptFree(tmpi_jmp);652                  tmpss->lb_start=NULL;653                } else {654                  ICAdd(cc,IC_RET,0,0);655                  ICAdd(cc,IC_LABEL,lb_fwd_case,0);656                  ICAdd(cc,IC_SUB_CALL,tmpss->lb_start,0);//In case fall-thru657                }658                goto sw_cont;659              default:660                PrsStmt(cc,try_cnt);661            }662          }663          break;664        case KW_CASE:665          if (head.next!=&head) {666            lb_fwd_case=COCMiscNew(cc,CMT_LABEL);667            tmpi_jmp=ICAdd(cc,IC_JMP,lb_fwd_case,0);//In case fall-thru668          }669          Lex(cc);670          lb_entry=COCMiscNew(cc,CMT_LABEL);671          ICAdd(cc,IC_LABEL,lb_entry,0);672          lb_entry->use_cnt++;673          if (head.next!=&head) {674            tmpss=head.next;675            while (tmpss!=&head) {676              if (tmpss->lb_start)677                ICAdd(cc,IC_SUB_CALL,tmpss->lb_start,0);678              tmpss=tmpss->next;679            }680            ICAdd(cc,IC_LABEL,lb_fwd_case,0);681          }682          if (cc->token==':') {683            if (k_start==I64_MIN)684              k_start=0;685            else686              k_start++;687          } else688            k_start=LexExpressionI64(cc);689          if (k_start<lo) lo=k_start;690          if (k_start>hi) hi=k_start;691          if (cc->token==':') {692            Lex(cc);693            tmps=MAlloc(sizeof(CSwitchCase));694            tmps->label=lb_entry;695            tmps->val=k_start;696            tmps->next=header;697            header=tmps;698          } else if (cc->token==TK_ELLIPSIS) {699            Lex(cc);700            k_end=LexExpressionI64(cc);701            if (cc->token==':') {702              Lex(cc);703              if (k_end<lo) lo=k_end;704              if (k_end>hi) hi=k_end;705              if (k_start>k_end)706                SwapI64(&k_start,&k_end);707              for (i=k_start;i<=k_end;i++) {708                tmps=MAlloc(sizeof(CSwitchCase));709                tmps->label=lb_entry;710                tmps->val=i;711                tmps->next=header;712                header=tmps;713              }714              k_start=k_end;715            } else716              LexExcept(cc,"Expecting ':' at ");717          } else718            LexExcept(cc,"Expecting ':' at ");719          break;720        case KW_DFT:721          if (head.next!=&head) {722            lb_fwd_case=COCMiscNew(cc,CMT_LABEL);723            tmpi_jmp=ICAdd(cc,IC_JMP,lb_fwd_case,0);//In case fall-thru724          }725          Lex(cc);726          ICAdd(cc,IC_LABEL,lb_dft,0);727          if (cc->token==':')728            Lex(cc);729          else730            LexExcept(cc,"Expecting ':' at ");731          if (head.next!=&head) {732            tmpss=head.next;733            while (tmpss!=&head) {734              if (tmpss->lb_start)735                ICAdd(cc,IC_SUB_CALL,tmpss->lb_start,0);736              tmpss=tmpss->next;737            }738            ICAdd(cc,IC_LABEL,lb_fwd_case,0);739          }740          dft_found=TRUE;741          break;742        default:743          PrsStmt(cc,try_cnt,head.last->lb_break);744      }745    }746sw_sub_end:747    tmpss=head.last;748    ICAdd(cc,IC_LABEL,tmpss->lb_break,0);749    if (tmpss==&head) {750      if (cc->token!='}')751        LexExcept(cc,"Missing '}' at ");752      Lex(cc);753      break;754    } else {755      QueRem(tmpss);756      Free(tmpss);757      if (PrsKeyWord(cc)!=KW_END)758        LexExcept(cc,"Missing 'end' at ");759      if (Lex(cc)==':')760        Lex(cc);761      else762        LexExcept(cc,"Expecting ':' at ");763    }764  }765  if (!dft_found)766    ICAdd(cc,IC_LABEL,lb_dft,0);767 768  if (0<lo<=16)769    lo=0;770  range=hi-lo+1;771  if (lo>hi || !(0<range<=0xFFFF))772    LexExcept(cc,"switch range error at ");773  jmp_table=MAlloc((sizeof(CCodeMisc *)*range+0x1FF)&~0x1FF);774  MemSetI64(jmp_table,lb_dft,range);775  tmpi_sub->ic_data=lo;776  tmpi_cmp->ic_data=range;777  tmps=header;778  while (tmps) {779    tmps1=tmps->next;780    if (jmp_table[tmps->val-lo]!=lb_dft)781      LexExcept(cc,"Duplicate case at ");782    else783      jmp_table[tmps->val-lo]=tmps->label;784    Free(tmps);785    tmps=tmps1;786  }787  mc_jt->dft=lb_dft;788  mc_jt->jmp_table=jmp_table;789  mc_jt->range=range;790}791 792U0 PrsNoWarn(CCmpCtrl *cc)793{794  CMemberLst *tmpm;795  while (cc->token==TK_IDENT) {796    if (!(tmpm=cc->local_var_entry))797      LexExcept(cc,"Expecting local var at ");798    tmpm->flags|=MLF_NO_UNUSED_WARN;799    if (Lex(cc)==',')800      Lex(cc);801    else if (cc->token!=';')802      LexExcept(cc,"Expecting ',' at ");803  }804}805 806U0 PrsStreamBlk(CCmpCtrl *cc)807{808  CLexHashTableContext *htc=MAlloc(sizeof(CLexHashTableContext));809  CStreamBlk *tmpe=MAlloc(sizeof(CStreamBlk));810  tmpe->body=StrNew("");811  QueIns(tmpe,cc->last_stream_blk);812  COCPush(cc);813  QueInit(&cc->coc.coc_next_misc);814 815  MemCpy(htc,&cc->htc,sizeof(CLexHashTableContext));816  htc->old_flags=cc->flags;817  cc->htc.next=htc;818  cc->htc.fun=cc->htc.local_var_lst=NULL;819  cc->htc.define_hash_table=cc->htc.hash_table_lst=820        cc->htc.glbl_hash_table=cc->htc.local_hash_table=Fs->hash_table;821  cc->flags=cc->flags & ~(CCF_ASM_EXPRESSIONS|CCF_AOT_COMPILE) | CCF_EXE_BLK;822  if (cc->token=='{')823    Lex(cc);824  else825    LexExcept(cc,"Missing '}' at ");826  while (cc->token && cc->token!='}')827    ExeCmdLine(cc);828 829  MemCpy(&cc->htc,htc,sizeof(CLexHashTableContext));830  cc->flags=cc->flags&~CCF_EXE_BLK |831        htc->old_flags & (CCF_ASM_EXPRESSIONS|CCF_EXE_BLK|CCF_AOT_COMPILE);832  Free(htc);833  COCPop(cc);834  QueRem(tmpe);835  if (*tmpe->body)836    LexIncludeStr(cc,"StreamBlk",tmpe->body,FALSE);837  else838    Free(tmpe->body);839  Free(tmpe);840  Lex(cc); //Skip '}'841}842 843U0 PrsTryBlk(CCmpCtrl *cc,I64 try_cnt)844{845  CCodeMisc     *lb_catch,*lb_done,*lb_untry;846  CHashClass    *tmpc=cmp.internal_types[RT_PTR];847  CHashFun      *tmp_try=HashFind("SysTry",cc->htc.hash_table_lst,HTT_FUN),848        *tmp_untry=HashFind("SysUntry",cc->htc.hash_table_lst,HTT_FUN);849 850  if (!tmp_try || !tmp_untry)851    LexExcept(cc,"Missing header for SysTry() and SysUntry() at ");852 853  cc->flags|=CCF_NO_REG_OPT; //TODO:Currently no reg vars in funs with try/catch854 855  lb_catch=COCMiscNew(cc,CMT_LABEL);856  lb_done =COCMiscNew(cc,CMT_LABEL);857  lb_untry=COCMiscNew(cc,CMT_LABEL);858 859  ICAdd(cc,IC_CALL_START,0,0);860  ICAdd(cc,IC_GET_LABEL,lb_untry,tmpc,ICF_PUSH_RES);861  ICAdd(cc,IC_GET_LABEL,lb_catch,tmpc,ICF_PUSH_RES);862  if (Bt(&tmp_try->flags,Cf_EXTERN)) {863    cc->abs_cnts.externs++;864    if (cc->flags&CCF_AOT_COMPILE)865      ICAdd(cc,IC_CALL_IMPORT,tmp_try,tmpc);866    else867      ICAdd(cc,IC_CALL_INDIRECT2,&tmp_try->exe_addr,tmpc);868  } else869    ICAdd(cc,IC_CALL,tmp_try->exe_addr,tmpc);870  if ((Bt(&tmp_try->flags,Ff_RET1) ||871        Bt(&tmp_try->flags,Ff_ARGPOP)) && !Bt(&tmp_try->flags,Ff_NOARGPOP))872    ICAdd(cc,IC_ADD_RSP1,16,tmpc);873  else874    ICAdd(cc,IC_ADD_RSP,16,tmpc);875  ICAdd(cc,IC_CALL_END,0,tmpc);876  ICAdd(cc,IC_END_EXP,0,0,ICF_RES_NOT_USED);877 878  PrsStmt(cc,try_cnt+1);879 880  ICAdd(cc,IC_LABEL,lb_untry,0);881  ICAdd(cc,IC_CALL_START,0,0);882  if (Bt(&tmp_untry->flags,Cf_EXTERN)) {883    cc->abs_cnts.externs++;884    if (cc->flags&CCF_AOT_COMPILE)885      ICAdd(cc,IC_CALL_IMPORT,tmp_untry,tmpc);886    else887      ICAdd(cc,IC_CALL_INDIRECT2,&tmp_untry->exe_addr,tmpc);888  } else889    ICAdd(cc,IC_CALL,tmp_untry->exe_addr,tmpc);890  ICAdd(cc,IC_CALL_END,0,tmpc);891  ICAdd(cc,IC_END_EXP,0,0,ICF_RES_NOT_USED);892 893  ICAdd(cc,IC_JMP,lb_done,0);894 895  if (PrsKeyWord(cc)!=KW_CATCH)896    LexExcept(cc,"Missing 'catch' at");897 898  Lex(cc);899  ICAdd(cc,IC_LABEL,lb_catch,0);900  PrsStmt(cc,try_cnt+1);901  ICAdd(cc,IC_RET,0,tmpc);902  ICAdd(cc,IC_LABEL,lb_done,0);903}904 905Bool PrsStmt(CCmpCtrl *cc,I64 try_cnt=0,906  CCodeMisc *lb_break=NULL,I64 cmp_flags=CMPF_PRS_SEMICOLON)907{908  I64 i,fsp_flags=0;909  CHashExport *tmpex;910  CCodeMisc *g_lb;911  U8 *import_name;912  CHashFun *tmp_untry;913  CAOT *tmpaot;914  if (cmp_flags&CMPF_ONE_ASM_INS) {915    if (cc->flags&CCF_AOT_COMPILE || cc->aot_depth)916      PrsAsmBlk(cc,CMPF_ONE_ASM_INS);917    else if (tmpaot=CmpJoin(cc,CMPF_ASM_BLK|CMPF_ONE_ASM_INS))918      CmpFixUpJITAsm(cc,tmpaot);919    fsp_flags=FSF_ASM;920  } else921    while (TRUE) {922      while (cc->token==',')923        Lex(cc);924      if (cc->token=='{') {925        Lex(cc);926        while (cc->token!='}' && cc->token!=TK_EOF)927          PrsStmt(cc,try_cnt,lb_break);928        if (cc->lex_include_stk==cc->fun_lex_file)929          cc->max_line=cc->lex_include_stk->line_num;930        if (Lex(cc)!=',') goto sm_done;931      } else if (cc->token==';') {932        if (cmp_flags&CMPF_PRS_SEMICOLON)933          Lex(cc);934        if (cc->token!=',') goto sm_done;935      } else {936        if (cc->token==TK_IDENT) {937          if (tmpex=cc->hash_entry) {938            if (tmpex->type & HTT_KEYWORD) {939              i=tmpex(CHashGeneric *)->user_data0;940              switch [i] {941                case KW_KWS_NUM-1: //nobound switch942                default: //A keyword that is not valid here is just a symbol.943                  goto sm_not_keyword_afterall;944                start:945                  case KW_ASM:946                    if (cc->htc.fun) {947                      if (tmpaot=CmpJoin(cc,CMPF_ASM_BLK))948                        ICAdd(cc,IC_ASM,tmpaot,0);949                      Lex(cc); //Skip '}' of asm{}950                    } else {951                      if (cc->flags&CCF_AOT_COMPILE || cc->aot_depth) {952                        Lex(cc);953                        PrsAsmBlk(cc,0);954                        if (cc->flags&CCF_AOT_COMPILE && cc->aot_depth==1)955                          Lex(cc); //Skip '}' of asm{}956                      } else {957                        if (tmpaot=CmpJoin(cc,CMPF_ASM_BLK))958                          CmpFixUpJITAsm(cc,tmpaot);959                        Lex(cc); //Skip '}' of asm{}960                      }961                      fsp_flags=FSF_ASM;962                    }963                    break;964                  start:965                    Lex(cc);966                    case KW_LOCK:967                      cc->lock_cnt++;968                      PrsStmt(cc,try_cnt);969                      cc->lock_cnt--;970                      break;971                    case KW_TRY:972                      PrsTryBlk(cc,try_cnt);973                      break;974                    case KW_IF:975                      PrsIf(cc,try_cnt,lb_break);976                      break;977                    case KW_FOR:978                      PrsFor(cc,try_cnt);979                      break;980                    case KW_WHILE:981                      PrsWhile(cc,try_cnt);982                      break;983                    case KW_DO:984                      PrsDoWhile(cc,try_cnt);985                      break;986                    case KW_SWITCH:987                      PrsSwitch(cc,try_cnt);988                      break;989                  end:990                end:991                  if (cc->token!=',') goto sm_done;992                  break;993                start:994                  if (cc->htc.fun)995                    LexExcept(cc,"Not allowed in fun");996                  Lex(cc);997                  case KW__EXTERN:998                    if (Bt(&cc->opts,OPTf_EXTERNS_TO_IMPORTS))999                      goto sm_underscore_import;1000                    if (cc->token!=TK_IDENT || !(tmpex=cc->hash_entry) ||1001                          !(tmpex->type & HTT_EXPORT_SYS_SYM))1002                      LexExcept(cc,"Expecting system sym at ");1003                    if (*cc->cur_str=='_')1004                      fsp_flags|=FSF__;1005                    i=tmpex->val;1006                    Lex(cc);1007                    if (cc->token!=TK_IDENT || !(tmpex=cc->hash_entry) ||1008                          !(tmpex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))1009                      LexExcept(cc,"Expecting type at ");1010                    Lex(cc);1011                    PrsGlblVarLst(cc,PRS0__EXTERN|PRS1_NULL,tmpex,i,fsp_flags);1012                    break;1013                  case KW__IMPORT:1014sm_underscore_import:1015                    if (cc->token!=TK_IDENT)1016                      LexExcept(cc,"Expecting system sym at ");1017                    if (*cc->cur_str=='_')1018                      fsp_flags|=FSF__;1019                    import_name=cc->cur_str;1020                    cc->cur_str=0;1021                    if (Lex(cc)!=TK_IDENT || !(tmpex=cc->hash_entry) ||1022                          !(tmpex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))1023                      LexExcept(cc,"Expecting type at ");1024                    Lex(cc);1025                    PrsGlblVarLst(cc,PRS0__IMPORT|PRS1_NULL,tmpex,1026                          import_name,fsp_flags);1027                    Free(import_name);1028                    break;1029                  case KW_EXTERN:1030                    if (cc->token!=TK_IDENT)1031                      LexExcept(cc,"Expecting type at ");1032                    tmpex=cc->hash_entry;1033                    i=PrsKeyWord(cc);1034                    if (i==KW_CLASS||i==KW_UNION) {1035                      Lex(cc);1036                      PrsClass(cc,i,fsp_flags,TRUE);1037                      fsp_flags&=FSF_ASM;1038                      goto sm_semicolon;1039                    }1040                    if (!tmpex ||1041                          !(tmpex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))1042                      LexExcept(cc,"Expecting type at ");1043                    if (Bt(&cc->opts,OPTf_EXTERNS_TO_IMPORTS))1044                      goto sm_import;1045                    Lex(cc);1046                    PrsGlblVarLst(cc,PRS0_EXTERN|PRS1_NULL,tmpex,0,fsp_flags);1047                    break;1048                  case KW_IMPORT:1049                    if (cc->token!=TK_IDENT || !(tmpex=cc->hash_entry) ||1050                          !(tmpex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))1051                      LexExcept(cc,"Expecting type at ");1052sm_import:1053                    Lex(cc);1054                    PrsGlblVarLst(cc,PRS0_IMPORT|PRS1_NULL,tmpex,0,fsp_flags);1055                    break;1056                  case KW__INTERN:1057                    i=LexExpressionI64(cc);1058                    if (cc->token!=TK_IDENT || !(tmpex=cc->hash_entry) ||1059                          !(tmpex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))1060                      LexExcept(cc,"Expecting type at ");1061                    Lex(cc);1062                    PrsGlblVarLst(cc,PRS0__INTERN|PRS1_NULL,tmpex,i,fsp_flags);1063                    break;1064                end:1065                  fsp_flags&=FSF_ASM;1066                  break;1067                start:1068                  case KW_STATIC:1069                    fsp_flags=FSF_STATIC|fsp_flags&FSF_ASM;1070                    break;1071                  case KW_INTERRUPT:1072                    fsp_flags=FSF_INTERRUPT|FSF_NOARGPOP|1073                          fsp_flags&(FSG_FUN_FLAGS2|FSF_ASM);1074                    break;1075                  case KW_HASERRCODE:1076                    fsp_flags=FSF_HASERRCODE|fsp_flags&(FSG_FUN_FLAGS2|FSF_ASM);1077                    break;1078                  case KW_ARGPOP:1079                    fsp_flags=FSF_ARGPOP|fsp_flags&(FSG_FUN_FLAGS2|FSF_ASM);1080                    break;1081                  case KW_NOARGPOP:1082                    fsp_flags=FSF_NOARGPOP|fsp_flags&(FSG_FUN_FLAGS2|FSF_ASM);1083                    break;1084                  case KW_PUBLIC:1085                    fsp_flags=FSF_PUBLIC|fsp_flags&(FSG_FUN_FLAGS2|FSF_ASM);1086                    break;1087                end:1088                  Lex(cc);1089                  break;1090                case KW_RETURN:1091                  if (!cc->htc.fun)1092                    LexExcept(cc,"Not in fun.  Can't return a val ");1093                  if (try_cnt) {1094                    tmp_untry=HashFind("SysUntry",1095                          cc->htc.hash_table_lst,HTT_FUN);1096                    for (i=0;i<try_cnt;i++) {1097                      if (Bt(&tmp_untry->flags,Cf_EXTERN)) {1098                        cc->abs_cnts.externs++;1099                        if (cc->flags&CCF_AOT_COMPILE)1100                          ICAdd(cc,IC_CALL_IMPORT,1101                                tmp_untry,cmp.internal_types[RT_PTR]);1102                        else1103                          ICAdd(cc,IC_CALL_INDIRECT2,1104                                &tmp_untry->exe_addr,1105                                cmp.internal_types[RT_PTR]);1106                      } else1107                        ICAdd(cc,IC_CALL,tmp_untry->exe_addr,1108                              cmp.internal_types[RT_PTR]);1109                    }1110                  }1111                  if (Lex(cc)!=';') {1112                    if (!cc->htc.fun->return_class->size)1113                      LexWarn(cc,"Function should NOT return val ");1114                    if (!PrsExpression(cc,NULL,FALSE))1115                      throw('Compiler');1116                    ICAdd(cc,IC_RETURN_VAL,0,cc->htc.fun->return_class);1117                    cc->flags|=CCF_HAS_RETURN;1118                  } else if (cc->htc.fun->return_class->size)1119                    LexWarn(cc,"Function should return val ");1120                  ICAdd(cc,IC_JMP,cc->lb_leave,0);1121                  goto sm_semicolon;1122                case KW_GOTO:1123                  if (Lex(cc)!=TK_IDENT)1124                    LexExcept(cc,"Expecting identifier at ");1125                  if (!(g_lb=COCGoToLabelFind(cc,cc->cur_str))) {1126                    g_lb=COCMiscNew(cc,CMT_GOTO_LABEL);1127                    g_lb->str=cc->cur_str;1128                    cc->cur_str=NULL;1129                  }1130                  g_lb->use_cnt++;1131                  ICAdd(cc,IC_JMP,g_lb,0);1132                  Lex(cc);1133                  goto sm_semicolon;1134                case KW_BREAK:1135                  Lex(cc);1136                  if (!lb_break)1137                    LexExcept(cc,"'break' not allowed\n");1138                  ICAdd(cc,IC_JMP,lb_break,0);1139                  goto sm_semicolon;1140                case KW_NO_WARN:1141                  Lex(cc);1142                  PrsNoWarn(cc);1143                  goto sm_semicolon;1144                case KW_UNION:1145                case KW_CLASS:1146                  Lex(cc);1147                  tmpex=PrsClass(cc,i,fsp_flags,FALSE);1148                  if (!cc->htc.fun && cc->token!=';') {1149                    PrsGlblVarLst(cc,PRS0_NULL|PRS1_NULL,tmpex,0,fsp_flags);1150                    fsp_flags&=FSF_ASM;1151                    break;1152                  } else {1153                    fsp_flags&=FSF_ASM;1154                    goto sm_semicolon;1155                  }1156              }1157            } else {//Ident, found in hash table, not keyword1158sm_not_keyword_afterall:1159              if (tmpex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)) {1160                if (cc->htc.fun) {1161                  if (fsp_flags&FSF_STATIC)1162                    PrsVarLst(cc,cc->htc.fun,PRS0_NULL|PRS1_STATIC_LOCAL_VAR);1163                  else1164                    PrsVarLst(cc,cc->htc.fun,PRS0_NULL|PRS1_LOCAL_VAR);1165                  if (cc->token=='}') goto sm_done;1166                } else {1167                  Lex(cc);1168                  PrsGlblVarLst(cc,PRS0_NULL|PRS1_NULL,tmpex,0,fsp_flags);1169                }1170              } else {1171                if (tmpex->type & (HTT_OPCODE|HTT_ASM_KEYWORD)) {1172                  if (cc->htc.fun) {1173                    if (tmpaot=CmpJoin(cc,CMPF_ASM_BLK|CMPF_ONE_ASM_INS))1174                      ICAdd(cc,IC_ASM,tmpaot,0);1175                  } else1176                    LexExcept(cc,"Use Asm Blk at ");1177                  if (cc->token!=',') goto sm_done;1178                } else1179                  goto sm_prs_exp;1180              }1181              fsp_flags&=FSF_ASM;1182            }1183          } else {//Ident, not in hash table1184            if (cc->local_var_entry)1185              goto sm_prs_exp;1186            if (!(g_lb=COCGoToLabelFind(cc,cc->cur_str))) {1187              g_lb=COCMiscNew(cc,CMT_GOTO_LABEL);1188              g_lb->str=cc->cur_str;1189              cc->cur_str=NULL;1190            } else if (g_lb->flags&CMF_DEFINED)1191              LexExcept(cc,"Duplicate goto label at ");1192            g_lb->flags|=CMF_DEFINED;1193            ICAdd(cc,IC_LABEL,g_lb,0);1194            if (Lex(cc)==':') //skip cur_str1195              Lex(cc); //skip colon1196            else1197              LexExcept(cc,"Undefined identifier at ");1198            if (!cc->htc.fun)1199              LexExcept(cc,"No global labels at ");1200            if (cc->token!=',') goto sm_done;

Showing the first 1,200 of 1224 lines. Download the file for the rest.