CoolFace
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes838downloads
PrsVar.txt731 linesDownload Raw Back to Compiler
1 2U0 PrsVarInit(CCmpCtrl *cc,U8 **_dst,CHashClass *tmpc,CArrayDim *tmpad,3        U8 *data_addr_rip,U8 **_base,Bool data_heap,I64 pass)4{5  U8 *dst=*_dst,*machine_code;6  I64 i,j,r,old_flags,type,size;7  CMemberLst *tmpm;8  CIntermediateCode *tmpi;9  CAOTCtrl *aotc=cc->aotc;10  CAOTAbsAddr *tmpa;11  CAOTImportExport *tmpie;12  Bool is_str;13 14  tmpc=OptClassFwd(tmpc);15  if (tmpm=tmpc->member_lst_and_root) {16    if (cc->token!='{')17      LexExcept(cc,"Expecting '{' at ");18    LexPopNoRestore(cc);19    LexPush(cc);20    Lex(cc);21    while (tmpm) {22      PrsVarInit2(cc,&dst,tmpm->member_class,&tmpm->dim,23            data_addr_rip,_base,data_heap,pass);24      if (cc->token==',')25        Lex(cc);26      tmpm=tmpm->next;27    }28    LexPopNoRestore(cc);29    if (cc->token!='}')30      LexExcept(cc,"Missing '}' at ");31    Lex(cc);32  } else {33    if (tmpc->ptr_stars_cnt==1 &&34          ((tmpc-1)->raw_type==RT_I8 || (tmpc-1)->raw_type==RT_U8) &&35          !tmpad && cc->token==TK_STR)36      is_str=TRUE;37    else38      is_str=FALSE;39    if (cc->flags&CCF_AOT_COMPILE && is_str) {40      LexPopNoRestore(cc);41      machine_code=LexExtStr(cc,&i);42      if (pass==2) {43        tmpa=CAlloc(sizeof(CAOTAbsAddr));44        tmpa->next=aotc->abss;45        tmpa->type=AAT_ADD_U64;46        aotc->abss=tmpa;47        tmpa->rip=data_addr_rip+dst-*_base;48        *dst(I64 *)=aotc->rip;49        for (j=0;j<i;j++)50          AOTStoreCodeU8(cc,machine_code[j]);51      }52      Free(machine_code);53    } else {54      old_flags=cc->flags;55      cc->flags=CCF_NO_ABSS | cc->flags &56            ~(CCF_AOT_COMPILE|CCF_HAS_MISC_DATA|CCF_NOT_CONST);57      machine_code=LexExpression2Bin(cc,&type);58      if (old_flags&CCF_AOT_COMPILE &&59            cc->flags&CCF_NOT_CONST &&60            !Bt(&cc->opts,OPTf_GLBLS_ON_DATA_HEAP)) {61        cc->flags=cc->flags&~CCF_NO_ABSS|CCF_AOT_COMPILE;62        Free(machine_code);63        if (pass==2) {64          MemSet(dst,0,tmpc->size);65          LexPopRestore(cc);66          Lex(cc);67          COCPush(cc);68          COCInit(cc);69          ICAdd(cc,IC_ABS_ADDR,data_addr_rip,tmpc+1);70          ICAdd(cc,IC_IMM_I64,dst-*_base,tmpc+1);71          ICAdd(cc,IC_ADD,0,tmpc+1);72          if (!PrsExpression(cc,NULL,TRUE))73            throw('Compiler');74          tmpi=cc->coc.coc_head.last;75          if (tmpi->ic_code==IC_END_EXP) {76            tmpi->ic_code=IC_NOP1;77            tmpi->ic_flags=0;78          }79          ICAdd(cc,IC_ASSIGN,0,tmpc);80          ICAdd(cc,IC_END_EXP,0,tmpc,ICF_RES_NOT_USED);81          ICAdd(cc,IC_RET,0,0);82          if (machine_code=COCCompile(cc,&size,NULL,NULL)) {83            tmpie=CAlloc(sizeof(CAOTImportExport));84            tmpie->type=IET_MAIN;85            tmpie->rip=cc->aotc->rip;86            QueIns(tmpie,cc->aot->last_ie);87            for (i=0;i<size;i++)88              AOTStoreCodeU8(cc,machine_code[i]);89            Free(machine_code);90          }91          COCPop(cc);92        } else93          LexPopNoRestore(cc);94      } else {95        LexPopNoRestore(cc);96        if (!machine_code)97          throw('Compiler');98        r=Call(machine_code);99        if (!(cc->flags & CCF_HAS_MISC_DATA)||pass==1)100          Free(machine_code);101 102        if (type==RT_F64 &&103              tmpc->raw_type!=RT_F64)104          r=r(F64);105        else if (type!=RT_F64 &&106              tmpc->raw_type==RT_F64)107          r(F64)=r;108        MemCpy(dst,&r,tmpc->size);109      }110    }111    dst+=tmpc->size;112    cc->flags=cc->flags&113          ~CCF_NO_ABSS|old_flags&(CCF_HAS_MISC_DATA|CCF_AOT_COMPILE);114  }115  *_dst=dst;116}117 118class CVI2119{120  CVI2 *next,*last;121  U0 base;122};123 124U0 PrsVarInit2(CCmpCtrl *cc,U8 **_dst,CHashClass *tmpc,125        CArrayDim *tmpad,U8 *data_addr_rip,U8 **_base,Bool data_heap,I64 pass)126{127  I64 i,j,cnt;128  U8 *st,*_b;129  CVI2 head,*tmpvi,*tmpvi1;130  CArrayDim *tmpad1;131  tmpc=OptClassFwd(tmpc);132  if (tmpad1=tmpad->next) {133    if (!tmpc->ptr_stars_cnt &&134          (tmpc->raw_type==RT_I8 || tmpc->raw_type==RT_U8) &&135          cc->token==TK_STR) {136      LexPopNoRestore(cc);137      st=LexExtStr(cc,&i);138      if (tmpad1->cnt<0) {//[]139        tmpad1->cnt=i;140        tmpad->total_cnt=i*tmpad1->total_cnt;141        Free(*_base);142        if (data_heap)143          *_base=MAlloc(i);144        else145          *_base=MAlloc(i,Fs->code_heap);146        MemCpy(*_base,st,i);147        *_dst=*_base+i;148      } else {149        MemCpy(*_dst,st,tmpad1->cnt);150        *_dst+=tmpad1->cnt;151      }152      Free(st);153      LexPush(cc);154    } else {155      if (cc->token=='{') {156        LexPopNoRestore(cc);157        LexPush(cc);158        Lex(cc);159      }160      if (tmpad1->cnt<0) {//[]161        QueInit(&head);162        cnt=0;163        while (cc->token!='}') {164          tmpvi=MAlloc(offset(CVI2.base)+tmpad1->total_cnt*tmpc->size);165          _b=&tmpvi->base;166          PrsVarInit2(cc,&_b,tmpc,tmpad1,data_addr_rip,_base,data_heap,pass);167          QueIns(tmpvi,head.last);168          if (cc->token==',')169            Lex(cc);170          cnt++;171        }172        Lex(cc); //skip '}'173        tmpad1->cnt=cnt;174        tmpad->total_cnt=cnt*tmpad1->total_cnt;175        j=tmpad1->total_cnt*tmpc->size;176        i=cnt*j;177        Free(*_base);178        if (data_heap)179          *_base=_b=MAlloc(i);180        else181          *_base=_b=MAlloc(i,Fs->code_heap);182        tmpvi=head.next;183        while (tmpvi!=&head) {184          tmpvi1=tmpvi->next;185          MemCpy(_b,&tmpvi->base,j);186          _b+=j;187          Free(tmpvi);188          tmpvi=tmpvi1;189        }190        *_dst=_b;191      } else {192        for (i=0;i<tmpad1->cnt;i++) {193          PrsVarInit2(cc,_dst,tmpc,tmpad1,data_addr_rip,_base,data_heap,pass);194          if (tmpad1->cnt>1 && cc->token==',')195            Lex(cc);196        }197        if (cc->token=='}')198          Lex(cc);199      }200    }201  } else {202    PrsVarInit(cc,_dst,tmpc,tmpad1,data_addr_rip,_base,data_heap,pass);203    LexPush(cc);204  }205}206 207U0 PrsGlblInit(CCmpCtrl *cc,CHashGlblVar *tmpg,I64 pass)208{209  U8 *dst=tmpg->data_addr;210  PrsVarInit2(cc,&dst,tmpg->var_class,&tmpg->dim,211        tmpg->data_addr_rip,&tmpg->data_addr,212        Bt(&cc->opts,OPTf_GLBLS_ON_DATA_HEAP)||213        Bt(&cc->flags,CCf_AOT_COMPILE),pass);214}215 216U0 PrsStaticInit(CCmpCtrl *cc,CMemberLst *tmpm,I64 pass)217{218  U8 *machine_code,*dst=tmpm->static_data;219  CHashClass *tmpc=tmpm->member_class;220  I64 i,size;221  CAOTImportExport *tmpie;222 223  if (cc->flags&CCF_AOT_COMPILE && pass==2) {224    COCPush(cc);225    COCInit(cc);226  }227  PrsVarInit2(cc,&dst,tmpc,&tmpm->dim,tmpm->static_data_rip,228        &tmpm->static_data,Bt(&cc->flags,CCf_AOT_COMPILE),pass);229  if (cc->flags&CCF_AOT_COMPILE && pass==2) {230    if (cc->coc.coc_head.next!=&cc->coc.coc_head) {231      ICAdd(cc,IC_RET,0,0);232      if (machine_code=COCCompile(cc,&size,NULL,NULL)) {233        if (pass==2) {234          tmpie=CAlloc(sizeof(CAOTImportExport));235          tmpie->type=IET_MAIN;236          tmpie->rip=cc->aotc->rip;237          QueIns(tmpie,cc->aot->last_ie);238          for (i=0;i<size;i++)239            AOTStoreCodeU8(cc,machine_code[i]);240        }241        Free(machine_code);242      }243    } //TODO: else del misc?244    COCPop(cc);245  }246}247 248Bool PrsArrayDims(CCmpCtrl *cc,I64 mode,CArrayDim *dim)249{//Returns false on empty []250//dim->next!=0 for array251  CArrayDim *tmpad,*tmpad1;252  I64 j;253  Bool res=TRUE;254  dim->next=NULL;255  dim->cnt=0;256  dim->total_cnt=1;257  tmpad1=&dim->next;258  if (cc->token=='[') {259    if (mode.u8[1]==PRS1B_FUN_ARG)260      LexExcept(cc,"No arrays in fun args at ");261    do {262      if (Lex(cc)==']' && !dim->next) {263        j=-1;264        res=FALSE;265      } else {266        if ((j=LexExpressionI64(cc))<0)267          LexExcept(cc,"Invalid array size at ");268      }269      tmpad1=&dim->next;270      while (tmpad1->next) {271        tmpad1->next->total_cnt*=j;272        tmpad1=tmpad1->next;273      }274      tmpad=MAlloc(sizeof(CArrayDim));275      tmpad1->next=tmpad;276      tmpad1=tmpad;277      tmpad->next=NULL;278      tmpad->cnt=j;279      tmpad->total_cnt=1;280      dim->total_cnt*=j;281      if (cc->token!=']')282        LexExcept(cc,"Missing ']' at ");283    } while (Lex(cc)=='[');284  }285  return res;286}287 288CHashClass *PrsType(CCmpCtrl *cc,CHashClass **_tmpc1,289  I64 *_mode,CMemberLst *tmpm,U8 **_ident,CHashFun **_fun_ptr,290  CHashExport **_tmpex,CArrayDim *tmpad,I64 fsp_flags)291{292  I64 k,ptr_stars_cnt,mode=*_mode;293  CHashClass *tmpc1=*_tmpc1,*tmpc2;294  CHashFun *fun_ptr=NULL;295  CHashExport *tmpex=NULL;296  CArrayDim *tmpad2;297 298  pt_start:299  if (!tmpc1 || !(tmpc1->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))300    LexExcept(cc,"Invalid class at ");301 302  ptr_stars_cnt=0;303  while (cc->token=='*') {304    if (mode.u8[1]) {305      LexPopNoRestore(cc);306      LexPush(cc);307    }308    Lex(cc);309    tmpc1++;310    if (++ptr_stars_cnt>PTR_STARS_NUM)311      LexExcept(cc,"Too many *'s at ");312  }313 314  k=PrsKeyWord(cc);315  if (k==KW_UNION || k==KW_CLASS) {316    Lex(cc);317    tmpc2=PrsClass(cc,k,fsp_flags,mode&255==PRS0_EXTERN);318    tmpc2->fwd_class=tmpc1;319    tmpc1=tmpc2;320    if (_tmpc1) *_tmpc1=tmpc1;321    mode=PRS0_NULL|PRS1_NULL;322    goto pt_start;323  }324 325  if (cc->token=='(') {326    if (Lex(cc)!='*')327      LexExcept(cc,"Expecting '*' at ");328    ptr_stars_cnt=1; //fun_ptr329    while (Lex(cc)=='*')330      ptr_stars_cnt++; //fun_ptr331    if (ptr_stars_cnt>PTR_STARS_NUM)332      LexExcept(cc,"Too many *'s at ");333  } else334    ptr_stars_cnt=-1; //fun_ptr335 336  if (_ident) {337    if (cc->token==TK_IDENT) {338      tmpex=cc->hash_entry;339      *_ident=cc->cur_str;340      cc->cur_str=NULL;341      Lex(cc);342    } else {343      if (!mode.u8[1])344        *_ident=NULL;345      else if (cc->token==',' || cc->token==';' || cc->token==')') {346        tmpex=NULL;347        *_ident=StrNew("_anon_");348        tmpm->flags|=MLF_NO_UNUSED_WARN;349      } else350        LexExcept(cc,"Expecting identifier at ");351    }352  }353 354  if (ptr_stars_cnt>=0) { //fun_ptr355    if (cc->token!=')')356      LexExcept(cc,"Missing ')' at ");357    if (Lex(cc)!='(')358      LexExcept(cc,"Expecting '(' at ");359    fun_ptr=PrsFunJoin(cc,tmpc1,NULL,fsp_flags)+ptr_stars_cnt;360    tmpc1=cmp.internal_types[RT_PTR]+ptr_stars_cnt;361  }362  if (!PrsArrayDims(cc,mode,tmpad) && cc->token!='=') {363    tmpc1++;364    tmpad2=tmpad->next->next;365    Free(tmpad->next);366    tmpad->next=tmpad2;367  }368 369  tmpc2=OptClassFwd(tmpc1);370  if (tmpc2->ptr_stars_cnt) {371    tmpc2-=tmpc2->ptr_stars_cnt;372    if (tmpc2->type&HTT_INTERNAL_TYPE && !tmpc2->size)373      LexWarn(cc,"use \"U8 *\" instead of \"U0 *\" at ");374  }375 376  if (_mode)    *_mode=mode;377  if (_fun_ptr) *_fun_ptr=fun_ptr;378  if (_tmpex)   *_tmpex=tmpex;379  return tmpc1;380}381 382U0 PrsDotDotDot(CCmpCtrl *cc,CHashFun *tmpf,I64 _reg)383{384  CMemberLst *tmpm;385  CArrayDim *tmpad;386 387  Bts(&tmpf->flags,Ff_DOT_DOT_DOT);388 389  Lex(cc);390  tmpm=MemberLstNew(_reg);391  tmpm->flags=MLF_DOT_DOT_DOT;392  tmpm->member_class=cmp.internal_types[RT_I64];393  tmpm->str=StrNew("argc");394  tmpm->offset=tmpf->size;395  tmpm->size=8;396  tmpf->size+=8;397  MemberAdd(cc,tmpm,tmpf,PRS1B_FUN_ARG);398 399  tmpm=MemberLstNew(_reg);400  tmpm->flags=MLF_DOT_DOT_DOT;401  tmpm->member_class=cmp.internal_types[RT_I64];402  tmpm->str=StrNew("argv");403  tmpm->dim.total_cnt=127; //arbitrary404  tmpm->dim.next=tmpad=MAlloc(sizeof(CArrayDim));405  tmpad->next=NULL;406  tmpad->cnt=127; //arbitrary407  tmpad->total_cnt=1;408  tmpm->offset=tmpf->size;409  tmpm->size=8; //Close enough410  tmpf->size+=8;//Close enough411  MemberAdd(cc,tmpm,tmpf,PRS1B_FUN_ARG);412 413  if (cc->token==')')414    Lex(cc);415}416 417U0 PrsVarLst(CCmpCtrl *cc,CHashClass *tmpc,I64 mode,I64 union_base=0)418{419  I64 i,k,old_flags=cc->flags,old_flags2,type,_reg;420  CHashClass *tmpc1,*tmpc2;421  CHash *tmph;422  CMemberLst *tmpm;423  CMemberLstMeta *tmp_meta;424  U8 *machine_code;425  Bool undef_array_size,first;426  cc->flags|=CCF_DONT_MAKE_RES;427  if (mode.u8[1]==PRS1B_CLASS)428    cc->flags|=CCF_CLASS_DOL_OFFSET;429  if ((mode.u8[1]!=PRS1B_LOCAL_VAR && mode.u8[1]!=PRS1B_STATIC_LOCAL_VAR ||430        mode&PRSF_UNION) && (cc->token=='(' || cc->token=='{'))431    Lex(cc);432  while (TRUE) {433    if (mode&PRSF_UNION)434      cc->class_dol_offset=union_base;435    else436      cc->class_dol_offset=tmpc->size;437    while (cc->token==';')438      Lex(cc);439    while (cc->token=='$') {440      if (Lex(cc)!='=') //skip $441        LexExcept(cc,"Expecting '=' at ");442      Lex(cc); //skip =443      cc->class_dol_offset=LexExpression(cc);444      if (-cc->class_dol_offset>tmpc->neg_offset)445        tmpc->neg_offset=-cc->class_dol_offset;446      if (mode&PRSF_UNION)447        union_base=cc->class_dol_offset;448      else449        tmpc->size=cc->class_dol_offset;450      if (cc->token!=';')451        LexExcept(cc,"Missing ';' at");452      Lex(cc); //skip ;453    }454    if (cc->token==')' || cc->token=='}') {455      Lex(cc);456      goto pvl_done;457    }458    _reg=REG_UNDEF;459pvl_restart1:460    switch (PrsKeyWord(cc)) {461      case KW_REG:462        _reg=REG_ALLOC;463        if (Lex(cc)==TK_IDENT) {464          k=DefineMatch(cc->cur_str,"ST_U64_REGS");465          if (k>=0) {466            _reg=k;467            Lex(cc);468          }469        }470        goto pvl_restart1;471      case KW_NOREG:472        _reg=REG_NONE;473        Lex(cc);474        goto pvl_restart1;475    }476 477    if (cc->token==TK_ELLIPSIS && mode.u8[1]==PRS1B_FUN_ARG) {478      PrsDotDotDot(cc,tmpc,_reg);479      goto pvl_done;480    }481    if (cc->token==TK_IDENT)482      tmph=cc->hash_entry;483    else484      tmph=NULL;485    if (!tmph)486      LexExcept(cc,"Expecting type at ");487    k=PrsKeyWord(cc);488    if (k==KW_UNION) {489      Lex(cc);490      PrsVarLst(cc,tmpc,mode|PRSF_UNION,tmpc->size);491    } else {492      if (!(tmph->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))493        LexExcept(cc,"Expecting type at ");494      first=TRUE;495pvl_restart2:496      tmpc1=tmph;497      LexPush(cc);498      Lex(cc); //skip type or ','499      tmpm=MemberLstNew(_reg);500      _reg=REG_UNDEF;501      if (mode.u8[1]==PRS1B_STATIC_LOCAL_VAR) {502        tmpm->flags|=MLF_STATIC;503        tmpm->reg=REG_NONE;504      }505      if (mode.u8[1]==PRS1B_FUN_ARG || mode.u8[1]==PRS1B_LOCAL_VAR) {506pvl_restart3:507        switch (PrsKeyWord(cc)) {508          case KW_REG:509            tmpm->reg=REG_ALLOC;510            LexPopNoRestore(cc);511            LexPush(cc);512            if (Lex(cc)==TK_IDENT) {513              k=DefineMatch(cc->cur_str,"ST_U64_REGS");514              if (k>=0) {515                tmpm->reg=k;516                LexPopNoRestore(cc);517                LexPush(cc);518                Lex(cc);519              }520            }521            goto pvl_restart3;522          case KW_NOREG:523            tmpm->reg=REG_NONE;524            LexPopNoRestore(cc);525            LexPush(cc);526            Lex(cc);527            goto pvl_restart3;528        }529      }530      tmpm->member_class=PrsType(cc,&tmpc1,&mode,tmpm,&tmpm->str,531            &tmpm->fun_ptr,NULL,&tmpm->dim,0);532      if (tmpm->fun_ptr)533        tmpm->flags|=MLF_FUN;534      if (first)535        MemberAdd(cc,tmpm,tmpc,mode.u8[1]);536      else537        MemberAdd(cc,tmpm,tmpc,PRS1B_NULL);538      tmpc->member_cnt++;539 540      tmpc2=tmpm->member_class;541      i=tmpc2->size*tmpm->dim.total_cnt;542      switch (mode.u8[1]) {543        case PRS1B_STATIC_LOCAL_VAR:544          if (i<0) {545            i=0;546            undef_array_size=TRUE;547          } else548            undef_array_size=FALSE;549          if (mode&PRSF_UNION)550            LexExcept(cc,"Static unions are not implemented ");551          k=(i+7)&~7;552          if (cc->flags&CCF_AOT_COMPILE)553            tmpm->static_data=MAlloc(k);554          else555            tmpm->static_data=MAlloc(k,Fs->code_heap);556          if (cc->flags&CCF_AOT_COMPILE)        {557            tmpm->static_data_rip=cc->aotc->rip;558            k>>=3;559            while (k--)560              AOTStoreCodeU64(cc,0);561          } else562            if (sys_var_init_flag)563              MemSet(tmpm->static_data,sys_var_init_val,k);564          LexPopNoRestore(cc);565          if (cc->token=='=') {566            cc->flags=cc->flags&567                  ~CCF_DONT_MAKE_RES|old_flags&CCF_DONT_MAKE_RES;568            if (undef_array_size) {569              LexPush(cc);570              LexPush(cc);571              Lex(cc); //skip =572              PrsStaticInit(cc,tmpm,1);573              LexPopNoRestore(cc);574              i=tmpc2->size*tmpm->dim.total_cnt;575              k=(i+7)&~7;576              if (cc->flags&CCF_AOT_COMPILE)    {577                k>>=3;578                while (k--)579                  AOTStoreCodeU64(cc,0);580              } else581                if (sys_var_init_flag)582                  MemSet(tmpm->static_data,sys_var_init_val,k);583              LexPopRestore(cc);584            }585            LexPush(cc);586            Lex(cc); //skip =587            PrsStaticInit(cc,tmpm,2);588            LexPopNoRestore(cc);589            if (cc->flags&CCF_AOT_COMPILE)590              for (k=0;k<i;k++)591                AOTStoreCodeU8At(cc,tmpm->static_data_rip+k,592                      tmpm->static_data[k]);593            tmpm->use_cnt=0;594            cc->flags|=CCF_DONT_MAKE_RES;595          }596          if (cc->flags&CCF_AOT_COMPILE)597            Free(tmpm->static_data);598          break;599        case PRS1B_LOCAL_VAR:600          if (mode&PRSF_UNION) {601            if (union_base-tmpc->size<i)602              i=union_base-i-tmpc->size;603            else604              i=0;605          }606          if (i>=8)607            tmpc->size=(tmpc->size-i)&~7;608          else if (i>=4)609            tmpc->size=(tmpc->size-i)&~3;610          else if (i>=2)611            tmpc->size=(tmpc->size-i)&~1;612          else613            tmpc->size-=i;614          tmpm->offset=tmpc->size;615          tmpm->size=i;616          if (cc->token=='=') {617            cc->flags=cc->flags&~CCF_DONT_MAKE_RES|618                  old_flags&CCF_DONT_MAKE_RES;619            LexPopRestore(cc);620            Lex(cc);621            if (!PrsExpression(cc,NULL,TRUE))622              throw('Compiler');623            tmpm->use_cnt=0;624            cc->flags|=CCF_DONT_MAKE_RES;625          } else626            LexPopNoRestore(cc);627          break;628        case PRS1B_FUN_ARG:629          if (mode&PRSF_UNION) {630            tmpm->offset=union_base;631            if (tmpc->size-union_base<8)632              tmpc->size=8+union_base;633          } else {634            tmpm->offset=tmpc->size;635            tmpc->size+=8;636          }637          tmpm->size=8;638          if (cc->token=='=') {639            Lex(cc);640            if (PrsKeyWord(cc)==KW_LASTCLASS) {641              tmpm->flags|=MLF_LASTCLASS;642              Lex(cc);643            } else {644              old_flags2=cc->flags;645              cc->flags&=~CCF_HAS_MISC_DATA;646              machine_code=LexExpression2Bin(cc,&type);647              if (!machine_code)648                throw('Compiler');649              tmpm->dft_val=Call(machine_code);650              tmpc2=OptClassFwd(tmpc2);651              if (tmpc2->raw_type==RT_F64) {652                if (type!=RT_F64)653                  tmpm->dft_val(F64)=tmpm->dft_val;654              } else {655                if (type==RT_F64)656                  tmpm->dft_val=tmpm->dft_val(F64);657              }658              if (cc->flags & CCF_HAS_MISC_DATA) {659                tmpm->dft_val=StrNew(tmpm->dft_val);660                tmpm->flags|=MLF_STR_DFT_AVAILABLE;661              }662              Free(machine_code);663              cc->flags|=old_flags2&CCF_HAS_MISC_DATA;664            }665            tmpm->flags|=MLF_DFT_AVAILABLE;666          }667          LexPopNoRestore(cc);668          break;669        case PRS1B_CLASS:670          if (mode&PRSF_UNION) {671            tmpm->offset=union_base;672            if (tmpc->size-union_base<i)673              tmpc->size=i+union_base;674          } else {675            tmpm->offset=tmpc->size;676            tmpc->size+=i;677          }678          tmpm->size=i;679          if (mode&PRSF_UNION)680            cc->class_dol_offset=union_base;681          else682            cc->class_dol_offset=tmpc->size;683 684          while (cc->token==TK_IDENT) {685            tmp_meta=MAlloc(sizeof(CMemberLstMeta));686            tmp_meta->next=tmpm->meta;687            tmpm->meta=tmp_meta;688            tmp_meta->str=cc->cur_str;689            tmp_meta->flags=0;690            cc->cur_str=NULL;691            if (Lex(cc)==TK_STR) {692              tmp_meta->user_data=LexExtStr(cc);693              tmp_meta->flags|=MLMF_IS_STR;694            } else695              tmp_meta->user_data=LexExpression(cc);696          }697          LexPopNoRestore(cc);698          break;699      }700      switch (cc->token) {701        case ',':702          if (mode.u8[1]==PRS1B_FUN_ARG && !(mode&PRSF_UNION))703            Lex(cc);704          else {705            first=FALSE;706            goto pvl_restart2;707          }708          break;709        case ')':710        case '}':711          Lex(cc);712          goto pvl_done;713        case ';':714          cc->flags=cc->flags&~CCF_DONT_MAKE_RES|715                old_flags&CCF_DONT_MAKE_RES;716          Lex(cc);717          cc->flags|=CCF_DONT_MAKE_RES;718          if ((mode.u8[1]==PRS1B_LOCAL_VAR||mode.u8[1]==719                PRS1B_STATIC_LOCAL_VAR) && !(mode&PRSF_UNION))720            goto pvl_done;721          break;722        default:723          LexExcept(cc,"Missing ';' at");724      }725    }726  }727pvl_done:728  cc->flags=cc->flags&~(CCF_CLASS_DOL_OFFSET|CCF_DONT_MAKE_RES)|729        old_flags&(CCF_CLASS_DOL_OFFSET|CCF_DONT_MAKE_RES);730}731