Changeset 345 in dev for trunk/abdev/BasicCompiler64


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

64ビット版でもインターフェイスのベース実装周りをコンパイルできるようにした(インターフェイス機構自体はまだ未完成)

Location:
trunk/abdev/BasicCompiler64
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler64/BasicCompiler.vcproj

    r322 r345  
    9191                ProgramDatabaseFile=".\Debug/BasicCompiler64.pdb"
    9292                SubSystem="2"
     93                StackReserveSize="4194304"
    9394                TargetMachine="0"
    9495            />
  • trunk/abdev/BasicCompiler64/Compile_CallProc.cpp

    r339 r345  
    8989}
    9090
    91 bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName){
    92     int i2;
    93 
     91bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName)
     92{
    9493    if( pUserProc->IsMacro() ){
    9594        if( lstrcmpi( pUserProc->GetName().c_str(), "Print" ) == 0 ){
     
    165164        /////////////////////////////////
    166165        pMethod = NULL;
    167         if( ! isStatic ) pMethod = pobj_c->GetMethods().GetMethodPtr( pUserProc );
     166        if( ! isStatic ) pMethod = pobj_c->GetDynamicMethods().GetMethodPtr( pUserProc );
    168167        if( ! pMethod ){
    169168            //動的メソッドが取得できなかったときは静的メソッドを当たる
     
    362361        //                ->func3
    363362
     363        // vtblマスターリストのポインタを取得
    364364        //mov r11,qword ptr[rcx]
    365365        compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
    366366
    367         i2 = pobj_c->GetFuncNumInVtbl( pUserProc );
     367        // vtblのポインタを取得
     368        //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 );
    368373
    369374        //call qword ptr[r11+func_index]
    370         if(i2*PTR_SIZE<=0x7F){
     375        if( vtblIndex * PTR_SIZE <= 0x7F ){
    371376            compiler.codeGenerator.PutOld(
    372377                (char)0x41,
    373378                (char)0xFF,
    374379                (char)0x53,
    375                 (char)(i2*PTR_SIZE)
     380                (char)(vtblIndex*PTR_SIZE)
    376381            );
    377382        }
     
    381386                (char)0xFF,
    382387                (char)0x93,
    383                 (long)(i2*PTR_SIZE)
     388                (long)(vtblIndex*PTR_SIZE)
    384389            );
    385390        }
  • trunk/abdev/BasicCompiler64/Compile_Func.cpp

    r339 r345  
    121121        //                ->func3
    122122
     123        // vtblマスターリストのポインタを取得
    123124        //mov r11,qword ptr[rcx]
    124125        compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
    125126
    126         int i2 = pobj_c->GetFuncNumInVtbl( &userProc );
     127        // vtblのポインタを取得
     128        //mov r11,dword ptr[r11+vtblMasterListIndex]
     129        int vtblMasterListIndex = pobj_c->GetVtblMasterListIndex( &userProc );
     130        compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex, MOD_BASE_DISP32 );
     131
     132        int vtblIndex = pobj_c->GetFuncNumInVtbl( &userProc );
    127133
    128134        //mov rax,qword ptr[r11+func_index]
    129         if(i2*PTR_SIZE<=0x7F){
    130             compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_R11,i2*PTR_SIZE,MOD_BASE_DISP8);
    131         }
    132         else{
    133             compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_R11,i2*PTR_SIZE,MOD_BASE_DISP32);
     135        if( vtblIndex * PTR_SIZE <= 0x7F )
     136        {
     137            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_R11,vtblIndex*PTR_SIZE,MOD_BASE_DISP8);
     138        }
     139        else
     140        {
     141            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_R11,vtblIndex*PTR_SIZE,MOD_BASE_DISP32);
    134142        }
    135143    }
  • trunk/abdev/BasicCompiler64/Compile_Object.cpp

    r319 r345  
    3737
    3838    std::vector<const UserProc *> subs;
    39     pobj_c->GetMethods().Enum( pobj_c->GetName().c_str(), subs );
     39    pobj_c->GetDynamicMethods().Enum( pobj_c->GetName().c_str(), subs );
    4040
    4141    const UserProc *pUserProc;
     
    5757        // obj._System_SetType( _System_TypeBase.Search( strNamespace, name ) )
    5858        subs.clear();
    59         pobj_c->GetMethods().Enum( "_System_SetType", subs );
     59        pobj_c->GetDynamicMethods().Enum( "_System_SetType", subs );
    6060        if( subs.size() == 1 ){
    6161            char temporary[VN_SIZE];
     
    212212
    213213        // 仮想関数になるメソッドに使用チェックをつける
    214         BOOST_FOREACH( const CMethod *pMethod, classObj.GetMethods() )
     214        BOOST_FOREACH( const CMethod *pMethod, classObj.GetDynamicMethods() )
    215215        {
    216216            if( pMethod->IsVirtual() )
    217217            {
    218218                pMethod->GetUserProc().Using();
     219            }
     220        }
     221        BOOST_FOREACH( const ::Interface &objInterface, classObj.GetInterfaces() )
     222        {
     223            BOOST_FOREACH( const CMethod *pMethod, objInterface.GetDynamicMethods() )
     224            {
     225                if( pMethod->IsVirtual() )
     226                {
     227                    pMethod->GetUserProc().Using();
     228                }
    219229            }
    220230        }
  • trunk/abdev/BasicCompiler64/Compile_Statement.cpp

    r326 r345  
    684684                if(type1.IsObject()){
    685685                    std::vector<const UserProc *> subs;
    686                     type1.GetClass().GetMethods().Enum( CALC_EQUAL, subs );
     686                    type1.GetClass().GetDynamicMethods().Enum( CALC_EQUAL, subs );
    687687                    if( subs.size() == 0 ){
    688688                        return;
  • trunk/abdev/BasicCompiler64/MakePeHdr.cpp

    r322 r345  
    10591059    ////////////////////////////////////////
    10601060    //仮想関数データテーブルスケジュール
    1061     compiler.GetObjectModule().meta.GetClasses().ActionVtblSchedule(ImageBase,MemPos_CodeSection);
     1061    compiler.GetObjectModule().meta.GetClasses().ActionVtblSchedule( ImageBase, MemPos_CodeSection, MemPos_DataSection );
    10621062
    10631063
  • trunk/abdev/BasicCompiler64/NumOpe.cpp

    r339 r345  
    233233    GetVarFormatString(methodName,parameter,lpPtrOffset,dummy,refType);
    234234
    235     objClass.GetMethods().Enum( methodName, userProcs );
     235    objClass.GetDynamicMethods().Enum( methodName, userProcs );
    236236    if(userProcs.size()){
    237237        //オーバーロードを解決
  • trunk/abdev/BasicCompiler64/OperatorProc.cpp

    r339 r345  
    3939
    4040    std::vector<const UserProc *> subs;
    41     pobj_c->GetMethods().Enum( idCalc, subs );
     41    pobj_c->GetDynamicMethods().Enum( idCalc, subs );
    4242    if( subs.size() == 0 ){
    4343        return 0;
     
    324324
    325325    std::vector<const UserProc *> subs;
    326     classType.GetClass().GetMethods().Enum( CALC_ARRAY_GET, subs );
     326    classType.GetClass().GetDynamicMethods().Enum( CALC_ARRAY_GET, subs );
    327327    if( subs.size() == 0 ){
    328328        return;
Note: See TracChangeset for help on using the changeset viewer.