Changeset 64 in dev for BasicCompiler64/Compile_ProcOp.cpp
- Timestamp:
- Mar 8, 2007, 2:49:34 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/Compile_ProcOp.cpp
r63 r64 51 51 52 52 //add rsp,スタックフレームサイズ 53 op_add 64_value(REG_RSP,pobj_sf->GetFrameSize());53 op_add_RV(REG_RSP,pobj_sf->GetFrameSize()); 54 54 55 55 //スタックフレームスケジュール(subコマンドに渡す値) … … 94 94 95 95 //add rsp,スタックフレームサイズ 96 op_add 64_value(REG_RSP,pobj_sf->GetFrameSize());96 op_add_RV(REG_RSP,pobj_sf->GetFrameSize()); 97 97 98 98 //スタックフレームスケジュール(subコマンドに渡す値) … … 118 118 119 119 //add rsp,8 120 op_add 64_value(REG_RSP,0x8);120 op_add_RV(REG_RSP,0x8); 121 121 122 122 //ret … … 128 128 129 129 //add rax,PTR_SIZE 130 op_add 64_value(REG_RAX,PTR_SIZE);130 op_add_RV(REG_RAX,PTR_SIZE); 131 131 132 132 //ret … … 337 337 338 338 LocalVar[MaxLocalVarNum].type=psi->pRealParmInfo[i3].type; 339 if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT){ 340 if(psi->bExport) 341 SetError(24,NULL,cp); 339 if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT 340 ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){ 341 if(psi->bExport) 342 SetError(24,NULL,cp); 342 343 } 343 344 344 345 LocalVar[MaxLocalVarNum].u.index=psi->pRealParmInfo[i3].u.index; 345 346 346 if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_ OBJECT){347 // 実態オブジェクトのByValパラメータ347 if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_STRUCT){ 348 //構造体のByValパラメータ 348 349 LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER; 349 350 VarSize=PTR_SIZE; … … 457 458 BaseLocalVar=AllLocalVarSize; 458 459 459 if(psi->ReturnType!= -1){460 if(psi->ReturnType!=DEF_NON){ 460 461 //戻り値が存在するとき 461 462 … … 464 465 else temp=psi->name; 465 466 466 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){ 467 //戻り値用オブジェクトのコンストラクタを呼び出す 468 if( psi->u.Return_pobj_c->GetConstructorMethod() ){ 469 sprintf(temporary,"%s.%s()",temp,psi->u.Return_pobj_c->name); 470 OpcodeOthers(temporary); 471 } 467 if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){ 468 //戻り値用の構造体(値型)はパラメータで引き渡される 472 469 } 473 470 else{ … … 493 490 494 491 //mov rcx,rsp 495 op_mov 64_ToReg_FromReg(REG_RCX,REG_RSP);492 op_mov_RR(REG_RCX,REG_RSP); 496 493 497 494 //add rcx,スタックフレームサイズ+sizeof(_int64) ※ret用のサイズを考慮 498 op_add 64_value(REG_RCX,0);495 op_add_RV(REG_RCX,0); 499 496 RspOffsetSchedule2=obp-sizeof(long); 500 497 … … 571 568 for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){ 572 569 CMember *pMember = pobj_CompilingClass->ppobj_Member[i3]; 573 int MemberTypeSize= 574 GetTypeSize(pMember->TypeInfo.type, 575 pMember->TypeInfo.u.lpIndex); 576 577 int MemberObjectNum= 578 JumpSubScripts(pMember->SubScripts); 579 580 int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL ); 581 582 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){ 583 CMethod *method = pMember->TypeInfo.u.pobj_Class->GetConstructorMethod(); 584 if( method ){ 585 if( method->psi->RealParmNum == 1 ){ //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる 586 for(i4=0;i4<MemberObjectNum;i4++){ 587 //Thisポインタをrcxにコピー 588 SetThisPtrToReg(REG_RCX); 589 590 //add rcx,offset 591 op_add64_value(REG_RCX,offset+i4*MemberTypeSize); 592 593 //call constructor 594 op_call( method->psi ); 595 } 596 } 597 } 570 if(pMember->TypeInfo.type==DEF_OBJECT){ 571 // オブジェクトメンバを発見したとき 572 573 sprintf(temporary, "This.%s=%c%c%s()", 574 pMember->name, 575 1, ESC_NEW, 576 pMember->TypeInfo.u.pobj_Class->name ); 577 OpcodeCalc( temporary ); 598 578 } 599 579 } … … 665 645 } 666 646 667 //実体クラスを持つメンバのデストラクタを呼び出す 647 //実体クラスを持つメンバのデストラクタ呼び出しはGCに任せる 648 /* 668 649 //※コンストラクタと逆順序で呼び出す 669 650 for(i3=pobj_CompilingClass->iMemberNum-1;i3>=0;i3--){ … … 678 659 int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL ); 679 660 680 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){661 if(pMember->TypeInfo.type==DEF_OBJECT){ 681 662 CMethod *method = pMember->TypeInfo.u.pobj_Class->GetDestructorMethod(); 682 663 if( method ){ … … 686 667 687 668 //add rcx,offset 688 op_add 64_value(REG_RCX,offset+i4*MemberTypeSize);669 op_add_RV(REG_RCX,offset+i4*MemberTypeSize); 689 670 690 671 //call destructor … … 693 674 } 694 675 } 695 } 676 }*/ 696 677 } 697 678 } … … 743 724 } 744 725 745 if(psi->ReturnType!= -1){726 if(psi->ReturnType!=DEF_NON){ 746 727 ////////////////////////////////// 747 728 // 戻り値をraxまたはxmm0に設定 … … 759 740 i3=psi->ReturnType; 760 741 761 if(i3==DEF_OBJECT ){742 if(i3==DEF_OBJECT || i3==DEF_STRUCT){ 762 743 SetVarPtrToReg(REG_RAX,&RelativeVar); 744 if( i3==DEF_OBJECT ){ 745 //mov rax,qword ptr[rax] 746 op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE ); 747 } 763 748 } 764 749 else if(i3==DEF_DOUBLE){
Note:
See TracChangeset
for help on using the changeset viewer.