Changeset 40 in dev for BasicCompiler64/Compile_Calc.cpp


Ignore:
Timestamp:
Jan 28, 2007, 3:48:22 AM (17 years ago)
Author:
dai_9181
Message:

ByRef修飾子を関数戻り値とDimステートメントで指定可能にした。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/Compile_Calc.cpp

    r36 r40  
    237237    SetVariableFromRax(VarType,CalcType,&VarRelativeVar);
    238238}
     239
     240void SetRefVariable( const char *varname, const char *expression ){
     241    ////////////////////////////////////////
     242    // 変数のタイプ型を識別して、演算を行う
     243    ////////////////////////////////////////
     244
     245    int VarType,CalcType;
     246    LONG_PTR lpVarIndex,lpCalcIndex;
     247    BOOL bCalcUseHeap;
     248
     249    //型を識別
     250    VarType=GetVarType(varname,&lpVarIndex,0);
     251    if(VarType==-1){
     252        SetError(300,NULL,cp);
     253        return;
     254    }
     255
     256    extern LONG_PTR ProcPtr_BaseIndex;
     257    if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;
     258    else ProcPtr_BaseIndex=-1;
     259
     260    //NumOpe...(rax、またはxmm0に答えが格納される)
     261    int reg=REG_RAX;
     262    CalcType=NumOpe(&reg,expression,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
     263
     264    //結果を格納しているレジスタをブロッキング
     265    pobj_BlockReg->lock(reg);
     266
     267    if(VarType==-1||CalcType==-1) return;
     268
     269    //変数アドレスを取得
     270    RELATIVE_VAR VarRelativeVar;
     271    if(!GetVarOffsetReadWrite(
     272        varname,
     273        &VarType,
     274        &VarRelativeVar,
     275        &lpVarIndex)) return;
     276
     277    //レジスタのブロッキングを解除
     278    pobj_BlockReg->clear();
     279
     280    if(VarType&FLAG_PTR){
     281        SetError(14,varname,cp);
     282        return;
     283    }
     284
     285    if( VarType == DEF_OBJECT && VarRelativeVar.dwKind == VAR_REFLOCAL ){
     286        // 参照型オブジェクトへの代入(初期化)はポインタ変数と同様の処理に値する
     287        VarType = PTR_LEVEL_UP( VarType );
     288
     289        VarRelativeVar.dwKind = VAR_LOCAL;
     290
     291        if( CalcType == DEF_OBJECT ){
     292            //右辺値が実体オブジェクトのときは、参照をコピー
     293            CalcType = PTR_LEVEL_UP( DEF_OBJECT );
     294        }
     295    }
     296    else{
     297        SetError(300,NULL,cp);
     298    }
     299
     300
     301    /////////////////////////////////
     302    // 右辺、左辺の型チェックを行う
     303    /////////////////////////////////
     304
     305    CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
     306
     307
     308    /////////////////////////////////////////////////
     309    // rax(実数はxmm0)の内容を変数にコピー
     310    /////////////////////////////////////////////////
     311    SetVariableFromRax(VarType,CalcType,&VarRelativeVar);
     312}
Note: See TracChangeset for help on using the changeset viewer.