Changeset 339 in dev for trunk/abdev/BasicCompiler64


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

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

Location:
trunk/abdev/BasicCompiler64
Files:
6 edited

Legend:

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

    r330 r339  
    198198                    return false;
    199199                }
    200                 if( pMethod->IsProtected() ){
     200                if( !pMethod->GetUserProc().GetParentClass().IsEqualsOrSubClass( pobj_c ) && pMethod->IsProtected() ){
    201201                    SetError(110,pUserProc->GetName(),cp);
    202202                    return false;
     
    477477void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params )
    478478{
     479    extern BOOL bDebugCompile;
     480    extern BOOL bDebugSupportProc;
     481    if(bDebugCompile&&bDebugSupportProc==0)
     482        Call_DebugSys_SaveContext();
     483
     484
    479485    ///////////////////////////////////////////////////////////////
    480486    // _System_LocalThisのダミーをセット
     
    482488
    483489    char temporary[VN_SIZE]={0};
     490    bool isDynamicCall = false;
    484491    if( objPtrValueStr && objPtrValueStr[0] ){
    485492        //_System_LocalThis(第一パラメータ)のダミーを作成
    486493        lstrcpy(temporary,"0,");
     494
     495        isDynamicCall = true;
    487496    }
    488497    if( dg.ReturnType().IsStruct() ){
     
    495504    else lstrcat(temporary,params);
    496505
    497 
    498     ParamImpl *pobj_parameter = new ParamImpl( params );
     506    const Parameters *pParams = &dg.Params();
     507    if( isDynamicCall )
     508    {
     509        pParams = &dg.GetDynamicParams();
     510    }
     511
     512
     513    ParamImpl *pobj_parameter = new ParamImpl( temporary );
    499514
    500515    //スタックフレームに存在する既存のパラメータをバックアップ
    501     pobj_parameter->BackupParameter( (int)dg.Params().size() );
     516    pobj_parameter->BackupParameter( (int)pParams->size() );
    502517
    503518    //一時オブジェクトを生成
    504     pobj_parameter->NewTempParameters( dg.GetName(), dg.Params() );
     519    pobj_parameter->NewTempParameters( dg.GetName(), *pParams );
    505520
    506521    //レジスタ、スタックフレームにセット
    507     pobj_parameter->SetParameter( dg.GetName(), dg.Params() );
     522    pobj_parameter->SetParameter( dg.GetName(), *pParams );
    508523
    509524
     
    551566
    552567    //スタックフレームに存在する既存のパラメータを復元
    553     pobj_parameter->RestoreParameter( (int)dg.Params().size() );
     568    pobj_parameter->RestoreParameter( (int)pParams->size() );
    554569
    555570    //パラメータオブジェクトを破棄
  • trunk/abdev/BasicCompiler64/Compile_Func.cpp

    r331 r339  
    7070    return;
    7171}
    72 void Opcode_Func_AddressOf( const char *name, const Type &baseType ){
    73     extern int cp;
    74     const UserProc *pUserProc;
    75 
    76     if( baseType.IsProcPtr() )
    77     {
    78         //左辺の型にのっとり、オーバーロードを解決
    79 
    80         std::vector<const UserProc *> subs;
    81         GetOverloadSubHash( name, subs );
    82         if( subs.size() == 0 ){
    83             SetError(27,name,cp);
    84             return;
    85         }
    86 
    87         //オーバーロードを解決
    88         pUserProc=OverloadSolution(name,subs,compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params(), Type() );
    89 
    90         if(!pUserProc){
    91             SetError(27,name,cp);
    92             return;
    93         }
    94     }
    95     else{
    96         pUserProc=GetSubHash(name);
    97         if(!pUserProc){
    98             SetError(27,name,cp);
    99             return;
    100         }
    101     }
    102 
    103     if( pUserProc->IsVirtual() ){
     72
     73void _Opcode_Func_AddressOf( const char *methodInstanceName, const UserProc &userProc )
     74{
     75    if( userProc.IsVirtual() )
     76    {
    10477        ///////////////////////////////
    10578        // 仮想関数の場合
     
    11184        char ObjectName[VN_SIZE];
    11285        ReferenceKind referenceKind;
    113         SplitObjectName(name,ObjectName, referenceKind );
     86        SplitObjectName(methodInstanceName,ObjectName, referenceKind );
    11487
    11588        if(ObjectName[0]){
     
    151124        compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
    152125
    153         int i2 = pobj_c->GetFuncNumInVtbl( pUserProc );
     126        int i2 = pobj_c->GetFuncNumInVtbl( &userProc );
    154127
    155128        //mov rax,qword ptr[r11+func_index]
     
    165138
    166139        //mov rax,ProcAddr
    167         compiler.codeGenerator.op_addressof( REG_RAX, pUserProc );
    168     }
    169 
    170     pUserProc->Using();
     140        compiler.codeGenerator.op_addressof( REG_RAX, &userProc );
     141    }
     142
     143    userProc.Using();
     144}
     145void Opcode_CreateDelegate( const CClass &dgClass, const char *methodInstanceName, const UserProc &userProc )
     146{
     147    /////////////////////////////////////////////////////////////////
     148    // 関数ポインタをpush
     149    /////////////////////////////////////////////////////////////////
     150
     151    //mov rax,AddressOf
     152    _Opcode_Func_AddressOf( methodInstanceName, userProc );
     153
     154
     155    if( userProc.GetMethod().IsDynamic() )
     156    {
     157        //mov rdx,rax
     158        compiler.codeGenerator.op_mov_RR( REG_RDX, REG_RAX );
     159
     160        pobj_BlockReg->lock( REG_RDX );
     161
     162
     163        /////////////////////////////////////////////////////////////////
     164        // オブジェクト ポインタをpush
     165        /////////////////////////////////////////////////////////////////
     166
     167        // オブジェクト名を取得
     168        char objectName[VN_SIZE];
     169        char memberName[VN_SIZE];
     170        char *thisPtrName = "This";
     171        Type type;
     172        if( SplitMemberName( methodInstanceName, objectName, memberName ) )
     173        {
     174            if( GetVarType( objectName, type, false ) )
     175            {
     176                thisPtrName = objectName;
     177            }
     178        }
     179
     180        // オブジェクト ポインタを取得
     181        RELATIVE_VAR relativeVar;
     182        GetVarOffsetReadOnly( thisPtrName, &relativeVar, type );
     183        if( !type.IsObject() )
     184        {
     185            extern int cp;
     186            SetError(1,NULL,cp);
     187            return;
     188        }
     189
     190        SetVarPtrToReg( REG_RAX, &relativeVar );
     191
     192        //mov rcx,dword ptr[rax]
     193        compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_RCX, REG_RAX, 0, MOD_BASE );
     194
     195        pobj_BlockReg->unlock( REG_RDX );
     196    }
     197    else
     198    {
     199        //mov rcx,rax
     200        compiler.codeGenerator.op_mov_RR( REG_RCX, REG_RAX );
     201    }
     202
     203
     204    /////////////////////////////////////////////////////////////////
     205    // call _CreateDynamicDelegate/_CreateStaticDelegate
     206    /////////////////////////////////////////////////////////////////
     207
     208    std::vector<const UserProc *> subs;
     209    if( userProc.GetMethod().IsDynamic() )
     210    {
     211        dgClass.GetStaticMethods().Enum( "_CreateDynamicDelegate", subs );
     212    }
     213    else
     214    {
     215        dgClass.GetStaticMethods().Enum( "_CreateStaticDelegate", subs );
     216    }
     217
     218    // call _CreateDynamicDelegate
     219    compiler.codeGenerator.op_call( subs[0] );
     220}
     221void Opcode_Func_AddressOf( const char *name, const Type &baseType, bool isCallOn, Type &resultType )
     222{
     223    extern int cp;
     224    const UserProc *pUserProc;
     225
     226    const Parameters *pBaseParams = NULL;
     227    if( baseType.IsProcPtr() )
     228    {
     229        // 左辺で関数ポインタを要求されているとき
     230        pBaseParams = &compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params();
     231    }
     232    else if( baseType.IsDelegate() )
     233    {
     234        // 左辺でデリゲートを要求されているとき
     235        pBaseParams = &baseType.GetClass().GetDelegate().Params();
     236    }
     237
     238    if( pBaseParams )
     239    {
     240        //左辺の型にのっとり、オーバーロードを解決
     241
     242        std::vector<const UserProc *> subs;
     243        GetOverloadSubHash( name, subs );
     244        if( subs.size() == 0 ){
     245            SetError(27,name,cp);
     246            return;
     247        }
     248
     249        //オーバーロードを解決
     250        pUserProc=OverloadSolution( name, subs, *pBaseParams, Type() );
     251
     252        if( isCallOn && baseType.IsDelegate() )
     253        {
     254            // コード生成を伴う場合はエラーチェックを行う
     255            if( !pUserProc->Params().Equals( *pBaseParams )
     256                || !pUserProc->ReturnType().Equals( baseType.GetClass().GetDelegate().ReturnType() ) )
     257            {
     258                if( baseType.IsDelegate() )
     259                {
     260                    SetError(67, name, cp );
     261                }
     262                else
     263                {
     264                    SetError(66, name, cp );
     265                }
     266            }
     267        }
     268
     269        if(!pUserProc){
     270            SetError(27,name,cp);
     271            return;
     272        }
     273    }
     274    else{
     275        pUserProc=GetSubHash(name);
     276        if(!pUserProc){
     277            SetError(27,name,cp);
     278            return;
     279        }
     280    }
     281
     282    if( baseType.IsDelegate() )
     283    {
     284        if( isCallOn )
     285        {
     286            // デリゲートのとき
     287            Opcode_CreateDelegate( baseType.GetClass(), name, *pUserProc );
     288        }
     289        resultType = baseType;
     290    }
     291    else
     292    {
     293        if( isCallOn )
     294        {
     295            // 関数ポインタのとき
     296            _Opcode_Func_AddressOf( name, *pUserProc );
     297        }
     298        resultType.SetBasicType( DEF_PTR_VOID );
     299    }
    171300}
    172301void Opcode_Func_SizeOf( const string &typeName ){
     
    262391        i = GetOneParameter( paramsStr, i, methodPtrParamStr );
    263392
    264         char objPtrValueStr[VN_SIZE];
     393        char objPtrValueStr[VN_SIZE] = "";
    265394        if( isDynamicCall )
    266395        {
     
    307436            break;
    308437        case FUNC_ADDRESSOF:
    309             if( isCallOn ) Opcode_Func_AddressOf( Parameter, baseType );
    310             resultType.SetBasicType( DEF_PTR_VOID );
     438            Opcode_Func_AddressOf( Parameter, baseType, isCallOn, resultType );
    311439            break;
    312440        case FUNC_SIZEOF:
  • trunk/abdev/BasicCompiler64/Compile_Var.cpp

    r317 r339  
    277277        if(!GetArrayOffset(pMember->GetSubscripts(),array,pMember->GetType())){
    278278            if(isErrorEnabled) SetError(14,member,cp);
     279            return false;
    279280        }
    280281    }
  • 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                // 型パラメータを解決
  • trunk/abdev/BasicCompiler64/Opcode.h

    r331 r339  
    340340int CallOperatorProc(BYTE idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
    341341void CallCastOperatorProc(int reg,Type &calcType,BOOL bCalcUseHeap,const Type &toType);
    342 void CallIndexerGetterProc(int reg, const Type &classType, char *ObjectName,char *Parameter,Type &resultType);
     342void CallIndexerGetterProc(int reg, const Type &classType, const char *ObjectName,char *Parameter,Type &resultType, DWORD dwProcFlags = 0 );
    343343
    344344//Compile_Statement.cpp
  • trunk/abdev/BasicCompiler64/OperatorProc.cpp

    r316 r339  
    321321
    322322//インデクサ(getter)を呼び出す
    323 void CallIndexerGetterProc(int reg, const Type &classType, char *ObjectName,char *Parameter,Type &resultType ){
     323void CallIndexerGetterProc(int reg, const Type &classType, const char *ObjectName,char *Parameter,Type &resultType, DWORD dwProcFlags ){
    324324
    325325    std::vector<const UserProc *> subs;
     
    336336    //////////////////////////////////////////////////////
    337337
    338         Opcode_CallProc(Parameter,pUserProc,0,ObjectName);
     338        Opcode_CallProc(Parameter,pUserProc,dwProcFlags,ObjectName);
    339339        resultType = pUserProc->ReturnType();
    340340
Note: See TracChangeset for help on using the changeset viewer.