Changeset 370 in dev for trunk/abdev/BasicCompiler32


Ignore:
Timestamp:
Nov 15, 2007, 3:18:41 AM (17 years ago)
Author:
dai_9181
Message:

COM修飾子に対応。COMインターフェイスを呼び出せるようにした

Location:
trunk/abdev/BasicCompiler32
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_CallProc.cpp

    r350 r370  
    326326        if( pobj_c->IsInterface() )
    327327        {
    328             // インターフェイスメソッド呼び出し
     328            // インターフェイス メソッド呼び出し
    329329
    330330            int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" );
     
    349349                SetError();
    350350            }
     351        }
     352        else if( pobj_c->IsComInterface() )
     353        {
     354            // COMインターフェイス メソッド呼び出し
     355
     356            //仮想関数(オブジェクトメソッド)呼び出し
     357            // pObj -> vtbl1 -> func1
     358            //               -> func2
     359            //               -> func3
     360
     361            int vtblMasterListIndex;
     362            pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
     363
     364            // vtblのポインタを取得
     365            //mov edx,dword ptr[ecx]
     366            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
    351367        }
    352368        else
     
    364380
    365381            // vtblマスターリストのポインタを取得
    366             //mov edx,dword ptr[ecx]
    367             compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
     382            //mov edx,dword ptr[ecx+sizeof(com_vtbl)]
     383            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, PTR_SIZE, MOD_BASE_DISP8 );
    368384           
    369385            // vtblのポインタを取得
  • trunk/abdev/BasicCompiler32/Compile_Func.cpp

    r359 r370  
    300300            }
    301301        }
     302        else if( pobj_c->IsComInterface() )
     303        {
     304            // COMインターフェイス メソッド呼び出し
     305
     306            //仮想関数(オブジェクトメソッド)呼び出し
     307            // pObj -> vtbl1 -> func1
     308            //               -> func2
     309            //               -> func3
     310
     311            int vtblMasterListIndex;
     312            pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
     313
     314            // vtblのポインタを取得
     315            //mov edx,dword ptr[ecx]
     316            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
     317        }
    302318        else
    303319        {
     
    314330
    315331            // vtblマスターリストのポインタを取得
    316             //mov edx,dword ptr[ecx]
    317             compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
     332            //mov edx,dword ptr[ecx+sizeof(com_vtbl)]
     333            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, PTR_SIZE, MOD_BASE_DISP8 );
    318334           
    319335            // vtblのポインタを取得
  • trunk/abdev/BasicCompiler32/Compile_Object.cpp

    r355 r370  
    218218        && !pClass->IsAbstract() )
    219219    {
    220         // mov ecx,vtblAddress
    221         compiler.codeGenerator.op_mov_RV_vtbl( REG_ECX, pClass );
     220        // mov ecx,com_vtbl
     221        compiler.codeGenerator.op_mov_RV_com_vtbl( REG_ECX, pClass );
    222222
    223223        //mov dword ptr[eax],ecx
    224224        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
     225
     226        // mov rcx,vtblAddress
     227        compiler.codeGenerator.op_mov_RV_vtbl( REG_ECX, pClass );
     228
     229        //mov qword ptr[rax+sizeof(com_vtbl)],rcx
     230        compiler.codeGenerator.op_mov_MR(sizeof(long),REG_ECX,REG_EAX,PTR_SIZE,MOD_BASE_DISP8);
    225231
    226232        // 仮想関数になるメソッドに使用チェックをつける
  • trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp

    r365 r370  
    267267        char temporary[1024];
    268268        sprintf( temporary,
    269             "Return New %s(ObjPtr( This ),Get_LONG_PTR( (Get_LONG_PTR( ObjPtr(This) ) + SizeOf(LONG_PTR)*%d) As VoidPtr ) As VoidPtr )",
     269            "Return New %s(ObjPtr( This ),Get_LONG_PTR( (Get_LONG_PTR( ObjPtr(This)+SizeOf(VoidPtr) ) + SizeOf(LONG_PTR)*%d) As VoidPtr ) As VoidPtr )",
    270270            userProc.ReturnType().GetClass().GetName().c_str(),
    271271            vtblMasterListIndex
  • trunk/abdev/BasicCompiler32/Compile_Statement.cpp

    r342 r370  
    115115            FreeTempObject(REG_EBX,&resultType.GetClass());
    116116        }
    117 
    118         //成功
    119         return;
    120     }
    121 
    122     // 失敗
    123     SetError(1, NULL,cp);
     117    }
    124118}
    125119
  • trunk/abdev/BasicCompiler32/Compile_Var.cpp

    r350 r370  
    12151215    //New呼び出し
    12161216    if( type.IsObject()
    1217         && !type.IsInterface()
     1217        && !type.IsInterface() &&  !type.IsComInterface()
    12181218        &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0
    12191219        &&InitBuf[0]=='\0')
  • trunk/abdev/BasicCompiler32/NumOpe.cpp

    r363 r370  
    278278    }
    279279
     280    SetError();
     281
    280282    return false;
    281283}
     
    331333        if( !leftType.HasMember() ){
    332334            // メンバを持たない型の場合
     335            if( isProcedureCallOnly )
     336            {
     337                SetError(1,NULL,cp);
     338            }
    333339            return false;
    334340        }
     
    550556    }
    551557
     558    if( isProcedureCallOnly )
     559    {
     560        SetError(3, termLeft, cp );
     561    }
    552562
    553563    return false;
  • trunk/abdev/BasicCompiler32/x86CodeGenerator.cpp

    r357 r370  
    13191319    pNativeCode->PutUserProcSchedule( pUserProc, false );
    13201320}
    1321 void CodeGenerator::op_mov_RV_vtbl( int reg, const CClass *pClass )
     1321void CodeGenerator::op_mov_RV_com_vtbl( int reg, const CClass *pClass )
    13221322{
    13231323    // mov reg,vtblAddress
     
    13271327
    13281328    //DISP32
     1329    pNativeCode->PutComVtblSchedule( pClass );
     1330}
     1331void CodeGenerator::op_mov_RV_vtbl( int reg, const CClass *pClass )
     1332{
     1333    // mov reg,vtblAddress
     1334
     1335    //オペコード、レジスタ
     1336    pNativeCode->Put( (char)(0xB8|REGISTER_OPERAND(reg)) );
     1337
     1338    //DISP32
    13291339    pNativeCode->PutVtblSchedule( pClass );
    13301340}
Note: See TracChangeset for help on using the changeset viewer.