Changeset 64 in dev for BasicCompiler32/Compile_Calc.cpp


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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_Calc.cpp

    r62 r64  
    364364    //push eax
    365365    op_push(REG_EAX);
     366}
     367
     368
     369
     370
     371
     372
     373
     374
     375
     376void RestoreDefaultRegisterFromStackMemory( int type ){
     377    //現在のスタックの内容を実数レジスタに保存する
     378    //NumOpeの直後専用
     379    if(type==DEF_DOUBLE){
     380        //fld qword ptr[esp]
     381        op_fld_ptr_esp(DEF_DOUBLE);
     382
     383        //add esp,8
     384        op_add_esp(8);
     385    }
     386    else if(type==DEF_SINGLE){
     387        //fld dword ptr[esp]
     388        op_fld_ptr_esp(DEF_SINGLE);
     389
     390        //add esp,4
     391        op_add_esp(4);
     392    }
     393    else if( Is64Type( type ) ){
     394        //pop eax
     395        op_pop(REG_EAX);
     396
     397        //pop edx
     398        op_pop(REG_EDX);
     399    }
     400    else{
     401        //pop eax
     402        op_pop(REG_EAX);
     403    }
     404}
     405
     406void SetVariableFromEax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar){
     407    /////////////////////////////////////////////////
     408    // eaxの内容を変数にコピーするコードを抽出
     409    /////////////////////////////////////////////////
     410
     411    if(VarType==DEF_BOOLEAN){
     412        //bool
     413        SetBooleanVariable(CalcType,pRelativeVar);
     414    }
     415    else if( IsRealNumberType( VarType ) ){
     416        // Double/Single型変数へレジスタの値を代入
     417        SetRealVariable(VarType, CalcType, pRelativeVar);
     418    }
     419    else if( IsWholeNumberType( VarType ) || VarType == DEF_OBJECT ){
     420        int typeSize = GetTypeSize( VarType, -1 );
     421
     422        //整数変数へraxの値を格納する
     423        SetWholeVariable( typeSize, CalcType, pRelativeVar );
     424    }
     425    else{
     426        SetError(300,NULL,cp);
     427    }
    366428}
    367429
     
    485547    }
    486548
     549
     550    if( lstrcmpi( variable, "This" ) == 0 ){
     551        SetError(133,NULL,cp);
     552        return;
     553    }
     554
     555
    487556    ////////////////////////////////////////
    488557    // 変数のタイプ型を識別して、演算を行う
     
    511580    else ProcPtr_BaseIndex=-1;
    512581
    513     if(VarType==DEF_OBJECT){
    514         //代入演算のオーバーロード オペレータに備える
     582    if(VarType==DEF_STRUCT){
     583        //代入コピーに備える
    515584
    516585        //変数アドレスを取得
     
    544613    }
    545614
    546     if(VarType==DEF_OBJECT){
     615    if(VarType==DEF_STRUCT){
    547616        //オブジェクトインスタンスへの代入
    548         SetObjectVariable(lpVarIndex,CalcType,lpCalcIndex,bCalcUseHeap);
     617        SetStructVariable(lpVarIndex,CalcType,lpCalcIndex,bCalcUseHeap);
    549618        return;
    550619    }
    551620
    552     if(CalcType==DEF_OBJECT){
     621    if(CalcType==DEF_OBJECT && (CalcType!=VarType || lpCalcIndex!=lpVarIndex) ){
    553622        //キャスト演算子のオーバーロードに対応する
    554623        CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex);
     
    568637    /////////////////////////////////////////////////
    569638
     639    //eax、edx:eax、またはst(0)にスタック上のデータを取り出す
     640    RestoreDefaultRegisterFromStackMemory( CalcType );
     641
     642    SetVariableFromEax( VarType, CalcType, &VarRelativeVar );
     643/*
     644    TODO: 消す
    570645    if(VarType==DEF_BOOLEAN){
    571646        //bool
     
    598673        //Single型変数へスタックの内容を格納する
    599674        SetSingleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
    600     }
    601 }
    602 
     675    }*/
     676}
     677
     678
     679// TODO: 消す
     680/*
    603681void SetRefVariable( const char *varname, const char *expression ){
    604682    ////////////////////////////////////////
     
    721799    }
    722800}
     801*/
Note: See TracChangeset for help on using the changeset viewer.