Changeset 51 in dev for BasicCompiler64


Ignore:
Timestamp:
Feb 10, 2007, 8:30:19 PM (18 years ago)
Author:
dai_9181
Message:

ppobj_Member及びppobj_StaticMemberを廃止し、vectorに統一した(methods及びstaticMethods)。

Location:
BasicCompiler64
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/CParameter.cpp

    r50 r51  
    9696
    9797            //call destructor
    98             int i5 = types[i2].u.pobj_Class->DestructorMemberSubIndex;
    99             if( i5 != -1 ){
    100                 op_call( types[i2].u.pobj_Class->ppobj_Method[i5]->psi );
     98            CMethod *method = types[i2].u.pobj_Class->GetDestructorMethod();
     99            if( method ){
     100                op_call( method->psi );
    101101            }
    102102
     
    138138        CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex);
    139139
    140         if(pobj_Class->CopyConstructorMemberSubIndex!=-1&&
    141             CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){
     140        if( pobj_Class->GetCopyConstructorMethod()
     141            && CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){
    142142            ////////////////////////////////////
    143143            // コピーコンストラクタを呼び出す
     
    160160
    161161            //call constructor
    162             op_call(pobj_Class->ppobj_Method[pobj_Class->CopyConstructorMemberSubIndex]->psi);
     162            op_call(pobj_Class->GetCopyConstructorMethod()->psi);
    163163
    164164
     
    168168        }
    169169        else{
    170             if(pobj_Class->ConstructorMemberSubIndex!=-1){
     170            if( pobj_Class->GetConstructorMethod() ){
    171171                ////////////////////////////////
    172172                // コンストラクタを呼び出す
     
    177177
    178178                //call constructor
    179                 op_call(pobj_Class->ppobj_Method[pobj_Class->ConstructorMemberSubIndex]->psi);
     179                op_call(pobj_Class->GetConstructorMethod()->psi);
    180180            }
    181181
  • BasicCompiler64/Compile_CallProc.cpp

    r50 r51  
    9797
    9898void Opcode_CallProc(char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){
    99     int i,i2;
     99    int i2;
    100100
    101101    if(psi->dwType==SUBTYPE_MACRO){
     
    348348        op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
    349349
    350         for(i=0,i2=0;i<pobj_c->iMethodNum;i++){
    351             if(pobj_c->ppobj_Method[i]->psi==psi) break;
    352             if(pobj_c->ppobj_Method[i]->psi->bVirtual) i2++;
    353         }
     350        i2 = pobj_c->GetFuncNumInVtbl( psi );
    354351
    355352        //call qword ptr[r11+func_index]
  • BasicCompiler64/Compile_Func.cpp

    r50 r51  
    172172        op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
    173173
    174         int i,i2;
    175         for(i=0,i2=0;i<pobj_c->iMethodNum;i++){
    176             if(pobj_c->ppobj_Method[i]->psi==psi) break;
    177             if(pobj_c->ppobj_Method[i]->psi->bVirtual) i2++;
    178         }
     174        int i2 = pobj_c->GetFuncNumInVtbl( psi );
    179175
    180176        //mov rax,qword ptr[r11+func_index]
  • BasicCompiler64/Compile_Object.cpp

    r50 r51  
    198198
    199199
    200     i2=pobj_c->DestructorMemberSubIndex;
    201     if(i2==-1) return 0;
     200    CMethod *method = pobj_c->GetDestructorMethod();
     201    if( method == NULL ) return 0;
    202202
    203203    //mov rcx,DestructorProcAddr
    204204    op_mov_RV(sizeof(_int64),REG_RCX,0);
    205205    obp-=sizeof(long);
    206     pobj_SubAddrSchedule->add(pobj_c->ppobj_Method[i2]->psi,0);
    207     pobj_c->ppobj_Method[i2]->psi->bUse=1;
     206    pobj_SubAddrSchedule->add(method->psi,0);
     207    method->psi->bUse=1;
    208208    obp+=sizeof(long);
    209209
  • BasicCompiler64/Compile_ProcOp.cpp

    r50 r51  
    209209    extern SUBINFO **ppSubHash;
    210210    extern BOOL bDebugCompile;
    211     int i3,i4,i5,VarSize,BufferSize;
     211    int i3,i4,VarSize,BufferSize;
    212212    char temporary[VN_SIZE];
    213213
     
    466466        if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){
    467467            //戻り値用オブジェクトのコンストラクタを呼び出す
    468             if(psi->u.Return_pobj_c->ConstructorMemberSubIndex!=-1){
     468            if( psi->u.Return_pobj_c->GetConstructorMethod() ){
    469469                sprintf(temporary,"%s.%s()",temp,psi->u.Return_pobj_c->name);
    470470                OpcodeOthers(temporary);
     
    517517            BOOL bThisIsSuperClass;
    518518            if(pobj_CompilingClass->pobj_InheritsClass==0) bThisIsSuperClass=1;
    519             else if(pobj_CompilingClass->pobj_InheritsClass->ConstructorMemberSubIndex==-1){
     519            else if( pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod() == NULL ){
    520520                //インターフェイスを継承したときはコンストラクタを持たない
    521521                bThisIsSuperClass=1;
     
    552552                    RemoveStringPare(temporary);
    553553
    554                     i3=pobj_CompilingClass->pobj_InheritsClass->ConstructorMemberSubIndex;
    555554                    Opcode_CallProc(temporary,
    556                         pobj_CompilingClass->ppobj_Method[i3]->psi,
     555                        pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->psi,
    557556                        0,
    558557                        "",
     
    561560                else{
    562561                    //基底クラスのコンストラクタを暗黙的に呼び出す
    563                     i3=pobj_CompilingClass->pobj_InheritsClass->ConstructorMemberSubIndex;
    564562                    Opcode_CallProc("",
    565                         pobj_CompilingClass->ppobj_Method[i3]->psi,
     563                        pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->psi,
    566564                        0,
    567565                        "",
     
    588586
    589587                if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){
    590                     if(pMember->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex!=-1){
    591                         i5=pMember->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex;
    592                         if(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi->RealParmNum==1){  //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる
     588                    CMethod *method = pMember->TypeInfo.u.pobj_Class->GetConstructorMethod();
     589                    if( method ){
     590                        if( method->psi->RealParmNum == 1 ){    //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる
    593591                            for(i4=0;i4<MemberObjectNum;i4++){
    594592                                //Thisポインタをrcxにコピー
     
    599597
    600598                                //call constructor
    601                                 op_call(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);
     599                                op_call( method->psi );
    602600                            }
    603601                        }
     
    662660                    基底クラスのデストラクタを呼び出す */
    663661
    664                 i3=pobj_CompilingClass->pobj_InheritsClass->DestructorMemberSubIndex;
    665                 if(i3!=-1){
     662                CMethod *method = pobj_CompilingClass->pobj_InheritsClass->GetDestructorMethod();
     663                if( method ){
    666664                    Opcode_CallProc("",
    667                         pobj_CompilingClass->ppobj_Method[i3]->psi,
     665                        method->psi,
    668666                        0,
    669667                        "",
     
    689687
    690688                if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){
    691                     if(pMember->TypeInfo.u.pobj_Class->DestructorMemberSubIndex!=-1){
     689                    CMethod *method = pMember->TypeInfo.u.pobj_Class->GetDestructorMethod();
     690                    if( method ){
    692691                        for(i4=MemberObjectNum-1;i4>=0;i4--){
    693692                            //Thisポインタをrcxにコピー
     
    698697
    699698                            //call destructor
    700                             i5=pMember->TypeInfo.u.pobj_Class->DestructorMemberSubIndex;
    701                             op_call(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);
     699                            op_call(method->psi);
    702700                        }
    703701                    }
  • BasicCompiler64/MakePeHdr.cpp

    r42 r51  
    10591059    // プロシージャポインタスケジュール
    10601060    for(i=0;i<pobj_SubAddrSchedule->num;i++){
     1061        if(pobj_SubAddrSchedule->ppsi[i]->CompileAddress==0
     1062            &&pobj_SubAddrSchedule->ppsi[i]->EndOpAddr==0){
     1063            SetError(300,NULL,-1);
     1064        }
     1065
    10611066        if(pobj_SubAddrSchedule->pbCall[i]){
    10621067            *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
  • BasicCompiler64/NumOpe.cpp

    r49 r51  
    3535
    3636        //call constructor
    37         op_call(pobj_StringClass->ppobj_Method[pobj_StringClass->ConstructorMemberSubIndex]->psi);
     37        op_call(pobj_StringClass->GetConstructorMethod()->psi);
    3838
    3939        int i2;
  • BasicCompiler64/OperatorProc.cpp

    r50 r51  
    1010    ////////////////////////////////////////////////
    1111
    12     if(pobj_c->DestructorMemberSubIndex!=-1){
     12    CMethod *method = pobj_c->GetDestructorMethod();
     13    if( method ){
    1314        //mov rcx,reg
    1415        op_mov_RR(REG_RCX,reg);
    1516
    1617        //call DestructorProcAddr
    17         op_call(pobj_c->ppobj_Method[pobj_c->DestructorMemberSubIndex]->psi);
     18        op_call( method->psi );
    1819    }
    1920
     
    294295
    295296        if(bCalcUseHeap){
    296             /*
    297             //未解放のインスタンスが存在する場合
    298             //※専用のローカル変数を用意し、メモリリークを回避
    299             char temporary[VN_SIZE],temp2[VN_SIZE];
    300 
    301 
    302             ////////////////////////////////
    303             // 一時オブジェクト変数を用意
    304             ////////////////////////////////
    305             char szTempVarName[255];
    306             GetTypeName(CalcType,lpCalcIndex,temp2);
    307             sprintf(szTempVarName,"_System_strDummy%d",obp);
    308             wsprintf(temporary,"%s%c%c%s",szTempVarName,1,ESC_AS,temp2);
    309             InsertDimStatement_ToProcHead(temporary);
    310 
    311             RELATIVE_VAR VarRelativeVar;
    312             int VarType;
    313             LONG_PTR lpVarIndex;
    314             if(!GetVarOffsetReadOnly(
    315                 szTempVarName,
    316                 &VarType,
    317                 &VarRelativeVar,
    318                 &lpVarIndex)) return;
    319 
    320 
    321             CClass *pobj_c;
    322             pobj_c=(CClass *)lpCalcIndex;
    323             if(pobj_c->DestructorMemberSubIndex!=-1){
    324 
    325                 //////////////////////////////////////////////////////
    326                 /////    レジスタ資源のバックアップ
    327                 {   BACKUP_REGISTER_RESOURCE
    328                 //////////////////////////////////////////////////////
    329 
    330                     //ループの場合、古い一時オブジェクトのデストラクタを呼ぶ
    331 
    332                     //rcxに変数アドレスをコピー
    333                     SetVarPtrToReg(REG_RCX,&VarRelativeVar);
    334 
    335                     //call destructor
    336                     OpBuffer[obp++]=(char)0xE8;
    337                     pobj_SubAddrSchedule->add(pobj_c->ppobj_Method[pobj_c->DestructorMemberSubIndex]->psi,1);
    338                     obp+=sizeof(long);
    339 
    340                 /////////////////////////////////////////////
    341                 //////   レジスタ資源を復元
    342                     RESTORE_REGISTER_RESOURCE
    343                 }////////////////////////////////////////////
    344             }
    345 
    346             //mov r15,reg
    347             op_mov_RR(REG_R15,reg);
    348 
    349 
    350             int object_size;
    351             object_size=GetSizeOfClass((CClass *)lpVarIndex);
    352 
    353             //mov rcx,object_size
    354             op_mov_RV(sizeof(_int64),REG_RCX,object_size);
    355 
    356             //rdiに変数アドレスをコピー
    357             SetVarPtrToReg(REG_RDI,&VarRelativeVar);
    358 
    359             //mov rsi,reg
    360             op_mov_RR(REG_RSI,reg);
    361 
    362             //mov r14,rdi
    363             op_mov_RR(REG_R14,REG_RDI);
    364             pobj_BlockReg->lock(REG_R14);
    365 
    366             //rep movs byte ptr[rdi],byte ptr[rsi]
    367             op_rep_movs(sizeof(BYTE));
    368 
    369             //////////////////////////////////////////////////////
    370             /////    レジスタ資源のバックアップ
    371             {   BACKUP_REGISTER_RESOURCE
    372             //////////////////////////////////////////////////////
    373 
    374                 //mov rcx,r15
    375                 op_mov_RR(REG_RCX,REG_R15);
    376 
    377                 //call free
    378                 extern SUBINFO *pSub_free;
    379                 OpBuffer[obp++]=(char)0xE8;
    380                 pobj_SubAddrSchedule->add(pSub_free,1);
    381                 obp+=sizeof(long);
    382 
    383             /////////////////////////////////////////////
    384             //////   レジスタ資源を復元
    385                 RESTORE_REGISTER_RESOURCE
    386             }////////////////////////////////////////////
    387 
    388 
    389             //mov reg,r14
    390             op_mov_RR(reg,REG_R14);
    391 
    392             pobj_BlockReg->unlock(REG_R14);
    393             */
    394 
    395297            //未解放のインスタンスが存在する旨を示す警告
    396298            SetError(-105,NULL,cp);
    397 
    398299        }
    399300
Note: See TracChangeset for help on using the changeset viewer.