Changeset 75 in dev for BasicCompiler64/Compile_Calc.cpp


Ignore:
Timestamp:
Mar 20, 2007, 4:36:16 AM (17 years ago)
Author:
dai_9181
Message:

TYPEINFO→Typeへのリファクタリングを実施。64bitはほぼ完了。32bitが全般的に未完成。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/Compile_Calc.cpp

    r64 r75  
    8484            }
    8585
    86             LONG_PTR lp;
    87             if(GetVarType(variable,&lp,0)!=-1){
     86            if(GetVarType(variable,Type(),0)){
    8887                //変数リストに該当したとき
    8988                SetError(1,NULL,cp);
     
    129128
    130129    char ObjName[VN_SIZE],array_element[VN_SIZE];
    131     CClass *pobj_c;
    132130    GetArrayElement(variable,ObjName,array_element);
    133131    if(array_element[0]){
    134         i2=GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);
    135         if(i2==DEF_OBJECT){
     132        Type varType;
     133        if( GetVarType(ObjName,varType,0) && varType.IsObject() ){
    136134            char temporary[VN_SIZE];
    137135            sprintf(temporary,"%s.%c%c%c",ObjName,1,ESC_OPERATOR,CALC_ARRAY_SET);
     
    141139
    142140            int idProc;
    143             void *pInfo;
    144             idProc=GetProc(temporary,&pInfo);
     141            void *pProc;
     142            idProc=GetProc(temporary,(void **)&pProc);
    145143            if(idProc){
    146                 CallProc(idProc,pInfo,temporary,temp2,NULL);
     144                CallProc(idProc,pProc,temporary,temp2,Type());
    147145                return;
    148146            }
     
    161159    ////////////////////////////////////////
    162160
    163     int VarType,CalcType;
    164     LONG_PTR lpVarIndex,lpCalcIndex;
    165     BOOL bCalcUseHeap;
     161    Type varType;
    166162
    167163    //型を識別
    168     VarType=GetVarType(variable,&lpVarIndex,0);
    169     if(VarType==-1){
     164    if( !GetVarType(variable,varType,false) ){
    170165
    171166        // プロパティ用のメソッドを呼び出す
    172         if(!CallPropertyMethod(variable,Command+i+1,NULL)){
     167        if(!CallPropertyMethod( variable, Command+i+1, Type() )){
    173168            //エラーを表示
    174             GetVarType(variable,&lpVarIndex,1);
     169            GetVarType(variable,varType,true);
    175170        }
    176171
     
    179174
    180175    extern LONG_PTR ProcPtr_BaseIndex;
    181     if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;
     176    if(varType.IsProcPtr()) ProcPtr_BaseIndex=varType.GetIndex();
    182177    else ProcPtr_BaseIndex=-1;
    183178
    184179    //NumOpe...(rax、またはxmm0に答えが格納される)
    185180    int reg=REG_RAX;
    186     CalcType=NumOpe(&reg,Command+i+1,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
    187 
    188     if(reg!=REG_RAX&&IsWholeNumberType(CalcType)){
     181    BOOL bCalcUseHeap;
     182    Type calcType;
     183    if( !NumOpe(&reg,Command+i+1,varType,calcType,&bCalcUseHeap) ){
     184        return;
     185    }
     186
     187    if(reg!=REG_RAX&&calcType.IsWhole()||
     188        varType.IsNull()||calcType.IsNull()){
    189189        SetError(300,NULL,cp);
    190190    }
    191 
    192     if(VarType==-1||CalcType==-1) return;
    193191
    194192    //結果を格納しているレジスタをブロッキング
     
    199197    if(!GetVarOffsetReadWrite(
    200198        variable,
    201         &VarType,
    202199        &VarRelativeVar,
    203         &lpVarIndex,
    204         NULL)) return;
     200        varType)) return;
    205201
    206202    //レジスタのブロッキングを解除
    207203    pobj_BlockReg->clear();
    208204
    209     if(VarType&FLAG_PTR){
     205    if(varType.GetBasicType()&FLAG_PTR){
    210206        SetError(14,variable,cp);
    211207        return;
    212208    }
    213209
    214     if(VarType==DEF_STRUCT ){
     210    if( varType.IsStruct() ){
    215211        //構造体インスタンスへの代入
    216         SetStructVariableFromRax(lpVarIndex,CalcType,lpCalcIndex,&VarRelativeVar,bCalcUseHeap);
    217         return;
    218     }
    219 
    220     if(CalcType==DEF_OBJECT && (CalcType!=VarType || lpCalcIndex!=lpVarIndex) ){
     212        SetStructVariableFromRax(varType,calcType,&VarRelativeVar,bCalcUseHeap);
     213        return;
     214    }
     215
     216    if( calcType.IsObject() && !calcType.Equals( varType ) ){
    221217        //キャスト演算子のオーバーロードに対応する
    222         CallCastOperatorProc(REG_RAX,CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex);
     218        CallCastOperatorProc(REG_RAX,calcType,bCalcUseHeap,varType);
    223219    }
    224220
     
    228224    /////////////////////////////////
    229225
    230     CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
     226    CheckDifferentType(varType,calcType,0,0);
    231227
    232228
     
    234230    // rax(実数はxmm0)の内容を変数にコピー
    235231    /////////////////////////////////////////////////
    236     SetVariableFromRax(VarType,CalcType,&VarRelativeVar);
     232    SetVariableFromRax(varType.GetBasicType(),calcType.GetBasicType(),&VarRelativeVar);
    237233}
    238 
    239 // TODO: 消す
    240 /*
    241 void SetRefVariable( const char *varname, const char *expression ){
    242     ////////////////////////////////////////
    243     // 変数のタイプ型を識別して、演算を行う
    244     ////////////////////////////////////////
    245 
    246     int VarType,CalcType;
    247     LONG_PTR lpVarIndex,lpCalcIndex;
    248     BOOL bCalcUseHeap;
    249 
    250     //型を識別
    251     VarType=GetVarType(varname,&lpVarIndex,0);
    252     if(VarType==-1){
    253         SetError(300,NULL,cp);
    254         return;
    255     }
    256 
    257     extern LONG_PTR ProcPtr_BaseIndex;
    258     if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;
    259     else ProcPtr_BaseIndex=-1;
    260 
    261     //NumOpe...(rax、またはxmm0に答えが格納される)
    262     int reg=REG_RAX;
    263     CalcType=NumOpe(&reg,expression,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
    264 
    265     //結果を格納しているレジスタをブロッキング
    266     pobj_BlockReg->lock(reg);
    267 
    268     if(VarType==-1||CalcType==-1) return;
    269 
    270     //変数アドレスを取得
    271     RELATIVE_VAR VarRelativeVar;
    272     if(!GetVarOffsetReadWrite(
    273         varname,
    274         &VarType,
    275         &VarRelativeVar,
    276         &lpVarIndex)) return;
    277 
    278     //レジスタのブロッキングを解除
    279     pobj_BlockReg->clear();
    280 
    281     if(VarType&FLAG_PTR){
    282         SetError(14,varname,cp);
    283         return;
    284     }
    285 
    286     if( VarType == DEF_OBJECT
    287         && (VarRelativeVar.dwKind == VAR_REFLOCAL || VarRelativeVar.dwKind == VAR_REFGLOBAL ) ){
    288         // 参照型オブジェクトへの代入(初期化)はポインタ変数と同様の処理に値する
    289         PTR_LEVEL_UP( VarType );
    290 
    291         if( VarRelativeVar.dwKind == VAR_REFGLOBAL ){
    292             VarRelativeVar.dwKind = VAR_GLOBAL;
    293         }
    294         else if( VarRelativeVar.dwKind == VAR_REFLOCAL ){
    295             VarRelativeVar.dwKind = VAR_LOCAL;
    296         }
    297 
    298         if( CalcType == DEF_OBJECT ){
    299             //右辺値が実体オブジェクトのときは、参照をコピー
    300             PTR_LEVEL_UP( CalcType );
    301         }
    302     }
    303     else{
    304         SetError(300,NULL,cp);
    305     }
    306 
    307 
    308     /////////////////////////////////
    309     // 右辺、左辺の型チェックを行う
    310     /////////////////////////////////
    311 
    312     CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
    313 
    314 
    315     /////////////////////////////////////////////////
    316     // rax(実数はxmm0)の内容を変数にコピー
    317     /////////////////////////////////////////////////
    318     SetVariableFromRax(VarType,CalcType,&VarRelativeVar);
    319 }
    320 */
Note: See TracChangeset for help on using the changeset viewer.