Ignore:
Timestamp:
Oct 3, 2007, 3:42:05 AM (17 years ago)
Author:
dai_9181
Message:

64ビットコンパイラもデリゲートに対応させた

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler64/NumOpe.cpp

    r331 r339  
    135135    const CClass &objClass = leftType.GetClass();
    136136
    137     int UseReg=pobj_reg->GetNextReg();
    138     int XmmReg=pobj_reg->GetNextXmmReg();
    139 
    140 
     137    const int useReg=pobj_reg->GetNextReg();
     138    const int xmmReg=pobj_reg->GetNextXmmReg();
     139
     140
     141    ////////////////////////////////
     142    // インデクサ(getアクセサ)
     143    ////////////////////////////////
     144    char VarName[VN_SIZE],ArrayElements[VN_SIZE];
     145    GetArrayElement(member,VarName,ArrayElements);
     146    if(ArrayElements[0]){
     147        Type classType;
     148        GetMemberType( leftType, VarName, classType, 0, false );
     149        if( classType.IsObject() )
     150        {
     151            //オブジェクトポインタをr11にコピー
     152            compiler.codeGenerator.op_mov_RR( REG_R11, useReg );
     153
     154            RELATIVE_VAR relativeVar;
     155            relativeVar.dwKind=VAR_DIRECTMEM;
     156
     157            if( !_member_offset(
     158                true,   //エラー表示あり
     159                false,  //読み込み専用
     160                leftType,
     161                VarName,&relativeVar,classType,0))
     162            {
     163                return false;
     164            }
     165
     166            // オブジェクトメンバのポインタをraxにコピー
     167            if( !VarToReg( relativeVar, baseType, resultType ) ){
     168                SetError(11,termFull,cp);
     169            }
     170
     171            //////////////////////////////////////////////////////
     172            /////    レジスタ資源のバックアップ
     173            {   BACKUP_REGISTER_RESOURCE
     174            //////////////////////////////////////////////////////
     175
     176                //オブジェクトポインタをスタックに入れておく
     177                //mov qword ptr[rsp+offset],reg     ※スタックフレームを利用
     178                pobj_sf->push( useReg );
     179
     180                char objectFullName[VN_SIZE], dummyArrayElements[VN_SIZE];
     181                GetArrayElement(termFull,objectFullName,dummyArrayElements);
     182
     183                CallIndexerGetterProc(useReg,classType,objectFullName, ArrayElements,resultType, PROCFLAG_NEW );
     184
     185                pobj_sf->pop();
     186
     187            /////////////////////////////////////////////
     188            //////   レジスタ資源を復元
     189                RESTORE_REGISTER_RESOURCE
     190            }////////////////////////////////////////////
     191
     192            return true;
     193        }
     194    }
     195
     196
     197    ///////////////////////////////////////////////////////////////////
     198    // メンバを検索
     199    ///////////////////////////////////////////////////////////////////
    141200    if( GetMemberType( leftType, member, resultType, 0, false ) ){
    142201        // メンバが見つかったとき
    143202
    144203        //オブジェクトポインタをr11にコピー
    145         compiler.codeGenerator.op_mov_RR( REG_R11, UseReg );
     204        compiler.codeGenerator.op_mov_RR( REG_R11, useReg );
    146205
    147206        RELATIVE_VAR relativeVar;
     
    191250                //オブジェクトポインタをスタックに入れておく
    192251                //mov qword ptr[rsp+offset],reg     ※スタックフレームを利用
    193                 pobj_sf->push( UseReg );
     252                pobj_sf->push( useReg );
    194253
    195254                if( !Opcode_CallProc(parameter,pUserProc,PROCFLAG_NEW,termLeft ) ){
     
    217276                }
    218277
    219                 SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);
     278                SetUseRegFromRax(resultType.GetBasicType(),useReg,xmmReg);
    220279
    221280                // 型パラメータを解決
Note: See TracChangeset for help on using the changeset viewer.