Changeset 348 in dev


Ignore:
Timestamp:
Oct 12, 2007, 3:25:54 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev
Files:
8 edited

Legend:

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

    r347 r348  
    330330        //                ->func3
    331331
     332        int vtblMasterListIndex, vtblIndex;
     333        pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
     334
    332335        // vtblマスターリストのポインタを取得
    333336        //mov edx,dword ptr[ecx]
     
    336339        // vtblのポインタを取得
    337340        //mov edx,dword ptr[edx+vtblMasterListIndex]
    338         int vtblMasterListIndex = pobj_c->GetVtblMasterListIndex( pUserProc );
    339341        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 );
    340 
    341         int vtblIndex = pobj_c->GetFuncNumInVtbl( pUserProc );
    342342
    343343        //call dword ptr[edx+func_index]
  • trunk/abdev/BasicCompiler32/Compile_Func.cpp

    r342 r348  
    274274        //                ->func3
    275275
     276        int vtblMasterListIndex, vtblIndex;
     277        pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
     278
    276279        // vtblマスターリストのポインタを取得
    277280        //mov edx,dword ptr[ecx]
     
    280283        // vtblのポインタを取得
    281284        //mov edx,dword ptr[edx+vtblMasterListIndex]
    282         int vtblMasterListIndex = pobj_c->GetVtblMasterListIndex( &userProc );
    283285        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 );
    284 
    285         int vtblIndex = pobj_c->GetFuncNumInVtbl( &userProc );
    286286
    287287        //mov eax,dword ptr[edx+func_index]
  • trunk/abdev/BasicCompiler64/Compile_CallProc.cpp

    r347 r348  
    361361        //                ->func3
    362362
     363        int vtblMasterListIndex, vtblIndex;
     364        pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
     365
    363366        // vtblマスターリストのポインタを取得
    364367        //mov r11,qword ptr[rcx]
     
    367370        // vtblのポインタを取得
    368371        //mov r11,dword ptr[r11+vtblMasterListIndex]
    369         int vtblMasterListIndex = pobj_c->GetVtblMasterListIndex( pUserProc );
    370         compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex, MOD_BASE_DISP32 );
    371 
    372         int vtblIndex = pobj_c->GetFuncNumInVtbl( pUserProc );
     372        compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex*PTR_SIZE, MOD_BASE_DISP32 );
    373373
    374374        //call qword ptr[r11+func_index]
  • trunk/abdev/BasicCompiler64/Compile_Func.cpp

    r345 r348  
    121121        //                ->func3
    122122
     123        int vtblMasterListIndex, vtblIndex;
     124        pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
     125
    123126        // vtblマスターリストのポインタを取得
    124127        //mov r11,qword ptr[rcx]
     
    127130        // vtblのポインタを取得
    128131        //mov r11,dword ptr[r11+vtblMasterListIndex]
    129         int vtblMasterListIndex = pobj_c->GetVtblMasterListIndex( &userProc );
    130132        compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex, MOD_BASE_DISP32 );
    131 
    132         int vtblIndex = pobj_c->GetFuncNumInVtbl( &userProc );
    133133
    134134        //mov rax,qword ptr[r11+func_index]
  • trunk/abdev/BasicCompiler_Common/include/Class.h

    r347 r348  
    493493    std::vector<long> vtblMasterList;
    494494public:
    495     int GetVtblMasterListIndex( const UserProc *pUserProc ) const;
    496     int GetFuncNumInVtbl( const UserProc *pUserProc ) const;
     495    void GetVtblMasterListIndexAndVtblIndex( const UserProc *pUserProc, int &vtblMasterListIndex, int &vtblIndex ) const;
    497496    long GetVtblMasterListOffset() const;
    498497    void GenerateVTableMasterList( const std::vector<long> &vtableMasterList, long &offset );
  • trunk/abdev/BasicCompiler_Common/include/Symbol.h

    r271 r348  
    6969        return name;
    7070    }
     71    std::string GetFullName() const;
    7172
    7273    // シンボル比較
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r347 r348  
    817817}
    818818
    819 int CClass::GetVtblMasterListIndex( const UserProc *pUserProc ) const
    820 {
    821     int index = 0;
     819void CClass::GetVtblMasterListIndexAndVtblIndex( const UserProc *pUserProc, int &vtblMasterListIndex, int &vtblIndex ) const
     820{
     821    vtblMasterListIndex = 0;
     822
     823    vtblIndex = 0;
    822824    BOOST_FOREACH( const CMethod *pMethod, GetDynamicMethods() ){
    823825        if( &pMethod->GetUserProc() == pUserProc )
    824826        {
    825             return index;
     827            return;
     828        }
     829
     830        if( pMethod->IsVirtual() )
     831        {
     832            vtblIndex++;
    826833        }
    827834    }
     
    829836    BOOST_FOREACH( const ::Interface *pInterface, interfaces )
    830837    {
    831         index++;
    832 
     838        vtblMasterListIndex++;
     839
     840        vtblIndex = 0;
    833841        BOOST_FOREACH( const CMethod *pMethod, pInterface->GetDynamicMethods() ){
    834842            if( &pMethod->GetUserProc() == pUserProc )
    835843            {
    836                 return index;
     844                return;
     845            }
     846
     847            if( pMethod->IsVirtual() )
     848            {
     849                vtblIndex++;
    837850            }
    838851        }
     
    840853
    841854    SetError();
    842     return 0;
    843 }
    844 int CClass::GetFuncNumInVtbl( const UserProc *pUserProc ) const
    845 {
    846     int n = 0;
    847     BOOST_FOREACH( const CMethod *pMethod, GetDynamicMethods() ){
    848         if( &pMethod->GetUserProc() == pUserProc ) break;
    849         if( pMethod->IsVirtual() ) n++;
    850     }
    851     return n;
     855    return;
    852856}
    853857long CClass::GetVtblMasterListOffset() const
     
    15231527            }
    15241528
    1525             if( pobj_c->GetName() == "Object" || dwClassType == ESC_TYPE ){
     1529            if( pobj_c->GetName() == "Object"
     1530                || pobj_c->GetFullName() == "ActiveBasic.Core.InterfaceInfo"
     1531                || dwClassType == ESC_TYPE )
     1532            {
     1533                // 何も継承しない
     1534
    15261535                if( &pobj_c->GetSuperClass() || pobj_c->GetVtblNum() )
    15271536                {
  • trunk/abdev/BasicCompiler_Common/src/Symbol.cpp

    r271 r348  
    2626    namespaceScopes = NamespaceScopes( areaName );
    2727    name = nestName;
     28}
     29
     30std::string Symbol::GetFullName() const
     31{
     32    if( namespaceScopes.size() )
     33    {
     34        return namespaceScopes.ToString() + "." + name;
     35    }
     36
     37    return name;
    2838}
    2939
Note: See TracChangeset for help on using the changeset viewer.