Changeset 28 in dev for BasicCompiler64


Ignore:
Timestamp:
Jan 8, 2007, 6:34:44 AM (17 years ago)
Author:
dai_9181
Message:

・【32ビットコンパイラ】戻り値に実態オブジェクトを持つインデクサを呼び出すと強制終了してしまうバグを修正。
・仮想関数のオーバーロードが正常に動作しないバグを修正。
・純仮想関数(抽象メソッド)が仮想関数でオーバーロードされていると、クラスのインスタンスが生成できてしまうバグを修正。

Location:
BasicCompiler64
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/CParameter.cpp

    r20 r28  
    546546    }
    547547
     548    //戻り値用の変数名を取得
     549    char *lpszVarNameToReturn;
     550    if(FuncName[0]==1&&FuncName[1]==ESC_OPERATOR) lpszVarNameToReturn="_System_ReturnValue";
     551    else lpszVarNameToReturn=FuncName;
     552
    548553    //パラメータをレジスタとスタックに格納
    549554    int CalcType;
     
    563568        }
    564569        if((i2==0||i2==1)&&ppi[i2].name){
    565             if(lstrcmp(ppi[i2].name,FuncName)==0){
     570            if(lstrcmp(ppi[i2].name,lpszVarNameToReturn)==0){
    566571                //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
    567572                continue;
  • BasicCompiler64/Compile_CallProc.cpp

    r27 r28  
    4949        char ObjectName[VN_SIZE];
    5050        int RefType;
    51         GetObjectName(name,ObjectName,&RefType);
     51        SplitObjectName(name,ObjectName,&RefType);
    5252
    5353
     
    113113    char ObjectName[VN_SIZE];
    114114    int RefType;
    115     GetObjectName(VarName,ObjectName,&RefType);
     115    SplitObjectName(VarName,ObjectName,&RefType);
    116116
    117117    //オーバーロード用の関数リストを作成
  • BasicCompiler64/Compile_Func.cpp

    r11 r28  
    140140        char ObjectName[VN_SIZE];
    141141        int RefType;
    142         GetObjectName(name,ObjectName,&RefType);
     142        SplitObjectName(name,ObjectName,&RefType);
    143143
    144144        if(ObjectName[0]){
  • BasicCompiler64/Compile_Object.cpp

    r15 r28  
    131131    pobj_c=(CClass *)*plpIndex;
    132132
    133     if(pobj_c->IsHoldAbstractFunction()){
     133    if(pobj_c->IsAbstract()){
    134134        //抽象クラスだったとき
    135135        SetError(125,pobj_c->name,cp);
  • BasicCompiler64/Compile_ProcOp.cpp

    r27 r28  
    600600            //仮想関数テーブルを初期化
    601601            if(pobj_CompilingClass->vtbl_num&&
    602                 pobj_CompilingClass->IsHoldAbstractFunction()==0){
    603                 //関数テーブルに値をセット
    604                 offset=(int)pobj_CompilingClass->GetVtblGlobalOffset();
    605 
    606                 //mov rax,offset
    607                 op_mov_RV(sizeof(_int64),REG_RAX,offset);
    608                 obp-=sizeof(long);
    609                 pobj_DataTableSchedule->add();
    610                 obp+=sizeof(long);
    611 
    612                 //Thisポインタをrcxにコピー
    613                 SetThisPtrToReg(REG_RCX);
    614 
    615                 //mov qword ptr[rcx],rax
    616                 op_mov_MR(sizeof(_int64),REG_RAX,REG_RCX,0,MOD_BASE);
     602                pobj_CompilingClass->IsAbstract()==false){
     603                    //関数テーブルに値をセット
     604                    offset=(int)pobj_CompilingClass->GetVtblGlobalOffset();
     605
     606                    //mov rax,offset
     607                    op_mov_RV(sizeof(_int64),REG_RAX,offset);
     608                    obp-=sizeof(long);
     609                    pobj_DataTableSchedule->add();
     610                    obp+=sizeof(long);
     611
     612                    //Thisポインタをrcxにコピー
     613                    SetThisPtrToReg(REG_RCX);
     614
     615                    //mov qword ptr[rcx],rax
     616                    op_mov_MR(sizeof(_int64),REG_RAX,REG_RCX,0,MOD_BASE);
    617617            }
    618618        }
  • BasicCompiler64/Compile_Set_Var.cpp

    r27 r28  
    7777
    7878
    79 //TODO: 継承・派生関係にある場合は許容する
    80     if(CalcType==DEF_OBJECT&&lpVarIndex==lpCalcIndex){
    81         //双方のオブジェクト型が完全に一致したとき
    82         //※コピーを行う
    83 
    84         //mov rsi,RightTermReg
    85         op_mov_RR(REG_RSI,RightTermReg);
    86 
    87         //mov rdi,VarReg
    88         op_mov_RR(REG_RDI,VarReg);
    89 
    90         int object_size;
    91         object_size=GetSizeOfClass((CClass *)lpVarIndex);
    92 
    93         //mov rcx,object_size
    94         op_mov_RV(sizeof(_int64),REG_RCX,object_size);
    95 
    96         if(bUseHeap){
    97             //mov rax,rsi
    98             op_mov_RR(REG_RAX,REG_RSI);
    99         }
    100 
    101         //rep movs byte ptr[rdi],byte ptr[rsi]
    102         op_rep_movs(sizeof(BYTE));
    103 
    104         if(bUseHeap){
    105             //mov rcx,rax
    106             op_mov_RR(REG_RCX,REG_RAX);
    107 
    108             //call free
    109             extern SUBINFO *pSub_free;
    110             op_call(pSub_free);
    111         }
    112 
    113         return;
    114     }
    115     else{
    116         SetError(1,NULL,cp);
    117     }
     79    if( CalcType == DEF_OBJECT ){
     80        CClass *pVarClass = (CClass *)lpVarIndex;
     81        CClass *pCalcClass = (CClass *)lpCalcIndex;
     82
     83        if( pVarClass->IsEquals( pCalcClass )           //等しい
     84            || pVarClass->IsSubClass( pCalcClass ) ){   //派生・継承関係
     85
     86                //双方のオブジェクト型が一致、または派生・継承関係にあるとき
     87                //※コピーを行う
     88
     89                //mov rsi,RightTermReg
     90                op_mov_RR(REG_RSI,RightTermReg);
     91
     92                //mov rdi,VarReg
     93                op_mov_RR(REG_RDI,VarReg);
     94
     95                int object_size = GetSizeOfClass((CClass *)lpVarIndex);
     96
     97                //mov rcx,object_size
     98                op_mov_RV(sizeof(_int64),REG_RCX,object_size);
     99
     100                if(bUseHeap){
     101                    //mov rax,rsi
     102                    op_mov_RR(REG_RAX,REG_RSI);
     103                }
     104
     105                //rep movs byte ptr[rdi],byte ptr[rsi]
     106                op_rep_movs(sizeof(BYTE));
     107
     108                if(bUseHeap){
     109                    //mov rcx,rax
     110                    op_mov_RR(REG_RCX,REG_RAX);
     111
     112                    //call free
     113                    extern SUBINFO *pSub_free;
     114                    op_call(pSub_free);
     115                }
     116
     117                return;
     118        }
     119    }
     120
     121    SetError(1,NULL,cp);
    118122}
    119123
  • BasicCompiler64/Compile_Var.cpp

    r27 r28  
    12291229
    12301230    if(TypeInfo.type==DEF_OBJECT){
    1231         if(TypeInfo.u.pobj_Class->IsHoldAbstractFunction()){
     1231        if(TypeInfo.u.pobj_Class->IsAbstract()){
    12321232            //抽象クラスだったとき
    12331233            SetError(125,TypeInfo.u.pobj_Class->name,cp);
Note: See TracChangeset for help on using the changeset viewer.