Changeset 342 in dev for trunk/abdev/BasicCompiler32


Ignore:
Timestamp:
Oct 9, 2007, 1:10:33 AM (17 years ago)
Author:
dai_9181
Message:

vtblの構造を変更。vtblMasterListをはさんでvtblを表現した。
その他メンバ名変更。
ClassPrototypeクラスを追加。

Location:
trunk/abdev/BasicCompiler32
Files:
7 edited

Legend:

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

    r339 r342  
    8181}
    8282
    83 bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName ){
    84     int i2;
    85 
     83bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName )
     84{
    8685    if( pUserProc->IsMacro() ){
    8786        if( lstrcmpi( pUserProc->GetName().c_str(), "Print" ) == 0 ){
     
    157156        /////////////////////////////////
    158157        pMethod = NULL;
    159         if( ! isStatic ) pMethod = pobj_c->GetMethods().GetMethodPtr( pUserProc );
     158        if( ! isStatic ) pMethod = pobj_c->GetDynamicMethods().GetMethodPtr( pUserProc );
    160159        if( ! pMethod ){
    161160            //動的メソッドが取得できなかったときは静的メソッドを当たる
     
    331330        //                ->func3
    332331
     332        // vtblマスターリストのポインタを取得
    333333        //mov edx,dword ptr[ecx]
    334334        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
    335 
    336         i2 = pobj_c->GetFuncNumInVtbl( pUserProc );
     335       
     336        // vtblのポインタを取得
     337        //mov edx,dword ptr[edx+vtblMasterListIndex]
     338        int vtblMasterListIndex = pobj_c->GetVtblMasterListIndex( pUserProc );
     339        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 );
     340
     341        int vtblIndex = pobj_c->GetFuncNumInVtbl( pUserProc );
    337342
    338343        //call dword ptr[edx+func_index]
    339         if(i2*PTR_SIZE<=0x7F){
     344        if( vtblIndex * PTR_SIZE <= 0x7F )
     345        {
    340346            compiler.codeGenerator.PutOld(
    341347                (char)0xFF,
    342348                (char)0x52,
    343                 (char)(i2*PTR_SIZE)
     349                (char)(vtblIndex*PTR_SIZE)
    344350            );
    345351        }
     
    349355                (char)0x92
    350356            );
    351             compiler.codeGenerator.PutOld( (long)(i2*PTR_SIZE), Schedule::None );
     357            compiler.codeGenerator.PutOld( (long)(vtblIndex*PTR_SIZE), Schedule::None );
    352358        }
    353359    }
  • trunk/abdev/BasicCompiler32/Compile_Func.cpp

    r339 r342  
    274274        //                ->func3
    275275
     276        // vtblマスターリストのポインタを取得
    276277        //mov edx,dword ptr[ecx]
    277278        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
    278 
    279         int i2 = pobj_c->GetFuncNumInVtbl( &userProc );
     279       
     280        // vtblのポインタを取得
     281        //mov edx,dword ptr[edx+vtblMasterListIndex]
     282        int vtblMasterListIndex = pobj_c->GetVtblMasterListIndex( &userProc );
     283        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 );
     284
     285        int vtblIndex = pobj_c->GetFuncNumInVtbl( &userProc );
    280286
    281287        //mov eax,dword ptr[edx+func_index]
    282         if(i2*PTR_SIZE<=0x7F){
    283             compiler.codeGenerator.op_mov_RM(sizeof(long),REG_EAX,REG_EDX,i2*PTR_SIZE,MOD_BASE_DISP8);
     288        if( vtblIndex * PTR_SIZE <= 0x7F )
     289        {
     290            compiler.codeGenerator.op_mov_RM(sizeof(long),REG_EAX,REG_EDX,vtblIndex*PTR_SIZE,MOD_BASE_DISP8);
    284291        }
    285292        else{
    286             compiler.codeGenerator.op_mov_RM(sizeof(long),REG_EAX,REG_EDX,i2*PTR_SIZE,MOD_BASE_DISP32);
     293            compiler.codeGenerator.op_mov_RM(sizeof(long),REG_EAX,REG_EDX,vtblIndex*PTR_SIZE,MOD_BASE_DISP32);
    287294        }
    288295    }
  • trunk/abdev/BasicCompiler32/Compile_Object.cpp

    r334 r342  
    3939
    4040    std::vector<const UserProc *> subs;
    41     pobj_c->GetMethods().Enum( pobj_c->GetName().c_str(), subs );
     41    pobj_c->GetDynamicMethods().Enum( pobj_c->GetName().c_str(), subs );
    4242
    4343    const UserProc *pUserProc;
     
    5959        // obj._System_SetType( _System_TypeBase.Search( strNamespace, name ) )
    6060        subs.clear();
    61         pobj_c->GetMethods().Enum( "_System_SetType", subs );
     61        pobj_c->GetDynamicMethods().Enum( "_System_SetType", subs );
    6262        if( subs.size() == 1 ){
    6363            char temporary[VN_SIZE];
     
    217217
    218218        // 仮想関数になるメソッドに使用チェックをつける
    219         BOOST_FOREACH( const CMethod *pMethod, classObj.GetMethods() )
     219        BOOST_FOREACH( const CMethod *pMethod, classObj.GetDynamicMethods() )
    220220        {
    221221            if( pMethod->IsVirtual() )
     
    224224            }
    225225        }
     226        BOOST_FOREACH( const ::Interface &objInterface, classObj.GetInterfaces() )
     227        {
     228            BOOST_FOREACH( const CMethod *pMethod, objInterface.GetClass().GetDynamicMethods() )
     229            {
     230                if( pMethod->IsVirtual() )
     231                {
     232                    pMethod->GetUserProc().Using();
     233                }
     234            }
     235        }
    226236    }
    227237
  • trunk/abdev/BasicCompiler32/Compile_Statement.cpp

    r326 r342  
    923923                if(type1.IsObject()){
    924924                    std::vector<const UserProc *> subs;
    925                     type1.GetClass().GetMethods().Enum( CALC_EQUAL, subs );
     925                    type1.GetClass().GetDynamicMethods().Enum( CALC_EQUAL, subs );
    926926                    if( subs.size() == 0 ){
    927927                        return;
  • trunk/abdev/BasicCompiler32/MakePeHdr.cpp

    r334 r342  
    10611061    ////////////////////////////////////////
    10621062    //仮想関数データテーブルスケジュール
    1063     compiler.GetObjectModule().meta.GetClasses().ActionVtblSchedule(ImageBase,MemPos_CodeSection);
     1063    compiler.GetObjectModule().meta.GetClasses().ActionVtblSchedule( ImageBase, MemPos_CodeSection, MemPos_DataSection );
    10641064
    10651065
  • trunk/abdev/BasicCompiler32/NumOpe.cpp

    r334 r342  
    232232    GetVarFormatString(methodName,parameter,lpPtrOffset,dummy,refType);
    233233
    234     objClass.GetMethods().Enum( methodName, userProcs );
     234    objClass.GetDynamicMethods().Enum( methodName, userProcs );
    235235    if(userProcs.size()){
    236236        //オーバーロードを解決
  • trunk/abdev/BasicCompiler32/OperatorProc.cpp

    r334 r342  
    3434
    3535    std::vector<const UserProc *> subs;
    36     pobj_c->GetMethods().Enum( idCalc, subs );
     36    pobj_c->GetDynamicMethods().Enum( idCalc, subs );
    3737    if( subs.size() == 0 ){
    3838        return 0;
     
    254254void CallIndexerGetterProc( const Type &classType, const char *ObjectName, char *Parameter,Type &resultType, DWORD dwProcFlags ){
    255255    std::vector<const UserProc *> subs;
    256     classType.GetClass().GetMethods().Enum( CALC_ARRAY_GET, subs );
     256    classType.GetClass().GetDynamicMethods().Enum( CALC_ARRAY_GET, subs );
    257257    if( subs.size() == 0 ){
    258258        return;
Note: See TracChangeset for help on using the changeset viewer.