Changeset 20 in dev


Ignore:
Timestamp:
Dec 28, 2006, 5:24:48 AM (17 years ago)
Author:
dai_9181
Message:

参照型パラメータに関数の戻り値オブジェクトを指定した場合などの、一時オブジェクトの扱いを可能にした。
Dimで指定される初期値を見分けることで、As指定を省略できるようにした。

Files:
12 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/CParameter.cpp

    r11 r20  
    331331}
    332332
     333void CParameter::NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
     334    ///////////////////////////////////////////////////////
     335    // 一時オブジェクトをあらかじめスタックに積んでおく
     336    ///////////////////////////////////////////////////////
     337    //TODO: 64ビットコードのままなので、32ビット用に書き換える
     338
     339    useTempObject = false;
     340
     341    //一時オブジェクトの数
     342    nCountOfTempObjects = 0;
     343
     344    BOOL bEllipse;
     345    if(pi_num){
     346        if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;
     347        else bEllipse=0;
     348    }
     349    else bEllipse=0;
     350
     351    for(int i2=ParmsNum-1;i2>=0;i2--){
     352        useTempParameters[i2] = false;
     353
     354        if(bEllipse&&i2<=pi_num-2) bEllipse=0;
     355
     356        if(i2==0&&ppi[i2].name){
     357            if(lstrcmp(ppi[i2].name,"_System_LocalThis")==0){
     358                //オブジェクトメンバの第一パラメータのThisポインタ
     359                continue;
     360            }
     361        }
     362        if((i2==0||i2==1)&&ppi[i2].name){
     363            if(lstrcmp(ppi[i2].name,FuncName)==0){
     364                //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
     365                continue;
     366            }
     367        }
     368
     369        TYPEINFO DummyTypeInfo;
     370        BOOL bByVal;
     371        if(bEllipse){
     372            DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
     373            bByVal=1;
     374        }
     375        else{
     376            DummyTypeInfo.type=ppi[i2].type;
     377            DummyTypeInfo.u.lpIndex=ppi[i2].u.index;
     378            bByVal=ppi[i2].bByVal;
     379        }
     380
     381
     382        if( !bByVal ){
     383            //ポインタ参照
     384            if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
     385                //ポインタ指定
     386                continue;
     387            }
     388
     389            LONG_PTR lpVarIndex;
     390            if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){
     391                //変数ではないとき
     392                int reg = REG_RAX;
     393                int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
     394                //↑ここでスタックに積む
     395
     396                useTempParameters[i2] = true;
     397                useTempObject = true;
     398
     399                types[i2].type = type;
     400                types[i2].u.lpIndex = lpVarIndex;
     401
     402                nCountOfTempObjects++;
     403            }
     404        }
     405    }
     406}
     407void CParameter::DeleteTempParameters(){
     408    ///////////////////////////////////////////////////////
     409    // 一時オブジェクトを破棄
     410    ///////////////////////////////////////////////////////
     411    //TODO: 64ビットコードのままなので、32ビット用に書き換える
     412
     413    if( !useTempObject ) return;
     414
     415    for(int i2=ParmsNum-1;i2>=0;i2--){
     416        if( useTempParameters[i2] ){
     417            //スタックフレームから取得
     418            // ※関数呼び出し時も値が普遍のebxを利用する
     419            op_pop(REG_EBX);
     420
     421
     422            ///////////////////////////
     423            // デストラクタを呼び出す
     424            ///////////////////////////
     425
     426            //push ebx
     427            op_push(REG_EBX);
     428
     429            //call destructor
     430            int i5 = types[i2].u.pobj_Class->DestructorMemberSubIndex;
     431            op_call( types[i2].u.pobj_Class->ppobj_Method[i5]->psi );
     432
     433
     434            /////////////////////////
     435            // メモリを解放する
     436            /////////////////////////
     437
     438            //push ebx
     439            op_push(REG_EBX);
     440
     441            //call free
     442            extern SUBINFO *pSub_free;
     443            op_call(pSub_free);
     444        }
     445    }
     446}
     447
    333448void CParameter::SetObjectParameter(CClass *pobj_Class,LPSTR Parameter){
    334449    int object_size;
     
    441556    int ParmSize=0;
    442557    RELATIVE_VAR RelativeVar;
     558    int nCountOfNowTempObjects = 0;
    443559    for(i2=ParmsNum-1;i2>=0;i2--){
    444560        if(bEllipse&&i2<=pi_num-2) bEllipse=0;
     
    556672                int VarType;
    557673                LONG_PTR lpVarIndex;
    558                 if(!GetVarOffsetReadOnly(Parms[i2],&VarType,&RelativeVar,&lpVarIndex)) continue;
    559 
    560                 if(DummyTypeInfo.type!=DEF_ANY){
    561                     //型チェックを行う
    562                     if(DummyTypeInfo.type==VarType){
    563                         if(DummyTypeInfo.type==DEF_OBJECT){
    564                             if(DummyTypeInfo.u.lpIndex!=lpVarIndex){
     674                if(GetVarOffset(
     675                    false,
     676                    false,
     677                    Parms[i2],
     678                    &VarType,
     679                    &RelativeVar,
     680                    &lpVarIndex)){
     681                        if(DummyTypeInfo.type!=DEF_ANY){
     682                            //型チェックを行う
     683                            if(DummyTypeInfo.type==VarType){
     684                                if(DummyTypeInfo.type==DEF_OBJECT){
     685                                    if(DummyTypeInfo.u.lpIndex!=lpVarIndex){
     686                                        SetError(11,Parms[i2],cp);
     687                                    }
     688                                }
     689                            }
     690                            else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){
     691                                //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
     692                            }
     693                            else{
    565694                                SetError(11,Parms[i2],cp);
    566695                            }
    567696                        }
    568                     }
    569                     else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){
    570                         //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
    571                     }
    572                     else{
    573                         SetError(11,Parms[i2],cp);
    574                     }
     697
     698                        //変数アドレスをレジスタにセット
     699                        SetVarPtrToEax(&RelativeVar);
     700
     701                        //push eax
     702                        op_push(REG_EAX);
    575703                }
    576 
    577                 //変数アドレスをレジスタにセット
    578                 SetVarPtrToEax(&RelativeVar);
    579 
    580                 //push eax
    581                 op_push(REG_EAX);
     704                else{
     705                    //一時オブジェクトをコピー
     706
     707                    //mov eax, dword ptr[esp+offset]
     708                    op_mov_RM(
     709                        sizeof(long),
     710                        REG_EAX,
     711                        REG_ESP,
     712                        ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects - 1 ) ) * PTR_SIZE,
     713                        MOD_BASE_DISP32 );
     714
     715                    nCountOfNowTempObjects++;
     716
     717                    //push eax
     718                    op_push(REG_EAX);
     719
     720                    //VarType = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
     721                }
    582722            }
    583723
  • BasicCompiler32/Compile_CallProc.cpp

    r18 r20  
    176176    pobj_parameter->ErrorCheck(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum);
    177177
     178    //一時オブジェクトを生成
     179    pobj_parameter->NewTempParameters( variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum );
     180
    178181    //レジスタ、スタックフレームにセット
    179182    pobj_parameter->SetParameter(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum);
    180183
    181     //パラメータオブジェクトを破棄
    182     delete pobj_parameter;
    183 
    184 
     184
     185
     186    ////////////////////////
     187    // call
     188    ////////////////////////
    185189    RELATIVE_VAR RelativeVar;
    186190    LONG_PTR lp;
     
    195199    OpBuffer[obp++]=(char)0xFF;
    196200    OpBuffer[obp++]=(char)0xD0;
     201
     202
     203
     204    //一時オブジェクトを破棄
     205    pobj_parameter->DeleteTempParameters();
     206
     207    //パラメータオブジェクトを破棄
     208    delete pobj_parameter;
    197209
    198210    if(plpIndex) *plpIndex=pi->u.ReturnIndex;
     
    343355    }
    344356
     357    //一時オブジェクトを生成
     358    pobj_parameter->NewTempParameters( psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum );
     359
    345360    //レジスタ、スタックフレームにセット
    346361    int ParmSize;
    347362    ParmSize=pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum);
    348 
    349     //パラメータオブジェクトを破棄
    350     delete pobj_parameter;
    351363
    352364
     
    469481    }
    470482
     483    //一時オブジェクトを破棄
     484    pobj_parameter->DeleteTempParameters();
     485
     486    //パラメータオブジェクトを破棄
     487    delete pobj_parameter;
     488
    471489    if(plpIndex) *plpIndex=psi->u.ReturnIndex;
    472490
  • BasicCompiler32/Compile_Var.cpp

    r18 r20  
    760760    }
    761761
     762
     763    ///////////////////////////////////////
     764    // 単発式([]で囲まれていない)
     765    ///////////////////////////////////////
     766
     767    if( type == DEF_OBJECT){
     768        //オブジェクトの場合はありえない
     769        SetError(300,NULL,cp);
     770        return 0;
     771    }
     772
    762773    if(SubScripts[0]!=-1){
    763774        SetError(41,0,cp);
     
    879890
    880891        SetError(41,0,cp);
     892        return 0;
     893    }
     894
     895
     896    ///////////////////////////////////////
     897    // 単発式([]で囲まれていない)
     898    ///////////////////////////////////////
     899
     900    if( type == DEF_OBJECT){
     901        //オブジェクトの場合はありえない
     902        SetError(300,NULL,cp);
    881903        return 0;
    882904    }
  • BasicCompiler32/Opcode.h

    r17 r20  
    192192    TYPEINFO ReturnTypeInfo;
    193193
     194    //一時オブジェクト管理用
     195    bool useTempObject;
     196    bool useTempParameters[255];
     197    int nCountOfTempObjects;
     198
    194199public:
    195200    CParameter(char *buffer);
     
    208213    void SetObjectParameter(CClass *pobj_Class,LPSTR Parameter);
    209214    int SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
     215
     216    //一時オブジェクトパラメータの生成と破棄
     217    void NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum );
     218    void DeleteTempParameters();
    210219};
    211220
  • BasicCompiler64/CParameter.cpp

    r11 r20  
    329329    }
    330330}
     331
     332void CParameter::NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
     333    ///////////////////////////////////////////////////////
     334    // 一時オブジェクトをあらかじめスタックに積んでおく
     335    ///////////////////////////////////////////////////////
     336
     337    useTempObject = false;
     338
     339    BOOL bEllipse;
     340    if(pi_num){
     341        if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;
     342        else bEllipse=0;
     343    }
     344    else bEllipse=0;
     345
     346    for(int i2=ParmsNum-1;i2>=0;i2--){
     347        useTempParameters[i2] = false;
     348
     349        if(bEllipse&&i2<=pi_num-2) bEllipse=0;
     350
     351        if(i2==0&&ppi[i2].name){
     352            if(lstrcmp(ppi[i2].name,"_System_LocalThis")==0){
     353                //オブジェクトメンバの第一パラメータのThisポインタ
     354                continue;
     355            }
     356        }
     357        if((i2==0||i2==1)&&ppi[i2].name){
     358            if(lstrcmp(ppi[i2].name,FuncName)==0){
     359                //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
     360                continue;
     361            }
     362        }
     363
     364        TYPEINFO DummyTypeInfo;
     365        BOOL bByVal;
     366        if(bEllipse){
     367            DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
     368            bByVal=1;
     369        }
     370        else{
     371            DummyTypeInfo.type=ppi[i2].type;
     372            DummyTypeInfo.u.lpIndex=ppi[i2].u.index;
     373            bByVal=ppi[i2].bByVal;
     374        }
     375
     376
     377        if( !bByVal ){
     378            //ポインタ参照
     379            if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
     380                //ポインタ指定
     381                continue;
     382            }
     383
     384            LONG_PTR lpVarIndex;
     385            if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){
     386                //変数ではないとき
     387                int reg = REG_RAX;
     388                int type = NumOpe( &reg, Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
     389
     390                //スタックフレームへコピー
     391                StackOffsetOfTempObject[i2] = pobj_sf->push(reg);
     392
     393                useTempParameters[i2] = true;
     394                useTempObject = true;
     395
     396                types[i2].type = type;
     397                types[i2].u.lpIndex = lpVarIndex;
     398            }
     399        }
     400    }
     401}
     402void CParameter::DeleteTempParameters(){
     403    ///////////////////////////////////////////////////////
     404    // 一時オブジェクトを破棄
     405    ///////////////////////////////////////////////////////
     406    if( !useTempObject ) return;
     407
     408    for(int i2=ParmsNum-1;i2>=0;i2--){
     409        if( useTempParameters[i2] ){
     410            //スタックフレームから取得
     411            pobj_sf->ref(REG_RCX);
     412
     413            //デストラクタを呼び出す
     414
     415            //call destructor
     416            int i5 = types[i2].u.pobj_Class->DestructorMemberSubIndex;
     417            op_call( types[i2].u.pobj_Class->ppobj_Method[i5]->psi );
     418
     419            //メモリを解放する
     420
     421            pobj_sf->pop(REG_RCX);
     422
     423            //call free
     424            extern SUBINFO *pSub_free;
     425            op_call(pSub_free);
     426        }
     427    }
     428}
     429
    331430void CParameter::SetObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter){
    332431    //////////////////////////////////////////////////////
     
    427526    op_mov_RR(reg,REG_R11);
    428527}
     528
    429529void CParameter::SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
    430530    ///////////////////////////////////////////////////////////
     
    616716                int VarType;
    617717                LONG_PTR lpVarIndex;
    618                 if(!GetVarOffsetReadOnly(
     718                if(GetVarOffset(
     719                    false,
     720                    false,
    619721                    Parms[i2],
    620722                    &VarType,
    621723                    &RelativeVar,
    622                     &lpVarIndex)) continue;
    623 
    624                 if(DummyTypeInfo.type!=DEF_ANY){
    625                     //型チェックを行う
    626                     if(DummyTypeInfo.type==VarType){
    627                         if(DummyTypeInfo.type==DEF_OBJECT){
    628                             if(DummyTypeInfo.u.lpIndex!=lpVarIndex){
     724                    &lpVarIndex)){
     725
     726                        if(DummyTypeInfo.type!=DEF_ANY){
     727                            //型チェックを行う
     728                            if(DummyTypeInfo.type==VarType){
     729                                if(DummyTypeInfo.type==DEF_OBJECT){
     730                                    if(DummyTypeInfo.u.lpIndex!=lpVarIndex){
     731                                        SetError(11,Parms[i2],cp);
     732                                    }
     733                                }
     734                            }
     735                            else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){
     736                                //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
     737                            }
     738                            else{
    629739                                SetError(11,Parms[i2],cp);
    630740                            }
    631741                        }
    632                     }
    633                     else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){
    634                         //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
    635                     }
    636                     else{
    637                         SetError(11,Parms[i2],cp);
    638                     }
    639                 }
    640 
    641                 //変数アドレスをレジスタにセット
    642                 SetVarPtrToReg(reg,&RelativeVar);
     742
     743                        //変数アドレスをレジスタにセット
     744                        SetVarPtrToReg(reg,&RelativeVar);
     745
     746                }
     747                else{
     748                    //一時オブジェクトをコピー
     749
     750                    //mov reg, qword ptr[rsp+offset]
     751                    pobj_sf->ref_offset_data( reg, StackOffsetOfTempObject[i2] );
     752
     753                    //VarType = NumOpe( &reg, Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
     754                }
    643755            }
    644756        }
  • BasicCompiler64/Compile_CallProc.cpp

    r19 r20  
    180180    pobj_parameter->BackupParameter(pi->ParmNum);
    181181
     182    //一時オブジェクトを生成
     183    pobj_parameter->NewTempParameters( variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum );
     184
    182185    //レジスタ、スタックフレームにセット
    183186    pobj_parameter->SetParameter(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum);
     
    200203    //レジスタのブロッキングを解除        ※パラメータセット時にロックされたレジスタ
    201204    pobj_BlockReg->clear();
     205
     206    //一時オブジェクトを破棄
     207    pobj_parameter->DeleteTempParameters();
    202208
    203209    //スタックフレームに存在する既存のパラメータを復元
     
    355361    pobj_parameter->BackupParameter(psi->RealParmNum);
    356362
     363    //一時オブジェクトを生成
     364    pobj_parameter->NewTempParameters( psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum );
     365
    357366    //レジスタ、スタックフレームにセット
    358367    pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum);
     
    490499    pobj_BlockReg->clear();
    491500
     501    //一時オブジェクトを破棄
     502    pobj_parameter->DeleteTempParameters();
     503
    492504    //スタックフレームに存在する既存のパラメータを復元
    493505    pobj_parameter->RestoreParameter(psi->RealParmNum);
  • BasicCompiler64/Compile_Var.cpp

    r19 r20  
    781781    }
    782782
     783
     784    ///////////////////////////////////////
     785    // 単発式([]で囲まれていない)
     786    ///////////////////////////////////////
     787
     788    if( type == DEF_OBJECT){
     789        //オブジェクトの場合はありえない
     790        SetError(300,NULL,cp);
     791        return 0;
     792    }
     793
    783794    if(SubScripts[0]!=-1){
    784795        SetError(41,0,cp);
  • BasicCompiler64/Opcode.h

    r19 r20  
    120120    void SetLocalParmSize(int size);
    121121    int GetFrameSize();
    122     void push(int reg);
     122    int push(int reg);
    123123    void push(int xmm_reg,int var_size);
     124    void ref_offset_data( int reg, int sp_offset );
    124125    void ref(int reg);
    125126    void ref(int xmm_reg,int var_size);
     
    339340    TYPEINFO ReturnTypeInfo;
    340341
     342    //一時オブジェクト管理用
     343    bool useTempObject;
     344    bool useTempParameters[255];
     345    int StackOffsetOfTempObject[255];
     346
    341347public:
    342348    CParameter(char *buffer);
     
    354360    void MacroParameterSupport(PARAMETER_INFO *ppi);
    355361    void SetObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter);
     362
     363    //一時オブジェクトパラメータの生成と破棄
     364    void NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum );
     365    void DeleteTempParameters();
     366
    356367    void SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
     368
    357369    void BackupParameter(int pi_num);
    358370    void RestoreParameter(int pi_num);
  • BasicCompiler64/stack_frame.cpp

    r3 r20  
    3939    return -(answer_sp-0x08);
    4040}
    41 void CStackFrame::push(int reg){
     41int CStackFrame::push(int reg){
    4242    now_sp-=sizeof(_int64);
    4343    if(lowest_sp>now_sp) lowest_sp=now_sp;
    4444
    45     if(reg==REG_NON) return;
     45    if(reg==REG_NON) return now_sp;
    4646
    4747    //mov qword ptr[rsp+offset],reg
     
    5252    add();
    5353    obp+=sizeof(long);
     54
     55    return now_sp;
    5456}
    5557void CStackFrame::push(int xmm_reg,int var_size){
     
    7779    obp+=sizeof(long);
    7880}
    79 void CStackFrame::ref(int reg){
     81void CStackFrame::ref_offset_data( int reg, int sp_offset ){
    8082    //mov reg,qword ptr[rsp+offset]     ※スタックフレームを利用
    81     op_mov_RM(sizeof(_int64),reg,REG_RSP,now_sp,MOD_BASE_DISP32);
     83    op_mov_RM(sizeof(_int64),reg,REG_RSP,sp_offset,MOD_BASE_DISP32);
    8284
    8385    //スケジュールをセット
     
    8587    add();
    8688    obp+=sizeof(long);
     89}
     90void CStackFrame::ref(int reg){
     91    ref_offset_data( reg, now_sp );
    8792}
    8893void CStackFrame::ref(int xmm_reg,int var_size){
  • BasicCompiler_Common/Object.cpp

    r5 r20  
    257257            op_call(pSub_free);
    258258        }
    259         if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef==0){
     259        else if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef==0){
    260260            //デストラクタの呼び出し
    261261            i5=pVar[i3].u.pobj_c->DestructorMemberSubIndex;
  • BasicCompiler_Common/Variable.cpp

    r11 r20  
    281281    }
    282282    return 1;
     283}
     284
     285TYPEINFO GetStringTypeInfo(){
     286    extern CClass *pobj_StringClass;
     287    TYPEINFO TypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass };
     288    return TypeInfo;
    283289}
    284290
     
    765771    }
    766772
     773    //変数として見つからなかったとき
    767774    if(bError) SetError(3,variable,cp);
    768775    return -1;
     
    957964    }
    958965    else{
    959         //As指定なし
    960         pTypeInfo->type=GetTypeFromSimpleName(variable);
    961 
    962         i2=lstrlen(variable)-1;
    963         if(i2>=0){
    964             if(!(variable[i2]=='#'||variable[i2]=='!'||variable[i2]=='%'||variable[i2]=='$'))
    965                 SetError(-103,variable,cp);
    966         }
     966        /////////////////
     967        // As指定なし
     968        /////////////////
     969
     970        if( InitBuf[0] == '\0' ){
     971            //As指定も、初期値指定もない場合
     972            pTypeInfo->type=GetTypeFromSimpleName(variable);
     973
     974            i2=lstrlen(variable)-1;
     975            if(i2>=0){
     976                if(!(variable[i2]=='#'||variable[i2]=='!'||variable[i2]=='%'||variable[i2]=='$'))
     977                    SetError(-103,variable,cp);
     978            }
     979        }
     980        else{
     981            //初期値の型を判別して自動的に型情報を付加する
     982
     983            TYPEINFO BaseType = GetStringTypeInfo();
     984            int result = NumOpe_GetType( InitBuf, &BaseType, &pTypeInfo->u.lpIndex );
     985
     986            //エラーの場合
     987            if( result == -1 ) return 0;
     988
     989            pTypeInfo->type = result;
     990        }
     991
     992    }
     993
     994    if( InitBuf[0] != '\0' && ConstractParameter[0] != '\0' ){
     995        //初期値とコンストラクタパラメータが同時に呼び出されているとき
     996        SetError(132, NULL, cp);
     997    }
     998
     999    if( pTypeInfo->type == DEF_OBJECT && InitBuf[0] != '\0' && InitBuf[0] != '[' ){
     1000        lstrcpy( ConstractParameter, InitBuf );
     1001        InitBuf[0] = 0;
    9671002    }
    9681003
     
    10771112        AllInitGlobalVarSize);
    10781113    if(InitBuf[0]){
    1079         //初期代入時のみ、書き込みアクセスを許可する
    1080         bool bConstBack = pVar->bConst;
    1081         pVar->bConst = false;
    1082 
    1083         int result = SetInitGlobalData(pVar->offset,
    1084             pVar->type,
    1085             pVar->u.index,
    1086             pVar->SubScripts,
    1087             InitBuf);
    1088 
    1089         if(!result){
    1090             //動的な式だった場合は代入演算を行う
    1091             char temporary[8192];
    1092             sprintf(temporary,"%s=%s",name,InitBuf);
    1093             OpcodeCalc(temporary);
    1094         }
    1095 
    1096         pVar->bConst = bConstBack;
     1114        if( pVar->type == DEF_OBJECT && InitBuf[0] != '[' ){
     1115            //単発式が初期値のオブジェクトの場合
     1116            //初期値をコピーコンストラクタに渡す
     1117        }
     1118        else{
     1119            int result = SetInitGlobalData(pVar->offset,
     1120                pVar->type,
     1121                pVar->u.index,
     1122                pVar->SubScripts,
     1123                InitBuf);
     1124
     1125            if(!result){
     1126                //動的な式だった場合は代入演算を行う
     1127
     1128                //初期代入時のみ、書き込みアクセスを許可する
     1129                bool bConstBack = pVar->bConst;
     1130                pVar->bConst = false;
     1131
     1132                //代入
     1133                char temporary[8192];
     1134                sprintf(temporary,"%s=%s",name,InitBuf);
     1135                OpcodeCalc(temporary);
     1136
     1137                //アクセス制限を元に戻す
     1138                pVar->bConst = bConstBack;
     1139            }
     1140        }
    10971141    }
    10981142
  • BasicCompiler_Common/error.cpp

    r18 r20  
    176176    if(num==130) sprintf(msg,"\"%s\" はオブジェクト定数です。書き込みアクセスはできません。",KeyWord);
    177177    if(num==131) lstrcpy(msg,"Const定義されたメソッド内でクラスメンバへの書き込みアクセスはできません。");
     178    if(num==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。");
    178179
    179180    //Enum関連
Note: See TracChangeset for help on using the changeset viewer.