Changeset 64 in dev for BasicCompiler64/Compile_Calc.cpp


Ignore:
Timestamp:
Mar 8, 2007, 2:49:34 AM (17 years ago)
Author:
dai_9181
Message:

すべてのオブジェクトを参照型に切り替えた。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/Compile_Calc.cpp

    r62 r64  
    1111        SetBooleanVariable(CalcType,pRelativeVar);
    1212    }
    13     else if(VarType==DEF_SBYTE||VarType==DEF_BYTE || (isUnicode==false&&VarType==DEF_CHAR)){
    14         //8ビット変数へalレジスタの内容を格納する
    15         SetWholeVariable(sizeof(char),CalcType,pRelativeVar);
    16     }
    17     else if(VarType==DEF_INTEGER||VarType==DEF_WORD || (isUnicode&&VarType==DEF_CHAR)){
    18         //16ビット変数へaxレジスタの内容を格納する
    19         SetWholeVariable(sizeof(short),CalcType,pRelativeVar);
    20     }
    21     else if(VarType==DEF_LONG||VarType==DEF_DWORD){
    22         //32ビット変数へeaxレジスタの内容を格納する
    23         SetWholeVariable(sizeof(long),CalcType,pRelativeVar);
    24     }
    25     else if(VarType==DEF_INT64||VarType==DEF_QWORD||IsPtrType(VarType)){
    26         //64ビット変数へraxレジスタの内容を格納する
    27         SetWholeVariable(sizeof(_int64),CalcType,pRelativeVar);
    28     }
    29     else if(VarType==DEF_DOUBLE){
    30         //Double型変数へスタックの内容を格納する
    31         SetDoubleVariable(CalcType,pRelativeVar);
    32     }
    33     else if(VarType==DEF_SINGLE){
    34         //Single型変数へスタックの内容を格納する
    35         SetSingleVariable(CalcType,pRelativeVar);
     13    else if( IsRealNumberType( VarType ) ){
     14        // Double/Single型変数へレジスタの値を代入
     15        SetRealVariable(VarType, CalcType, pRelativeVar);
     16    }
     17    else if( IsWholeNumberType( VarType ) || VarType == DEF_OBJECT ){
     18        int typeSize = GetTypeSize( VarType, -1 );
     19
     20        //整数変数へraxの値を格納する
     21        SetWholeVariable( typeSize, CalcType, pRelativeVar );
    3622    }
    3723    else{
     
    165151
    166152
     153    if( lstrcmpi( variable, "This" ) == 0 ){
     154        SetError(133,NULL,cp);
     155        return;
     156    }
     157
    167158
    168159    ////////////////////////////////////////
     
    195186    CalcType=NumOpe(&reg,Command+i+1,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
    196187
     188    if(reg!=REG_RAX&&IsWholeNumberType(CalcType)){
     189        SetError(300,NULL,cp);
     190    }
     191
     192    if(VarType==-1||CalcType==-1) return;
     193
    197194    //結果を格納しているレジスタをブロッキング
    198195    pobj_BlockReg->lock(reg);
    199 
    200     if(VarType==-1||CalcType==-1) return;
    201196
    202197    //変数アドレスを取得
     
    206201        &VarType,
    207202        &VarRelativeVar,
    208         &lpVarIndex)) return;
     203        &lpVarIndex,
     204        NULL)) return;
    209205
    210206    //レジスタのブロッキングを解除
     
    216212    }
    217213
    218     if(VarType==DEF_OBJECT){
    219         //オブジェクトインスタンスへの代入
    220         SetObjectVariableFromRax(lpVarIndex,CalcType,lpCalcIndex,&VarRelativeVar,bCalcUseHeap);
    221         return;
    222     }
    223 
    224     if(CalcType==DEF_OBJECT){
     214    if(VarType==DEF_STRUCT ){
     215        //構造体インスタンスへの代入
     216        SetStructVariableFromRax(lpVarIndex,CalcType,lpCalcIndex,&VarRelativeVar,bCalcUseHeap);
     217        return;
     218    }
     219
     220    if(CalcType==DEF_OBJECT && (CalcType!=VarType || lpCalcIndex!=lpVarIndex) ){
    225221        //キャスト演算子のオーバーロードに対応する
    226222        CallCastOperatorProc(REG_RAX,CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex);
     
    241237}
    242238
     239// TODO: 消す
     240/*
    243241void SetRefVariable( const char *varname, const char *expression ){
    244242    ////////////////////////////////////////
     
    320318    SetVariableFromRax(VarType,CalcType,&VarRelativeVar);
    321319}
     320*/
Note: See TracChangeset for help on using the changeset viewer.