Changeset 75 in dev for BasicCompiler32/Compile_Calc.cpp


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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_Calc.cpp

    r67 r75  
    415415    int i,i2,i3;
    416416    char variable[VN_SIZE];
     417
     418
     419
     420    //////////////////////////////////////
     421    // インクリメント・デクリメント
     422    //////////////////////////////////////
    417423
    418424    for(i=0;;i++){
     
    465471            }
    466472
    467             LONG_PTR lp;
    468             if(GetVarType(variable,&lp,0)!=-1){
     473            if(GetVarType(variable,Type(),0)){
    469474                //変数リストに該当したとき
    470475                SetError(1,NULL,cp);
     
    510515
    511516    char ObjName[VN_SIZE],array_element[VN_SIZE];
    512     CClass *pobj_c;
    513517    GetArrayElement(variable,ObjName,array_element);
    514518    if(array_element[0]){
    515         i2=GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);
    516         if(i2==DEF_OBJECT){
     519        Type varType;
     520        if( GetVarType(ObjName,varType,0) && varType.IsObject() ){
    517521            char temporary[VN_SIZE];
    518522            sprintf(temporary,"%s.%c%c%c",ObjName,1,ESC_OPERATOR,CALC_ARRAY_SET);
     
    522526
    523527            int idProc;
    524             void *pInfo;
    525             idProc=GetProc(temporary,&pInfo);
     528            void *pProc;
     529            idProc=GetProc(temporary,(void **)&pProc);
    526530            if(idProc){
    527                 CallProc(idProc,pInfo,temporary,temp2,NULL);
     531                CallProc(idProc,pProc,temporary,temp2,Type());
    528532                return;
    529533            }
     
    542546    ////////////////////////////////////////
    543547
    544     int VarType,CalcType;
    545     LONG_PTR lpVarIndex,lpCalcIndex;
     548    Type varType;
     549
     550    //型を識別
     551    if( !GetVarType(variable,varType,false) ){
     552
     553        // プロパティ用のメソッドを呼び出す
     554        if(!CallPropertyMethod( variable, Command+i+1, Type() )){
     555            //エラーを表示
     556            GetVarType(variable,varType,true);
     557        }
     558
     559        return;
     560    }
     561
     562    extern LONG_PTR ProcPtr_BaseIndex;
     563    if(varType.IsProcPtr()) ProcPtr_BaseIndex=varType.GetIndex();
     564    else ProcPtr_BaseIndex=-1;
     565
    546566    RELATIVE_VAR VarRelativeVar;
    547     BOOL bCalcUseHeap;
    548 
    549     //型を識別
    550     VarType=GetVarType(variable,&lpVarIndex,0);
    551     if(VarType==-1){
    552 
    553         // プロパティ用のメソッドを呼び出す
    554         if(!CallPropertyMethod(variable,Command+i+1,NULL)){
    555             //エラーを表示
    556             GetVarType(variable,&lpVarIndex,1);
    557         }
    558 
    559         return;
    560     }
    561 
    562     extern LONG_PTR ProcPtr_BaseIndex;
    563     if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;
    564     else ProcPtr_BaseIndex=-1;
    565 
    566     if(VarType==DEF_STRUCT){
     567    if( varType.IsStruct() ){
    567568        //代入コピーに備える
    568569
     
    570571        if(!GetVarOffsetReadWrite(
    571572            variable,
    572             &VarType,
    573573            &VarRelativeVar,
    574             &lpVarIndex)) return;
     574            varType)) return;
    575575
    576576        SetVarPtrToEax(&VarRelativeVar);
     
    582582
    583583    //NumOpe...(スタックに答えが格納される)
    584     CalcType=NumOpe(Command+i+1,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
    585     if(VarType==-1||CalcType==-1) return;
     584    BOOL bCalcUseHeap;
     585    Type calcType;
     586    if( !NumOpe(Command+i+1,varType,calcType,&bCalcUseHeap) ){
     587        return;
     588    }
    586589
    587590    //変数アドレスを取得
    588591    if(!GetVarOffsetReadWrite(
    589592        variable,
    590         &VarType,
    591593        &VarRelativeVar,
    592         &lpVarIndex)) return;
    593 
    594     if(VarType&FLAG_PTR){
     594        varType)) return;
     595
     596    if(varType.GetBasicType()&FLAG_PTR){
    595597        SetError(14,variable,cp);
    596598        return;
    597599    }
    598600
    599     if(VarType==DEF_STRUCT){
    600         //オブジェクトインスタンスへの代入
    601         SetStructVariable(lpVarIndex,CalcType,lpCalcIndex,bCalcUseHeap);
     601    if( varType.IsStruct() ){
     602        //構造体インスタンスへの代入
     603        SetStructVariable(varType,calcType,bCalcUseHeap);
    602604        return;
    603605    }
    604606
    605     if(CalcType==DEF_OBJECT && (CalcType!=VarType || lpCalcIndex!=lpVarIndex) ){
     607    if( calcType.IsObject() && !calcType.Equals( varType ) ){
    606608        //キャスト演算子のオーバーロードに対応する
    607         CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex);
     609        CallCastOperatorProc(calcType,bCalcUseHeap,varType);
    608610    }
    609611
     
    614616    /////////////////////////////////
    615617
    616     CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
     618    CheckDifferentType(varType,calcType,0,0);
    617619
    618620
     
    622624
    623625    //eax、edx:eax、またはst(0)にスタック上のデータを取り出す
    624     RestoreDefaultRegisterFromStackMemory( CalcType );
    625 
    626     SetVariableFromEax( VarType, CalcType, &VarRelativeVar );
    627 /*
    628     TODO: 消す
    629     if(VarType==DEF_BOOLEAN){
    630         //bool
    631         SetBooleanVariable(CalcType,&VarRelativeVar);
    632     }
    633     else if(VarType==DEF_SBYTE||VarType==DEF_BYTE || (isUnicode==false&&VarType==DEF_CHAR)){
    634         //8ビット整数型変数へスタックの内容を格納する
    635         Set8Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
    636     }
    637     else if(VarType==DEF_INTEGER||VarType==DEF_WORD || (isUnicode&&VarType==DEF_CHAR)){
    638         //16ビット整数型変数へスタックの内容を格納する
    639         Set16Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
    640     }
    641     else if(VarType==DEF_LONG||VarType==DEF_DWORD||IsPtrType(VarType)){
    642         //32ビット整数型変数へスタックの内容を格納する
    643         if(VarType==DEF_LONG)
    644             SetLongVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
    645         else
    646             SetDWordVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
    647     }
    648     else if(VarType==DEF_INT64||VarType==DEF_QWORD){
    649         //64ビット整数型変数へスタックの内容を格納する
    650         SetInt64Variable(CalcType,&VarRelativeVar);
    651     }
    652     else if(VarType==DEF_DOUBLE){
    653         //Double型変数へスタックの内容を格納する
    654         SetDoubleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
    655     }
    656     else if(VarType==DEF_SINGLE){
    657         //Single型変数へスタックの内容を格納する
    658         SetSingleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
    659     }*/
    660 }
    661 
    662 
    663 // TODO: 消す
    664 /*
    665 void SetRefVariable( const char *varname, const char *expression ){
    666     ////////////////////////////////////////
    667     // 変数のタイプ型を識別して、演算を行う
    668     ////////////////////////////////////////
    669 
    670     int VarType,CalcType;
    671     LONG_PTR lpVarIndex,lpCalcIndex;
    672     RELATIVE_VAR VarRelativeVar;
    673     BOOL bCalcUseHeap;
    674 
    675     //型を識別
    676     VarType=GetVarType(varname,&lpVarIndex,0);
    677     if(VarType==-1){
    678         SetError(300,NULL,cp);
    679         return;
    680     }
    681 
    682     extern LONG_PTR ProcPtr_BaseIndex;
    683     if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;
    684     else ProcPtr_BaseIndex=-1;
    685 
    686     if(VarType==DEF_OBJECT){
    687         //代入演算のオーバーロード オペレータに備える
    688 
    689         //変数アドレスを取得
    690         if(!GetVarOffsetReadWrite(
    691             varname,
    692             &VarType,
    693             &VarRelativeVar,
    694             &lpVarIndex)) return;
    695 
    696         SetVarPtrToEax(&VarRelativeVar);
    697 
    698         //push eax
    699         op_push(REG_EAX);
    700     }
    701 
    702 
    703     //NumOpe...(スタックに答えが格納される)
    704     CalcType=NumOpe(expression,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
    705     if(VarType==-1||CalcType==-1) return;
    706 
    707     //変数アドレスを取得
    708     if(!GetVarOffsetReadWrite(
    709         varname,
    710         &VarType,
    711         &VarRelativeVar,
    712         &lpVarIndex)) return;
    713 
    714     if(VarType&FLAG_PTR){
    715         SetError(14,varname,cp);
    716         return;
    717     }
    718 
    719 
    720     if( VarType == DEF_OBJECT
    721         && (VarRelativeVar.dwKind == VAR_REFLOCAL || VarRelativeVar.dwKind == VAR_REFGLOBAL ) ){
    722         // 参照型オブジェクトへの代入(初期化)はポインタ変数と同様の処理に値する
    723         PTR_LEVEL_UP( VarType );
    724 
    725         if( VarRelativeVar.dwKind == VAR_REFGLOBAL ){
    726             VarRelativeVar.dwKind = VAR_GLOBAL;
    727         }
    728         else if( VarRelativeVar.dwKind == VAR_REFLOCAL ){
    729             VarRelativeVar.dwKind = VAR_LOCAL;
    730         }
    731 
    732         if( CalcType == DEF_OBJECT ){
    733             //右辺値が実体オブジェクトのときは、参照をコピー
    734             PTR_LEVEL_UP( CalcType );
    735         }
    736     }
    737     else{
    738         SetError(300,NULL,cp);
    739     }
    740 
    741 
    742     /////////////////////////////////
    743     // 右辺、左辺の型チェックを行う
    744     /////////////////////////////////
    745 
    746     CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
    747 
    748 
    749     /////////////////////////////////////////////////
    750     // スタックの内容を変数にコピーするコードを抽出
    751     /////////////////////////////////////////////////
    752 
    753     if(VarType==DEF_BOOLEAN){
    754         //bool
    755         SetBooleanVariable(CalcType,&VarRelativeVar);
    756     }
    757     else if(VarType==DEF_SBYTE||VarType==DEF_BYTE || (isUnicode==false&&VarType==DEF_CHAR)){
    758         //8ビット整数型変数へスタックの内容を格納する
    759         Set8Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
    760     }
    761     else if(VarType==DEF_INTEGER||VarType==DEF_WORD || (isUnicode&&VarType==DEF_CHAR)){
    762         //16ビット整数型変数へスタックの内容を格納する
    763         Set16Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
    764     }
    765     else if(VarType==DEF_LONG||VarType==DEF_DWORD||IsPtrType(VarType)){
    766         //32ビット整数型変数へスタックの内容を格納する
    767         if(VarType==DEF_LONG)
    768             SetLongVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
    769         else
    770             SetDWordVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
    771     }
    772     else if(VarType==DEF_INT64||VarType==DEF_QWORD){
    773         //64ビット整数型変数へスタックの内容を格納する
    774         SetInt64Variable(CalcType,&VarRelativeVar);
    775     }
    776     else if(VarType==DEF_DOUBLE){
    777         //Double型変数へスタックの内容を格納する
    778         SetDoubleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
    779     }
    780     else if(VarType==DEF_SINGLE){
    781         //Single型変数へスタックの内容を格納する
    782         SetSingleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
    783     }
    784 }
    785 */
     626    RestoreDefaultRegisterFromStackMemory( calcType.GetBasicType() );
     627
     628    SetVariableFromEax(varType.GetBasicType(),calcType.GetBasicType(),&VarRelativeVar);
     629}
Note: See TracChangeset for help on using the changeset viewer.