hschumann2/TempleOS-Source-Code
0838
1 2#define PE_UNARY_TERM1 03#define PE_UNARY_TERM2 14#define PE_MAYBE_MODIFIERS 25#define PE_UNARY_MODIFIERS 36#define PE_DEREFERENCE 47#define PE_CHECK_BINARY_OPS1 58#define PE_CHECK_BINARY_OPS2 69#define PE_DO_UNARY_OP 710#define PE_DO_BINARY_OP 811#define PE_POP_HIGHER 912#define PE_PUSH_LOWER 1013#define PE_POP_ALL1 1114#define PE_POP_ALL2 1215 16CIntermediateCode *PrsAddOp(CCmpCtrl *cc,I64 stk_op,CHashClass *tmpc)17{18 CIntermediateCode *tmpi=cc->coc.coc_head.last;19 Bool div_sizeof=FALSE;20 switch (stk_op.u16[0]) {21 case IC_ADD:22 if (tmpc->ptr_stars_cnt && !tmpi->ic_class->ptr_stars_cnt &&23 tmpi->ic_class->raw_type!=RT_F64) {24 ICAdd(cc,IC_SIZEOF,1,cmp.internal_types[RT_I64]);25 ICAdd(cc,IC_MUL,0,cmp.internal_types[RT_I64]);26 }27 break;28 case IC_SUB:29 if (tmpc->ptr_stars_cnt && tmpi->ic_class->raw_type!=RT_F64) {30 if (!tmpi->ic_class->ptr_stars_cnt) {31 ICAdd(cc,IC_SIZEOF,1,cmp.internal_types[RT_I64]);32 ICAdd(cc,IC_MUL,0,cmp.internal_types[RT_I64]);33 } else34 div_sizeof=TRUE;35 }36 break;37 case IC_AND_AND:38 case IC_OR_OR:39 ICAdd(cc,IC_NOP1,0,cmp.internal_types[RT_I64]);40 break;41 case IC_ADD_EQU:42 case IC_SUB_EQU:43 if (tmpc->ptr_stars_cnt) {44 ICAdd(cc,IC_SIZEOF,1,cmp.internal_types[RT_I64]);45 ICAdd(cc,IC_MUL,0,cmp.internal_types[RT_I64]);46 }47 break;48 }49 tmpi=ICAdd(cc,stk_op,0,tmpc);50 if (stk_op.u8[3]&ECF_HAS_PUSH_CMP) {51 tmpi->ic_flags|=ICF_POP_CMP;52 ICAdd(cc,IC_NOP1,0,cmp.internal_types[RT_I64]);53 ICAdd(cc,IC_AND_AND,0,cmp.internal_types[RT_I64],ICF_POP_CMP);54 }55 if (div_sizeof) {56 tmpc--;57 if (tmpc->size!=1) {58 ICAdd(cc,IC_IMM_I64,tmpc->size,cmp.internal_types[RT_I64]);59 ICAdd(cc,IC_DIV,0,cmp.internal_types[RT_I64]);60 tmpc=cmp.internal_types[RT_I64];61 }62 }63 return tmpi;64}65 66U0 PrsExpression2(CCmpCtrl *cc,I64 *_max_prec,CPrsStk *ps)67{68 I64 i,cur_op,stk_op,state,max_prec=PREC_NULL,unary_pre_prec,paren_prec,69 unary_post_prec,left_prec=PREC_MAX;70 CIntermediateCode *tmpi;71 CHashClass *tmpc;72 CMemberLst *local_var;73 CArrayDim *tmpad=NULL;74 75 goto pe_unary_term1;76 while (TRUE) {77 switch [state] {78 case PE_UNARY_TERM1:79pe_unary_term1:80 unary_pre_prec=PREC_NULL;81 unary_post_prec=PREC_NULL;82 cc->flags&=~(CCF_PAREN+CCF_PREINC+CCF_PREDEC+CCF_POSTINC+83 CCF_POSTDEC+CCF_FUN_EXP);84 case PE_UNARY_TERM2:85 state=PrsUnaryTerm(cc,ps,&local_var,&tmpad,86 &max_prec,&unary_pre_prec,&paren_prec);87 break;88 case PE_UNARY_MODIFIERS:89 state=PrsUnaryModifier(cc,ps,&local_var,&tmpad,&unary_post_prec);90 break;91 case PE_MAYBE_MODIFIERS:92 if (cc->token=='(') { //Typecast or fun_ptr93 cc->flags|=CCF_RAX;94 state=PrsUnaryModifier(cc,ps,&local_var,&tmpad,&unary_post_prec);95 } else96 goto pe_check_binary_ops1;97 break;98 case PE_DEREFERENCE:99 if (!(cc->flags&(CCF_PREINC|CCF_PREDEC|CCF_POSTINC|CCF_POSTDEC)))100 i=IC_DEREF+PREC_UNARY_PRE<<16;101 else {102 if (cc->flags & CCF_POSTINC)103 i=IC__PP+PREC_UNARY_POST<<16;104 else if (cc->flags & CCF_POSTDEC)105 i=IC__MM+PREC_UNARY_POST<<16;106 else if (cc->flags & CCF_PREDEC)107 i=IC_MM_+PREC_UNARY_PRE<<16;108 else109 i=IC_PP_+PREC_UNARY_PRE<<16;110 cc->flags&=~(CCF_PREINC|CCF_PREDEC|CCF_POSTINC|CCF_POSTDEC);111 }112 tmpi=cc->coc.coc_head.last;113 if (cc->flags & (CCF_RAX|CCF_ARRAY)) {114 if (tmpi->ic_code==IC_DEREF)115 tmpi->ic_code=i;116 } else {117 tmpc=OptClassFwd(tmpi->ic_class-1);118 ICAdd(cc,i,0,tmpc);119 }120 case PE_CHECK_BINARY_OPS1:121pe_check_binary_ops1:122 if (paren_prec) {123 if (unary_pre_prec || unary_post_prec) {124 if (paren_prec<=unary_pre_prec && !unary_post_prec)125 ParenWarning(cc);126 paren_prec=PREC_NULL;127 } else if (paren_prec<=PREC_UNARY_PRE+ASSOC_MASK)128 ParenWarning(cc);129 }130 cur_op=cmp.binary_ops[cc->token];131 132 case PE_CHECK_BINARY_OPS2:133pe_check_binary_ops2:134 stk_op=PrsPop(ps);135 tmpc=PrsPop(ps);136 if (!(0<stk_op.u8[2]<=PREC_UNARY_PRE+ASSOC_MASK))137 goto pe_do_binary_op;138 139 case PE_DO_UNARY_OP:140 if (cur_op.u16[0]==IC_POWER &&141 stk_op.u16[0]==IC_UNARY_MINUS) {142 Lex(cc); //skip ` op143 left_prec=cur_op.i8[2];144 PrsPush(ps,tmpc);145 PrsPush(ps,stk_op);146 PrsPush(ps,cc->coc.coc_head.last->ic_class);147 PrsPush(ps,cur_op);148 goto pe_unary_term1;149 } else {150 tmpi=cc->coc.coc_head.last;151 tmpc=tmpi->ic_class;152 if (stk_op.u16[0]==IC_DEREF && tmpc->ptr_stars_cnt)153 tmpc--;154 else if (stk_op.u16[0]==IC_ADDR) {155 cc->abs_cnts.c_addres++;156 if (intermediate_code_table[tmpi->ic_code].type==IST_DEREF)157 OptFree(tmpi);158 tmpc++;159 }160 tmpc=OptClassFwd(tmpc);161 if (stk_op)162 ICAdd(cc,stk_op,0,tmpc);163 goto pe_check_binary_ops2;164 }165 166 case PE_DO_BINARY_OP:167pe_do_binary_op:168 PrsPush(ps,tmpc);169 PrsPush(ps,stk_op);170 if (!cur_op)171 goto pe_pop_all1;172 173 switch (cur_op.u16[0]) {174 case IC_ADD:175 case IC_SUB:176 tmpi=cc->coc.coc_head.last;177 if (!tmpi->ic_class->ptr_stars_cnt &&178 tmpi->ic_class->raw_type!=RT_F64) {179 ICAdd(cc,IC_SIZEOF,1,cmp.internal_types[RT_I64]);180 ICAdd(cc,IC_MUL,0,cmp.internal_types[RT_I64]);181 }182 break;183 case IC_AND_AND:184 case IC_OR_OR:185 ICAdd(cc,IC_NOP1,0,cmp.internal_types[RT_I64]);186 break;187 }188 if (cc->flags & CCF_FUN_EXP) {189 ps->ptr2--;190 cc->flags&=~CCF_FUN_EXP;191 }192 Lex(cc); //skip op193 if (paren_prec>PREC_UNARY_PRE+ASSOC_MASK &&194 paren_prec&~ASSOC_MASK<left_prec&~ASSOC_MASK+195 paren_prec&ASSOCF_RIGHT &&196 paren_prec&~ASSOC_MASK<cur_op.u8[2]&~ASSOC_MASK+197 !(paren_prec&ASSOCF_RIGHT))198 ParenWarning(cc);199 if (cur_op.u8[2]>max_prec)200 max_prec=cur_op.u8[2];201 left_prec=cur_op.u8[2];202 if (intermediate_code_table[cur_op.u16[0]].type==IST_ASSIGN) {203 tmpi=cc->coc.coc_head.last;204 tmpc=OptClassFwd(tmpi->ic_class);205 if (intermediate_code_table[tmpi->ic_code].type!=IST_DEREF ||206 !tmpc->ptr_stars_cnt && !Bt(&tmpc->flags,Cf_INTERNAL_TYPE))207 LexExcept(cc,"Invalid lval at ");208 tmpi->ic_code=IC_NOP1; //Important for setting class (pretty sure)209 cur_op.u8[2]=PREC_ASSIGN|ASSOCF_RIGHT;210 }211 212 case PE_POP_HIGHER:213pe_pop_higher:214 stk_op=PrsPop(ps); //pop ops of higher prec215 tmpc=PrsPop(ps);216 if (!stk_op)217 goto pe_push_lower;218 else if (cur_op.u8[2]&~ASSOC_MASK==stk_op.u8[2]&~ASSOC_MASK) {219 if (cur_op.u8[2]&ASSOCF_RIGHT)220 goto pe_push_lower;221 } else if (cur_op.u8[2]&~ASSOC_MASK<=stk_op.u8[2]&~ASSOC_MASK)222 goto pe_push_lower;223 224 tmpi=PrsAddOp(cc,stk_op,tmpc);225 226 if (intermediate_code_table[cur_op.u16[0]].type==IST_CMP &&227 intermediate_code_table[stk_op.u16[0]].type==IST_CMP) {228 tmpi->ic_flags|=ICF_PUSH_CMP;229 ICAdd(cc,IC_NOP1,0,cmp.internal_types[RT_I64]);230 ICAdd(cc,IC_PUSH_CMP,0,tmpc);231 cur_op.u8[3]|=ECF_HAS_PUSH_CMP;232 } else if (cur_op.u16[0]==IC_AND_AND || cur_op.u16[0]==IC_OR_OR)233 ICAdd(cc,IC_NOP1,0,cmp.internal_types[RT_I64]);234 goto pe_pop_higher;235 236 case PE_PUSH_LOWER:237pe_push_lower:238 PrsPush(ps,tmpc);239 PrsPush(ps,stk_op);240 PrsPush(ps,cc->coc.coc_head.last->ic_class);241 PrsPush(ps,cur_op);242 goto pe_unary_term1;243 244 case PE_POP_ALL1:245pe_pop_all1:246 if (paren_prec>PREC_UNARY_PRE+ASSOC_MASK &&247 paren_prec&~ASSOC_MASK<=left_prec&~ASSOC_MASK-248 paren_prec&ASSOCF_LEFT-left_prec&ASSOCF_LEFT)249 ParenWarning(cc);250 case PE_POP_ALL2:251pe_pop_all2:252 stk_op=PrsPop(ps);253 tmpc=PrsPop(ps);254 if (!stk_op.u16[0])255 goto pe_done;256 PrsAddOp(cc,stk_op,tmpc);257 goto pe_pop_all2;258 }259 }260pe_done:261 if (_max_prec)262 *_max_prec=max_prec;263}264 265Bool PrsExpression(CCmpCtrl *cc,I64 *_max_prec,Bool end_exp,CPrsStk *_ps=NULL)266{267 Bool res=TRUE;268 I64 old_flags=cc->flags;269 CPrsStk *ps;270 if (_ps)271 ps=_ps;272 else {273 ps=MAlloc(sizeof(CPrsStk));274 ps->ptr=0;275 ps->ptr2=0;276 }277 PrsPush(ps,0); //terminate278 PrsPush(ps,0); //terminate279 try280//try catch causes noreg vars in function281 PrsExpression2(cc,_max_prec,ps);282 catch {283 if (Fs->except_ch=='Compiler') {284 res=FALSE;285 Fs->catch_except=TRUE;286 }287 }288 if (!_ps) {289 if (ps->ptr)290 LexExcept(cc,"Compiler Parse Error at ");291 Free(ps);292 }293 if (res) {294 if (end_exp)295 ICAdd(cc,IC_END_EXP,0,0,ICF_RES_NOT_USED);296 if (cc->coc.coc_head.last->ic_class==297 cmp.internal_types[RT_U0])298 LexWarn(cc,"U0 Expression ");299 }300 cc->flags|=old_flags&(CCF_PREINC|CCF_PREDEC);301 return res;302}303 304U0 PrsSizeOf(CCmpCtrl *cc)305{306 CHashClass *tmpc;307 CMemberLst *tmpm;308 CDbgInfo *dbg_info;309 I64 i;310 if (cc->token!=TK_IDENT)311 LexExcept(cc,"Invalid class at ");312 if (tmpm=cc->local_var_entry) {313 tmpc=tmpm->member_class;314 i=tmpc->size*tmpm->dim.total_cnt;315 if (Lex(cc)=='.')316 goto pu_sizeof_member;317 } else {318 if (!(tmpc=cc->hash_entry) || !(tmpc->type &319 (HTT_CLASS|HTT_INTERNAL_TYPE|HTT_GLBL_VAR|320 HTT_FUN|HTT_EXPORT_SYS_SYM)))321 LexExcept(cc,"Invalid class at ");322 if (tmpc->type&(HTT_FUN|HTT_EXPORT_SYS_SYM)) {323 if (!(dbg_info=tmpc(CHashFun *)->dbg_info))324 LexExcept(cc,"Size not defined at ");325 i=dbg_info->body[dbg_info->max_line+1-dbg_info->min_line]326 -dbg_info->body[0];327 Lex(cc);328 } else {329 i=tmpc->size;330 while (Lex(cc)=='.') {331pu_sizeof_member:332 if (!(tmpc->type & (HTT_CLASS|HTT_GLBL_VAR)))333 LexExcept(cc,"Invalid class at ");334 else if (tmpc->type & HTT_GLBL_VAR)335 tmpc=tmpc(CHashGlblVar *)->var_class;336 if (Lex(cc)!=TK_IDENT || !(tmpm=MemberFind(cc->cur_str,tmpc)))337 LexExcept(cc,"Invalid member at ");338 else if (cc->local_var_entry)339 cc->local_var_entry->use_cnt--;340 tmpc=tmpm->member_class;341//Probably others like this:342 #assert offset(CHashClass.size)==offset(CHashGlblVar.size)343 i=tmpc->size*tmpm->dim.total_cnt;344 }345 }346 }347 if (cc->token=='*') {348 while (Lex(cc)=='*');349 i=sizeof(U8 *);350 }351 ICAdd(cc,IC_IMM_I64,i,cmp.internal_types[RT_I64]);352}353 354U0 PrsOffsetOf(CCmpCtrl *cc)355{356 CHashClass *tmpc;357 CMemberLst *tmpm;358 I64 i;359 if (cc->token!=TK_IDENT)360 LexExcept(cc,"Invalid class at ");361 if (tmpm=cc->local_var_entry)362 tmpc=tmpm->member_class;363 else {364 tmpc=cc->hash_entry;365 if (!tmpc || !(tmpc->type & (HTT_CLASS|HTT_GLBL_VAR)))366 LexExcept(cc,"Invalid class at ");367 else if (tmpc->type & HTT_GLBL_VAR)368 tmpc=tmpc(CHashGlblVar *)->var_class;369 }370 if (Lex(cc)!='.')371 LexExcept(cc,"Expecting '.' at ");372 i=0;373 do {374 if (Lex(cc)!=TK_IDENT || !(tmpm=MemberFind(cc->cur_str,tmpc)))375 LexExcept(cc,"Invalid member at ");376 else if (cc->local_var_entry)377 cc->local_var_entry->use_cnt--;378 i+=tmpm->offset;379 tmpc=tmpm->member_class;380 } while (Lex(cc)=='.');381 ICAdd(cc,IC_IMM_I64,i,cmp.internal_types[RT_I64]);382}383 384I64 PrsFunCall(CCmpCtrl *cc,CPrsStk *ps,Bool indirect,CHashFun *tmpf)385{386 I64 i,argc_cnt,dft_val;387 Bool is_first_arg=TRUE,needs_right_paren,is_print,is_putchars,388 is_template_fun;389 CHashClass *tmpc2,*last_class=NULL;390 CMemberLst *tmpm;391 CCodeCtrl *tmpcbh,*tmpcbh1;392 CCodeMisc *cm;393 CIntermediateCode *tmpi;394 395 if (!tmpf) {396 if (cc->token==TK_CHAR_CONST) {397 if (!(tmpf=HashFind("PutChars",cc->htc.hash_table_lst,HTT_FUN)))398 LexExcept(cc,"Missing header for Print() and PutChars() at ");399 if (!cc->cur_i64) //empty char signals PutChars with variable400 Lex(cc);401 is_print=FALSE;402 is_putchars=TRUE;403 } else {404 if (!(tmpf=HashFind("Print",cc->htc.hash_table_lst,HTT_FUN)))405 LexExcept(cc,"Missing header for Print() and PutChars() at ");406 if (!*cc->cur_str) //empty string signals Print with variable fmt_str407 Lex(cc);408 is_putchars=FALSE;409 is_print=TRUE;410 }411 } else {412 is_print=FALSE;413 is_putchars=FALSE;414 }415 416 if (Bt(&tmpf->flags,Ff_INTERNAL)&& IC_SQR<=tmpf->exe_addr<=IC_ATAN)417 is_template_fun=TRUE;418 else419 is_template_fun=FALSE;420 421 if (indirect) {422 if (!(cc->flags & (CCF_RAX | CCF_ARRAY)))423 ICAdd(cc,IC_DEREF,0,cmp.internal_types[RT_PTR]);424 cc->coc.coc_head.last->ic_class=cmp.internal_types[RT_PTR];425 ICAdd(cc,IC_SET_RAX,0,cmp.internal_types[RT_PTR]);426 ICAdd(cc,IC_NOP2,1,cmp.internal_types[RT_PTR]); //balance the books427 }428 COCPush(cc);429 tmpcbh=cc->coc.coc_next;430 cc->coc.coc_next=NULL;431 i=tmpf->arg_cnt;432 tmpm=tmpf->member_lst_and_root;433 argc_cnt=0;434 if (cc->token=='(') {435 Lex(cc);436 needs_right_paren=TRUE;437 } else438 needs_right_paren=FALSE;439 while (i--) {440 COCInit(cc);441 if (!is_first_arg) {442 if (is_print) {443 if (cc->token==',')444 Lex(cc);445 else if (cc->token!=';')446 LexExcept(cc,"Expecting ',' at ");447 } else {448 if (needs_right_paren) {449 if (cc->token==',')450 Lex(cc);451 else if (cc->token!=')')452 LexExcept(cc,"Expecting ',' at ");453 }454 }455 }456 if (tmpm->flags & MLF_DFT_AVAILABLE &&457 (cc->token==')' || cc->token==',' || !needs_right_paren)) {458 dft_val=tmpm->dft_val;459 if (tmpm->flags & MLF_LASTCLASS && last_class)460 dft_val=(last_class-last_class->ptr_stars_cnt)->str;461 if (tmpm->flags & (MLF_STR_DFT_AVAILABLE|MLF_LASTCLASS) &&462 cc->flags&CCF_AOT_COMPILE) {463 cm=COCMiscNew(cc,CMT_STR_CONST);464 ICAdd(cc,IC_STR_CONST,cm,cmp.internal_types[RT_U8]+1);465 cm->st_len=StrLen(dft_val)+1;466 cm->str=StrNew(dft_val);467 cc->flags|=CCF_HAS_MISC_DATA;468 } else469 ICAdd(cc,IC_IMM_I64,dft_val,tmpm->member_class);470 } else {471 if (!PrsExpression(cc,NULL,FALSE,ps))472 throw('Compiler');473 else {474 COCPush(cc);475 cc->pass=0; OptPass012(cc);476 cc->pass=1; tmpi=OptPass012(cc);477 COCPop(cc);478 last_class=OptClassFwd(tmpi->ic_class);479 tmpc2=OptClassFwd(tmpm->member_class);480 if (tmpc2->raw_type==RT_F64 && !tmpm->dim.next &&481 last_class->raw_type!=RT_F64)482 tmpi->ic_flags|=ICF_RES_TO_F64;483 else484 if (tmpc2->raw_type!=RT_F64 && last_class->raw_type==RT_F64)485 tmpi->ic_flags|=ICF_RES_TO_INT;486 }487 }488 COCPush(cc);489 is_first_arg=FALSE;490 tmpm=tmpm->next;491 }492 if (tmpm && tmpm->flags & MLF_DOT_DOT_DOT) {493 COCInit(cc);494 tmpi=ICAdd(cc,IC_IMM_I64,0,tmpm->member_class);495 COCPush(cc);496 if (is_print) {497 if (cc->token!=';') {498 do {499 if (!is_first_arg) {500 if (cc->token==',')501 Lex(cc);502 else503 LexExcept(cc,"Expecting ',' at ");504 }505 COCInit(cc);506 if (!PrsExpression(cc,NULL,FALSE,ps))507 throw('Compiler');508 COCPush(cc);509 is_first_arg=FALSE;510 argc_cnt++;511 } while (cc->token==',');512 }513 } else if (needs_right_paren) {514 if (cc->token!=')') {515 do {516 if (!is_first_arg) {517 if (cc->token==',')518 Lex(cc);519 else520 LexExcept(cc,"Expecting ',' at ");521 }522 COCInit(cc);523 if (!PrsExpression(cc,NULL,FALSE,ps))524 throw('Compiler');525 COCPush(cc);526 is_first_arg=FALSE;527 argc_cnt++;528 } while (cc->token==',');529 }530 }531 tmpi->ic_data=argc_cnt++; //++ so add_esp latter works532 }533 if (needs_right_paren) {534 if (cc->token==')')535 Lex(cc);536 else537 LexExcept(cc,"Missing ')' at ");538 }539 tmpcbh1=tmpcbh->coc_next;540 tmpcbh->coc_next=cc->coc.coc_next;541 cc->coc.coc_next=tmpcbh;542 COCPop(cc);543 tmpcbh=cc->coc.coc_next;544 cc->coc.coc_next=tmpcbh1;545 if (!is_template_fun)546 ICAdd(cc,IC_CALL_START,tmpf,0);547 if (indirect)548 ICAdd(cc,IC_PUSH_REGS,1<<REG_RAX,tmpf->return_class);549 while (tmpcbh) {550 tmpcbh1=tmpcbh->coc_next;551 COCAppend(cc,tmpcbh);552 if (!Bt(&tmpf->flags,Ff_INTERNAL))553 cc->coc.coc_head.last->ic_flags|=ICF_PUSH_RES;554 tmpcbh=tmpcbh1;555 }556 if (Bt(&tmpf->flags,Ff_INTERNAL))557 ICAdd(cc,tmpf->exe_addr,0,tmpf->return_class);558 else {559 if (indirect)560 ICAdd(cc,IC_CALL_INDIRECT,561 (argc_cnt+tmpf->arg_cnt)<<3,tmpf->return_class);562 else if (Bt(&tmpf->flags,Cf_EXTERN)) {563 cc->abs_cnts.externs++;564 if (cc->flags&CCF_AOT_COMPILE) {565 if (tmpf->type&HTF_IMPORT)566 ICAdd(cc,IC_CALL_IMPORT,tmpf,tmpf->return_class);567 else568 ICAdd(cc,IC_CALL_EXTERN,tmpf,tmpf->return_class);569 } else570 ICAdd(cc,IC_CALL_INDIRECT2,&tmpf->exe_addr,tmpf->return_class);571 } else572 ICAdd(cc,IC_CALL,tmpf->exe_addr,tmpf->return_class);573 if ((Bt(&tmpf->flags,Ff_RET1) || Bt(&tmpf->flags,Ff_ARGPOP)) &&574 !Bt(&tmpf->flags,Ff_NOARGPOP)) {575 if (indirect) {576 ICAdd(cc,IC_ADD_RSP1,(argc_cnt+tmpf->arg_cnt)<<3,tmpf->return_class);577 ICAdd(cc,IC_ADD_RSP,8,tmpf->return_class);578 } else579 ICAdd(cc,IC_ADD_RSP1,(argc_cnt+tmpf->arg_cnt)<<3,tmpf->return_class);580 } else {581 if (indirect)582 argc_cnt++;583 ICAdd(cc,IC_ADD_RSP,(argc_cnt+tmpf->arg_cnt)<<3,tmpf->return_class);584 }585 }586 if (!is_template_fun)587 ICAdd(cc,IC_CALL_END,tmpf,tmpf->return_class);588 if (is_print||is_putchars)589 ICAdd(cc,IC_END_EXP,0,0,ICF_RES_NOT_USED);590 cc->flags=(cc->flags|CCF_RAX) & ~(CCF_ARRAY|CCF_FUN_EXP);591 return PE_UNARY_MODIFIERS;592}593 594I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,595 CArrayDim **_tmpad,I64 *max_prec,I64 *unary_pre_prec,I64 *paren_prec)596{597 I64 i,j;598 CHashExport *tmpex;599 CHashClass *tmpc;600 CHashFun *tmpf;601 CHashGlblVar *tmpg;602 CMemberLst *tmpm;603 CAsmUndefHash *tmpauh;604 CCodeMisc *cm;605 Bool paren_warn;606 607 *_local_var=NULL;608 *paren_prec=PREC_NULL;609 switch (cc->token) {610 start:611 if (PREC_UNARY_PRE>*max_prec)612 *max_prec=PREC_UNARY_PRE;613 *unary_pre_prec=PREC_UNARY_PRE;614 start:615 case '~': i=IC_COM; break;616 case '!': i=IC_NOT; break;617 case '-': i=IC_UNARY_MINUS; break;618 case '*': i=IC_DEREF; break;619 end:620 Lex(cc); //Skip op621 break;622 case '&':623 if (Lex(cc)==TK_IDENT) {624 if (tmpc=cc->hash_entry) {625 if (tmpc->type & HTT_FUN) {626 tmpf=tmpc;627 if (!Bt(&tmpf->flags,Ff_INTERNAL)) {628 if (Bt(&tmpf->flags,Cf_EXTERN)) {629 if (cc->flags&CCF_AOT_COMPILE) {630 if (cc->flags&CCF_ASM_EXPRESSIONS) {631 if (tmpex=HashFind(tmpf->str,cc->htc.hash_table_lst,632 HTT_EXPORT_SYS_SYM))633 goto pu_export_sys_sym;634 else635 goto pu_new_sys_sym;636 }637 LexExcept(cc,"Can't take addr of extern fun");638 }639 cc->abs_cnts.externs++;640 ICAdd(cc,IC_IMM_I64,641 &tmpf->exe_addr,cmp.internal_types[RT_PTR]);642 ICAdd(cc,IC_DEREF,0,cmp.internal_types[RT_PTR]);643 } else {644 if (cc->flags&CCF_AOT_COMPILE) {645 ICAdd(cc,IC_ABS_ADDR,646 tmpf->exe_addr,cmp.internal_types[RT_PTR]);647 if (cc->flags&CCF_ASM_EXPRESSIONS)648 cc->abs_cnts.abs_addres++;649 } else650 ICAdd(cc,IC_IMM_I64,651 tmpf->exe_addr,cmp.internal_types[RT_PTR]);652 }653 cc->abs_cnts.c_addres++;654 Lex(cc);655 return PE_MAYBE_MODIFIERS;656 }657 } else if (tmpc->type & HTT_EXPORT_SYS_SYM) {658 tmpex=tmpc;659 if (cc->flags&CCF_ASM_EXPRESSIONS &&660 !(cc->flags&CCF_AOT_COMPILE) && tmpex->type&HTF_IMM) {661 cc->abs_cnts.c_addres++;662 ICAdd(cc,IC_IMM_I64,663 tmpex->val,cmp.internal_types[RT_PTR]);664 Lex(cc);665 return PE_MAYBE_MODIFIERS;666 } else667 goto pu_export_sys_sym;668 }669 } else if (cc->flags&CCF_ASM_EXPRESSIONS && !cc->local_var_entry)670 goto pu_ident_but_not_local_var;671 }672 i=IC_ADDR;673 break;674 end:675 PrsPush(ps,tmpc);676 PrsPush(ps,PREC_UNARY_PRE<<16+i);677 return PE_UNARY_TERM2;678 679 start:680 case TK_I64:681 case TK_CHAR_CONST:682 case TK_INS_BIN_SIZE:683 if (cc->cur_i64<0)684 ICAdd(cc,IC_IMM_I64,cc->cur_i64,cmp.internal_types[RT_U64]);685 else686 ICAdd(cc,IC_IMM_I64,cc->cur_i64,cmp.internal_types[RT_I64]);687 Lex(cc);688 break;689 case TK_F64:690 ICAdd(cc,IC_IMM_F64,cc->cur_f64(I64),cmp.internal_types[RT_F64]);691 Lex(cc);692 break;693 case TK_STR:694 cm=COCMiscNew(cc,CMT_STR_CONST);695 ICAdd(cc,IC_STR_CONST,cm,cmp.internal_types[RT_U8]+1);696 cm->str=LexExtStr(cc,&cm->st_len);697 cc->flags|=CCF_HAS_MISC_DATA;698 break;699 case TK_INS_BIN:700 cm=COCMiscNew(cc,CMT_STR_CONST);701 ICAdd(cc,IC_STR_CONST,cm,cmp.internal_types[RT_U8]+1);702 cm->str=cc->cur_str;703 cm->st_len=cc->cur_str_len;704 cc->cur_str=NULL;705 cc->flags|=CCF_HAS_MISC_DATA;706 Lex(cc);707 break;708 case '$':709 if (cc->flags & CCF_ASM_EXPRESSIONS) {710 cc->abs_cnts.abs_addres++;711 if (cc->flags&CCF_AOT_COMPILE)712 ICAdd(cc,IC_ABS_ADDR,cc->aotc->rip,cmp.internal_types[RT_PTR]);713 else714 ICAdd(cc,IC_IMM_I64,cc->aotc->rip,cmp.internal_types[RT_PTR]);715 } else {716 if (cc->flags&CCF_CLASS_DOL_OFFSET)717 ICAdd(cc,IC_IMM_I64,cc->class_dol_offset,718 cmp.internal_types[RT_I64]);719 else720 ICAdd(cc,IC_RIP,0,cmp.internal_types[RT_PTR]);721 }722 Lex(cc);723 break;724 end:725 if (PREC_TERM>*max_prec)726 *max_prec=PREC_TERM;727 return PE_MAYBE_MODIFIERS;728 729 case '(':730 if (Lex(cc)==TK_IDENT && cc->hash_entry &&731 cc->hash_entry->type & (HTT_CLASS|HTT_INTERNAL_TYPE))732 LexExcept(cc,"Use TempleOS postfix typecasting at ");733 else {734 if (PREC_TERM>*max_prec)735 *max_prec=PREC_TERM;736 if (cc->lex_include_stk->flags&LFSF_DEFINE)737 paren_warn=FALSE;738 else739 paren_warn=TRUE;740 if (!PrsExpression(cc,paren_prec,FALSE,ps))741 throw('Compiler');742 if (!paren_warn)743 *paren_prec=PREC_NULL;744 if (cc->token!=')')745 LexExcept(cc,"Missing ')' at ");746 Lex(cc); //skip )747 cc->flags= cc->flags & ~CCF_ARRAY | CCF_RAX | CCF_PAREN;748 return PE_UNARY_MODIFIERS;749 }750 751 start:752 case '+': break;753 case TK_PLUS_PLUS: cc->flags|=CCF_PREINC; break;754 case TK_MINUS_MINUS: cc->flags|=CCF_PREDEC; break;755 end:756 if (PREC_UNARY_PRE>*max_prec)757 *max_prec=PREC_UNARY_PRE;758 *unary_pre_prec=PREC_UNARY_PRE;759 Lex(cc);760 return PE_UNARY_TERM2;761 762 case TK_IDENT:763 if (tmpm=cc->local_var_entry) {764 if (PREC_TERM>*max_prec)765 *max_prec=PREC_TERM;766 cc->flags&=~(CCF_RAX|CCF_ARRAY|CCF_FUN_EXP);767 tmpc=tmpm->member_class+1;768 if (tmpm->flags & MLF_FUN && !(cc->flags&CCF_ASM_EXPRESSIONS)) {769 PrsPopDeref(ps);770 cc->flags|=CCF_FUN_EXP;771 PrsPush2(ps,tmpm->fun_ptr-tmpm->fun_ptr->ptr_stars_cnt);772 }773 if (tmpm->dim.next) {774 *_tmpad=tmpm->dim.next;775 cc->flags|=CCF_ARRAY;776 }777 if (tmpm->flags&MLF_STATIC) {778 if (cc->flags&CCF_AOT_COMPILE) {779// if (tmpg->flags&GVF_DATA_HEAP) //TODO780 // ICAdd(cc,IC_HEAP_GLBL,tmpm->static_data,tmpc);781 // else782 ICAdd(cc,IC_ABS_ADDR,tmpm->static_data_rip,tmpc);783 } else784 ICAdd(cc,IC_IMM_I64,tmpm->static_data,tmpc);785 } else {786 if (cc->flags&CCF_ASM_EXPRESSIONS) {787 i=PrsPop(ps);788 ps->ptr--;789 if (i.u16[0]!=IC_ADDR)790 LexExcept(cc,"Expecting '&' at ");791 ICAdd(cc,IC_IMM_I64,tmpm->offset,cmp.internal_types[RT_PTR]);792 *_local_var=tmpm;793 Lex(cc);794 return PE_MAYBE_MODIFIERS;795 } else {796 if (tmpm->dim.next && tmpm->offset>0 &&797 StrCmp(tmpm->str,"argv")) {798 tmpc++;799 cc->flags&=~CCF_ARRAY;800 }801 ICAdd(cc,IC_RBP,0,tmpc);802 ICAdd(cc,IC_IMM_I64,tmpm->offset,tmpc);803 ICAdd(cc,IC_ADD,0,tmpc);804 }805 }806 Lex(cc); //skip var name807 *_local_var=tmpm;808 return PE_UNARY_MODIFIERS;809 }810pu_ident_but_not_local_var:811 if (!(tmpex=cc->hash_entry)) {812 if (!(cc->flags & CCF_ASM_EXPRESSIONS))813 LexExcept(cc,"Invalid lval at ");814 tmpc=NULL;815pu_new_sys_sym:816 tmpex=CAlloc(sizeof(CHashExport),Fs->code_heap);817 tmpex->str=cc->cur_str;818 cc->cur_str=NULL;819 if (!cc->htc.local_var_lst &&820 *tmpex->str=='@' && tmpex->str[1]=='@') {821 tmpex->type=HTT_EXPORT_SYS_SYM | HTF_UNRESOLVED | HTF_LOCAL;822 HashAdd(tmpex,cc->htc.local_hash_table);823 } else {824 tmpex->type=HTT_EXPORT_SYS_SYM | HTF_UNRESOLVED;825 if (tmpc)826 HashAddAfter(tmpex,tmpc,cc->htc.glbl_hash_table);827 else828 HashAdd(tmpex,cc->htc.glbl_hash_table);829 }830 }831 switch (Bsf(tmpex->type)) {832 case HTt_EXPORT_SYS_SYM:833pu_export_sys_sym:834 if (PREC_TERM>*max_prec)835 *max_prec=PREC_TERM;836 if (!(tmpex->type & (HTF_IMM|HTF_IMPORT)))837 cc->abs_cnts.abs_addres++;838 if (tmpex->type & HTF_UNRESOLVED) {839 if (!(cc->flags&CCF_ASM_EXPRESSIONS))840 LexExcept(cc,"Illegal fwd ref at ");841 tmpauh=MAlloc(sizeof(CAsmUndefHash));842 tmpauh->hash=tmpex;843 tmpauh->next=cc->asm_undef_hash;844 cc->asm_undef_hash=tmpauh;845 if (tmpex->type & HTF_LOCAL)846 cc->flags|=CCF_UNRESOLVED|CCF_LOCAL;847 else848 cc->flags|=CCF_UNRESOLVED;849 ICAdd(cc,IC_IMM_I64,850 &tmpex->val,cmp.internal_types[RT_PTR],ICF_NO_RIP);851 ICAdd(cc,IC_DEREF,0,cmp.internal_types[RT_PTR]);852 } else {853 if (cc->flags&CCF_AOT_COMPILE && !(tmpex->type & HTF_IMM))854 ICAdd(cc,IC_ABS_ADDR,tmpex->val,cmp.internal_types[RT_PTR]);855 else {856 if (tmpex->type&HTF_IMM)857 cc->abs_cnts.c_addres++;858 ICAdd(cc,IC_IMM_I64,tmpex->val,cmp.internal_types[RT_PTR]);859 }860 }861 Lex(cc);862 return PE_MAYBE_MODIFIERS;863 case HTt_FUN:864 if (PREC_TERM>*max_prec)865 *max_prec=PREC_TERM;866 Lex(cc); //skip fun name867 return PrsFunCall(cc,ps,FALSE,tmpex);868 case HTt_GLBL_VAR:869 if (PREC_TERM>*max_prec)870 *max_prec=PREC_TERM;871 tmpg=tmpex;872 tmpc=tmpg->var_class+1;873 cc->flags&=~(CCF_RAX|CCF_ARRAY|CCF_FUN_EXP);874 if (tmpg->flags&GVF_ARRAY) {875 *_tmpad=tmpg->dim.next;876 cc->flags|=CCF_ARRAY;877 }878 if (cc->flags&CCF_AOT_COMPILE) {879 if (tmpg->flags & GVF_EXTERN) //TODO880 LexExcept(cc,"Feature not implemented ");881 else {882 if (tmpg->flags & GVF_IMPORT)883 ICAdd(cc,IC_ADDR_IMPORT,tmpg,tmpc);884 else {885 if (tmpg->flags&GVF_DATA_HEAP)886 ICAdd(cc,IC_HEAP_GLBL,tmpg->heap_glbl,tmpc);887 else888 ICAdd(cc,IC_ABS_ADDR,tmpg->data_addr_rip,tmpc);889 }890 }891 } else {892 if (tmpg->flags & GVF_EXTERN) {893 cc->abs_cnts.externs++;894 ICAdd(cc,IC_IMM_I64,&tmpg->data_addr,tmpc);895 ICAdd(cc,IC_DEREF,0,tmpc);896 } else897 ICAdd(cc,IC_IMM_I64,tmpg->data_addr,tmpc);898 }899 Lex(cc);900 if (tmpg->flags & GVF_FUN) {901 PrsPopDeref(ps);902 cc->flags|=CCF_FUN_EXP;903 PrsPush2(ps,tmpg->fun_ptr-tmpg->fun_ptr->ptr_stars_cnt);904 }905 return PE_UNARY_MODIFIERS;906 case HTt_CLASS:907 PrsOffsetOf(cc);908 return PE_MAYBE_MODIFIERS;909 case HTt_KEYWORD:910 switch (tmpex(CHashGeneric *)->user_data0) {911 case KW_SIZEOF:912 if (PREC_TERM>*max_prec)913 *max_prec=PREC_TERM;914 j=0;915 while (Lex(cc)=='(')916 j++;917 PrsSizeOf(cc);918 while (j--) {919 if (cc->token!=')')920 LexExcept(cc,"Missing ')' at ");921 Lex(cc);922 }923 return PE_MAYBE_MODIFIERS;924 case KW_OFFSET:925 if (PREC_TERM>*max_prec)926 *max_prec=PREC_TERM;927 j=0;928 while (Lex(cc)=='(')929 j++;930 PrsOffsetOf(cc);931 while (j--) {932 if (cc->token!=')')933 LexExcept(cc,"Missing ')' at ");934 Lex(cc);935 }936 return PE_MAYBE_MODIFIERS;937 case KW_DEFINED:938 if (PREC_TERM>*max_prec)939 *max_prec=PREC_TERM;940 j=0;941 while (Lex(cc)=='(')942 j++;943 if (cc->token==TK_IDENT &&944 (cc->hash_entry || cc->local_var_entry))945 ICAdd(cc,IC_IMM_I64,TRUE,cmp.internal_types[RT_I64]);946 else947 ICAdd(cc,IC_IMM_I64,FALSE,cmp.internal_types[RT_I64]);948 Lex(cc);949 while (j--) {950 if (cc->token!=')')951 LexExcept(cc,"Missing ')' at ");952 Lex(cc);953 }954 return PE_MAYBE_MODIFIERS;955 }956 }957 }958 LexExcept(cc,"Missing expression at ");959}960 961I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,962 CArrayDim **_tmpad,I64 *unary_post_prec)963{964 CHashClass *tmpc,*tmpc1;965 CHashFun *fun_ptr;966 CMemberLst *tmpm=*_local_var;967 CIntermediateCode *tmpi,*tmpi1;968 CArrayDim *tmpad1,tmpad2;969 CCodeMisc *cm;970 I64 mode,old_flags;971 Bool was_paren=Btr(&cc->flags,CCf_PAREN);972 973 *_local_var=NULL;974 switch (cc->token) {975 case '.':976 if (tmpm)977 tmpm->reg=REG_NONE;978 goto um_join;979 980 case TK_DEREFERENCE:981 tmpi=cc->coc.coc_head.last;982 if (!(cc->flags & (CCF_RAX | CCF_ARRAY)))983 ICAdd(cc,IC_DEREF+PREC_UNARY_PRE<<16,0,tmpi->ic_class-1);984 else985 tmpi->ic_class--;986 987 um_join:988 if (!*unary_post_prec)989 *unary_post_prec=PREC_TERM;990 tmpc=cc->coc.coc_head.last->ic_class;991 if ((!tmpc->ptr_stars_cnt || cc->flags & CCF_ARRAY) && cc->token=='.')992 LexExcept(cc,"Must be address, not value ");993 if (!(cc->flags & CCF_RAX))994 tmpc--;995 if (!(tmpc->type & HTT_CLASS))996 LexExcept(cc,"Invalid class at ");997 if (Lex(cc)!=TK_IDENT ||998 !(tmpm=MemberFind(cc->cur_str,tmpc)))999 LexExcept(cc,"Invalid member at ");1000 else if (cc->local_var_entry)1001 cc->local_var_entry->use_cnt--;1002 Lex(cc); //skip member name1003 tmpc1=tmpm->member_class+1;1004 ICAdd(cc,IC_IMM_I64,tmpm->offset,tmpc1);1005 cc->flags&=~(CCF_RAX|CCF_ARRAY|CCF_FUN_EXP);1006 if (tmpm->dim.next) {1007 *_tmpad=tmpm->dim.next;1008 cc->flags|=CCF_ARRAY;1009 }1010 if(tmpm->flags & MLF_FUN) {1011 PrsPopDeref(ps);1012 PrsPush2(ps,tmpm->fun_ptr-tmpm->fun_ptr->ptr_stars_cnt);1013 cc->flags|=CCF_FUN_EXP;1014 }1015 ICAdd(cc,IC_ADD,0,tmpc1);1016 return PE_UNARY_MODIFIERS;1017 case '(':1018 if (cc->flags & CCF_FUN_EXP) {1019 if (!*unary_post_prec)1020 *unary_post_prec=PREC_TERM;1021 return PrsFunCall(cc,ps,TRUE,PrsPop2(ps));1022 }1023 if (!*unary_post_prec)1024 *unary_post_prec=PREC_TERM;1025 if (Lex(cc)!=TK_IDENT)1026 LexExcept(cc,"Invalid class at ");1027 if (Btr(&cc->flags,CCf_FUN_EXP))1028 ps->ptr2--;1029 cc->flags&=~CCF_ARRAY;1030 tmpc=cc->hash_entry;1031 Lex(cc);1032 mode=PRS0_TYPECAST|PRS1_NULL;1033 tmpc=PrsType(cc,&tmpc,&mode,NULL,NULL,&fun_ptr,NULL,&tmpad2,0);1034 if (fun_ptr) {1035 PrsPopDeref(ps);1036 Bts(&cc->flags,CCf_FUN_EXP);1037 PrsPush2(ps,fun_ptr);1038 cm=COCMiscNew(cc,CMT_HASH_ENTRY);1039 cm->h=fun_ptr;1040 }1041 if (*_tmpad=tmpad2.next) {1042 cc->flags|=CCF_ARRAY;1043 tmpc++;1044 cm=COCMiscNew(cc,CMT_ARRAY_DIM);1045 cm->dim=*_tmpad;1046 }1047 if (!(cc->flags&(CCF_RAX|CCF_ARRAY)))1048 tmpc++;1049 tmpi=cc->coc.coc_head.last;1050 tmpi->ic_class=tmpc;1051 ICAdd(cc,IC_HOLYC_TYPECAST,was_paren,tmpc);1052 if (cc->token!=')')1053 LexExcept(cc,"Missing ')' at ");1054 Lex(cc);1055 return PE_UNARY_MODIFIERS;1056 case '[':1057 if (!*unary_post_prec)1058 *unary_post_prec=PREC_TERM;1059 Lex(cc);1060 tmpc=OptClassFwd(cc->coc.coc_head.last->ic_class);1061 if (!tmpc->ptr_stars_cnt)1062 LexExcept(cc,"Not array or ptr ");1063 if (!(cc->flags & (CCF_ARRAY | CCF_RAX))) {1064 tmpc=OptClassFwd(tmpc-1);1065 if (!tmpc->ptr_stars_cnt)1066 LexExcept(cc,"Not array or ptr ");1067 ICAdd(cc,IC_DEREF+PREC_UNARY_PRE<<16,0,tmpc);1068 }1069 tmpc1=tmpc-1;1070 if (tmpad1=*_tmpad) {1071 ICAdd(cc,IC_IMM_I64,tmpad1->total_cnt*tmpc1->size,tmpc);1072 if (*_tmpad=tmpad1->next) {1073 old_flags=cc->flags;1074 if (!PrsExpression(cc,NULL,FALSE,ps))1075 throw('Compiler');1076 cc->flags=cc->flags&~CCF_FUN_EXP|old_flags&CCF_FUN_EXP;1077 if (cc->token!=']')1078 LexExcept(cc,"Missing ']' at ");1079 Lex(cc); //skip ]1080 tmpi1=cc->coc.coc_head.last;1081 tmpi1->ic_flags|=ICF_RES_TO_INT;1082 ICAdd(cc,IC_MUL,0,tmpc);1083 ICAdd(cc,IC_ADD,0,tmpc);1084 cc->flags|=CCF_RAX;1085 return PE_UNARY_MODIFIERS;1086 }1087 } else1088 ICAdd(cc,IC_IMM_I64,tmpc1->size,tmpc);1089 old_flags=cc->flags;1090 if (!PrsExpression(cc,NULL,FALSE,ps))1091 throw('Compiler');1092 cc->flags=cc->flags&~CCF_FUN_EXP|old_flags&CCF_FUN_EXP;1093 if (cc->token!=']')1094 LexExcept(cc,"Missing ']' at ");1095 Lex(cc); //skip ]1096 tmpi1=cc->coc.coc_head.last;1097 tmpi1->ic_flags|=ICF_RES_TO_INT;1098 ICAdd(cc,IC_MUL,0,tmpc);1099 ICAdd(cc,IC_ADD,0,tmpc);1100 cc->flags&=~(CCF_RAX|CCF_ARRAY);1101 return PE_UNARY_MODIFIERS;1102 start:1103 case TK_PLUS_PLUS:1104 cc->flags|=CCF_POSTINC;1105 break;1106 case TK_MINUS_MINUS:1107 cc->flags|=CCF_POSTDEC;1108 break;1109 end:1110 if (!*unary_post_prec)1111 *unary_post_prec=PREC_UNARY_POST;1112 Lex(cc);1113 return PE_DEREFERENCE;1114 }1115 return PE_DEREFERENCE;1116}1117 1118U8 *LexExpression2Bin(CCmpCtrl *cc,I64 *_type=NULL)1119{//Compile cc expression. You call the code.1120 U8 *res;1121 I64 size;1122 Bool old_trace=Btr(&cc->flags,CCf_PASS_TRACE_PRESENT);1123 COCPush(cc);1124 COCInit(cc);1125 if (PrsExpression(cc,NULL,FALSE)) {1126 ICAdd(cc,IC_RETURN_VAL,0,0);1127 ICAdd(cc,IC_RET,0,0);1128 res=COCCompile(cc,&size,NULL,_type);1129 } else1130 res=NULL;1131 COCPop(cc);1132 BEqu(&cc->flags,CCf_PASS_TRACE_PRESENT,old_trace);1133 return res;1134}1135 1136Bool IsLexExpression2Bin(CCmpCtrl *cc,U8 **_machine_code)1137{//Compile cc expression to bin. Return err status.1138 return ToBool(*_machine_code=LexExpression2Bin(cc));1139}1140 1141I64 LexExpressionI64(CCmpCtrl *cc)1142{//Compile cc expression, forcing to I64 and eval.1143 U8 *machine_code;1144 I64 res,type;1145 if (machine_code=LexExpression2Bin(cc,&type)) {1146 res=Call(machine_code);1147 Free(machine_code);1148 if (type==RT_F64)1149 res=ToI64(res(F64));1150 } else1151 res=0;1152 return res;1153}1154 1155F64 LexExpressionF64(CCmpCtrl *cc)1156{//Compile cc expression, forcing to F64 and eval.1157 U8 *machine_code;1158 I64 res,type;1159 if (machine_code=LexExpression2Bin(cc,&type)) {1160 res=Call(machine_code);1161 Free(machine_code);1162 if (type!=RT_F64)1163 res(F64)=ToF64(res);1164 } else1165 res=0;1166 return res(F64);1167}1168 1169I64 LexExpression(CCmpCtrl *cc)1170{//Compile cc expression and eval. Might be I64 or F64.1171 U8 *machine_code;1172 I64 res;1173 if (machine_code=LexExpression2Bin(cc)) {1174 res=Call(machine_code);1175 Free(machine_code);1176 } else1177 res=0;1178 return res;1179}1180 