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