Changeset 40 in dev for BasicCompiler32/Compile_Calc.cpp


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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_Calc.cpp

    r36 r40  
    600600    }
    601601}
     602
     603void SetRefVariable( const char *varname, const char *expression ){
     604    ////////////////////////////////////////
     605    // 変数のタイプ型を識別して、演算を行う
     606    ////////////////////////////////////////
     607
     608    int VarType,CalcType;
     609    LONG_PTR lpVarIndex,lpCalcIndex;
     610    RELATIVE_VAR VarRelativeVar;
     611    BOOL bCalcUseHeap;
     612
     613    //型を識別
     614    VarType=GetVarType(varname,&lpVarIndex,0);
     615    if(VarType==-1){
     616        SetError(300,NULL,cp);
     617        return;
     618    }
     619
     620    extern LONG_PTR ProcPtr_BaseIndex;
     621    if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;
     622    else ProcPtr_BaseIndex=-1;
     623
     624    if(VarType==DEF_OBJECT){
     625        //代入演算のオーバーロード オペレータに備える
     626
     627        //変数アドレスを取得
     628        if(!GetVarOffsetReadWrite(
     629            varname,
     630            &VarType,
     631            &VarRelativeVar,
     632            &lpVarIndex)) return;
     633
     634        SetVarPtrToEax(&VarRelativeVar);
     635
     636        //push eax
     637        op_push(REG_EAX);
     638    }
     639
     640
     641    //NumOpe...(スタックに答えが格納される)
     642    CalcType=NumOpe(expression,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
     643    if(VarType==-1||CalcType==-1) return;
     644
     645    //変数アドレスを取得
     646    if(!GetVarOffsetReadWrite(
     647        varname,
     648        &VarType,
     649        &VarRelativeVar,
     650        &lpVarIndex)) return;
     651
     652    if(VarType&FLAG_PTR){
     653        SetError(14,varname,cp);
     654        return;
     655    }
     656
     657
     658    if( VarType == DEF_OBJECT && VarRelativeVar.dwKind == VAR_REFLOCAL ){
     659        // 参照型オブジェクトへの代入(初期化)はポインタ変数と同様の処理に値する
     660        VarType = PTR_LEVEL_UP( VarType );
     661
     662        VarRelativeVar.dwKind = VAR_LOCAL;
     663
     664        if( CalcType == DEF_OBJECT ){
     665            //右辺値が実体オブジェクトのときは、参照をコピー
     666            CalcType = PTR_LEVEL_UP( DEF_OBJECT );
     667        }
     668    }
     669    else{
     670        SetError(300,NULL,cp);
     671    }
     672
     673
     674    /////////////////////////////////
     675    // 右辺、左辺の型チェックを行う
     676    /////////////////////////////////
     677
     678    CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
     679
     680
     681    /////////////////////////////////////////////////
     682    // スタックの内容を変数にコピーするコードを抽出
     683    /////////////////////////////////////////////////
     684
     685    if(VarType==DEF_BOOLEAN){
     686        //bool
     687        SetBooleanVariable(CalcType,&VarRelativeVar);
     688    }
     689    else if(VarType==DEF_CHAR||VarType==DEF_BYTE){
     690        //8ビット整数型変数へスタックの内容を格納する
     691        Set8Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
     692    }
     693    else if(VarType==DEF_INTEGER||VarType==DEF_WORD){
     694        //16ビット整数型変数へスタックの内容を格納する
     695        Set16Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
     696    }
     697    else if(VarType==DEF_LONG||VarType==DEF_DWORD||IsPtrType(VarType)){
     698        //32ビット整数型変数へスタックの内容を格納する
     699        if(VarType==DEF_LONG)
     700            SetLongVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
     701        else
     702            SetDWordVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
     703    }
     704    else if(VarType==DEF_INT64||VarType==DEF_QWORD){
     705        //64ビット整数型変数へスタックの内容を格納する
     706        SetInt64Variable(CalcType,&VarRelativeVar);
     707    }
     708    else if(VarType==DEF_DOUBLE){
     709        //Double型変数へスタックの内容を格納する
     710        SetDoubleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
     711    }
     712    else if(VarType==DEF_SINGLE){
     713        //Single型変数へスタックの内容を格納する
     714        SetSingleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
     715    }
     716}
Note: See TracChangeset for help on using the changeset viewer.