hschumann2/TempleOS-Source-Code
0838
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;