Changeset 28 in dev for BasicCompiler32


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

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

Location:
BasicCompiler32
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/BasicCompiler.vcproj

    r26 r28  
    154154                ObjectFile=".\Release/"
    155155                ProgramDataBaseFileName=".\Release/"
    156                 BrowseInformation="2"
     156                BrowseInformation="0"
    157157                BrowseInformationFile=".\Release/"
    158158                WarningLevel="3"
  • BasicCompiler32/CParameter.cpp

    r20 r28  
    215215    SUBINFO *psi;
    216216    psi=0;
     217    if(lstrcmp(name,"Abs")==0){
     218        MessageBeep(0);
     219    }
    217220    for(i=0;i<num;i++){
    218221        psi=ppsi[i];
     
    550553    }
    551554
     555    //戻り値用の変数名を取得
     556    char *lpszVarNameToReturn;
     557    if(FuncName[0]==1&&FuncName[1]==ESC_OPERATOR) lpszVarNameToReturn="_System_ReturnValue";
     558    else lpszVarNameToReturn=FuncName;
     559
    552560    //パラメータをレジスタとスタックに格納
    553561    int CalcType;
     
    567575        }
    568576        if((i2==0||i2==1)&&ppi[i2].name){
    569             if(lstrcmp(ppi[i2].name,FuncName)==0){
     577            if(lstrcmp(ppi[i2].name,lpszVarNameToReturn)==0){
    570578                //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
    571579                continue;
  • BasicCompiler32/Compile_Calc.cpp

    r11 r28  
    484484    }
    485485
    486 
    487 
    488486    ////////////////////////////////////////
    489487    // 変数のタイプ型を識別して、演算を行う
  • BasicCompiler32/Compile_CallProc.cpp

    r27 r28  
    4848        char ObjectName[VN_SIZE];
    4949        int RefType;
    50         GetObjectName(name,ObjectName,&RefType);
     50        SplitObjectName(name,ObjectName,&RefType);
    5151
    5252
     
    112112    char ObjectName[VN_SIZE];
    113113    int RefType;
    114     GetObjectName(VarName,ObjectName,&RefType);
     114    SplitObjectName(VarName,ObjectName,&RefType);
    115115
    116116    //オーバーロード用の関数リストを作成
  • BasicCompiler32/Compile_Func.cpp

    r11 r28  
    288288        char ObjectName[VN_SIZE];
    289289        int RefType;
    290         GetObjectName(name,ObjectName,&RefType);
     290        SplitObjectName(name,ObjectName,&RefType);
    291291
    292292        if(ObjectName[0]){
  • BasicCompiler32/Compile_Object.cpp

    r3 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);
  • BasicCompiler32/Compile_ProcOp.cpp

    r27 r28  
    554554            //仮想関数テーブルを初期化
    555555            if(pobj_CompilingClass->vtbl_num&&
    556                 pobj_CompilingClass->IsHoldAbstractFunction()==0){
    557                 //関数テーブルに値をセット
    558                 offset=pobj_CompilingClass->GetVtblGlobalOffset();
    559 
    560                 //mov eax,offset
    561                 OpBuffer[obp++]=(char)0xB8;
    562                 *((long *)(OpBuffer+obp))=offset;
    563                 pobj_DataTableSchedule->add();
    564                 obp+=sizeof(long);
    565 
    566                 //Thisポインタをecxにコピー
    567                 SetThisPtrToReg(REG_ECX);
    568 
    569                 //mov dword ptr[ecx],eax
    570                 OpBuffer[obp++]=(char)0x89;
    571                 OpBuffer[obp++]=(char)0x01;
     556                pobj_CompilingClass->IsAbstract()==false){
     557                    //関数テーブルに値をセット
     558                    offset=pobj_CompilingClass->GetVtblGlobalOffset();
     559
     560                    //mov eax,offset
     561                    OpBuffer[obp++]=(char)0xB8;
     562                    *((long *)(OpBuffer+obp))=offset;
     563                    pobj_DataTableSchedule->add();
     564                    obp+=sizeof(long);
     565
     566                    //Thisポインタをecxにコピー
     567                    SetThisPtrToReg(REG_ECX);
     568
     569                    //mov dword ptr[ecx],eax
     570                    OpBuffer[obp++]=(char)0x89;
     571                    OpBuffer[obp++]=(char)0x01;
    572572            }
    573573        }
  • BasicCompiler32/Compile_Set_Var.cpp

    r3 r28  
    3434    }
    3535
    36     if(CalcType==DEF_OBJECT&&lpVarIndex==lpCalcIndex){
    37         //双方のオブジェクト型が完全に一致したとき
    38         //※コピーを行う
    39 
    40         int object_size;
    41         object_size=GetSizeOfClass((CClass *)lpVarIndex);
    42 
    43         //mov ecx,object_size
    44         op_mov_RV(REG_ECX,object_size);
    45 
    46         //pop esi
    47         op_pop(REG_ESI);
    48 
    49         //pop edi
    50         op_pop(REG_EDI);
    51 
    52         if(bUseHeap){
    53             //mov eax,esi
    54             op_mov_RR(REG_EAX,REG_ESI);
    55         }
    56 
    57         //rep movs byte ptr[edi],byte ptr[esi]
    58         op_rep_movs(sizeof(BYTE));
    59 
    60         if(bUseHeap){
    61             //push eax
    62             op_push(REG_EAX);
    63 
    64             //call free
    65             extern SUBINFO *pSub_free;
    66             op_call(pSub_free);
    67         }
    68 
    69         return;
    70     }
    71     else{
    72         SetError(1,NULL,cp);
    73     }
     36
     37    if( CalcType == DEF_OBJECT ){
     38        CClass *pVarClass = (CClass *)lpVarIndex;
     39        CClass *pCalcClass = (CClass *)lpCalcIndex;
     40
     41
     42        if( pVarClass->IsEquals( pCalcClass )           //等しい
     43            || pVarClass->IsSubClass( pCalcClass ) ){   //派生・継承関係
     44
     45                //双方のオブジェクト型が一致、または派生・継承関係にあるとき
     46                //※コピーを行う
     47
     48                int object_size;
     49                object_size=GetSizeOfClass((CClass *)lpVarIndex);
     50
     51                //mov ecx,object_size
     52                op_mov_RV(REG_ECX,object_size);
     53
     54                //pop esi
     55                op_pop(REG_ESI);
     56
     57                //pop edi
     58                op_pop(REG_EDI);
     59
     60                if(bUseHeap){
     61                    //mov eax,esi
     62                    op_mov_RR(REG_EAX,REG_ESI);
     63                }
     64
     65                //rep movs byte ptr[edi],byte ptr[esi]
     66                op_rep_movs(sizeof(BYTE));
     67
     68                if(bUseHeap){
     69                    //push eax
     70                    op_push(REG_EAX);
     71
     72                    //call free
     73                    extern SUBINFO *pSub_free;
     74                    op_call(pSub_free);
     75                }
     76
     77                return;
     78        }
     79    }
     80
     81    SetError(1,NULL,cp);
    7482}
    7583
  • BasicCompiler32/Compile_Var.cpp

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