CoolFace
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes838downloads
PrsExp.txt1180 linesDownload Raw Back to Compiler
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