Ignore:
Timestamp:
Sep 27, 2007, 3:37:06 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_Func.cpp

    r331 r332  
    221221    compiler.codeGenerator.op_mov_RV( REG_EAX, typeSize );
    222222}
    223 void Opcode_Func_AddressOf( const char *name, const Type &baseType ){
    224     extern int cp;
    225     const UserProc *pUserProc;
    226 
    227     if( baseType.IsProcPtr() )
    228     {
    229         //左辺の型にのっとり、オーバーロードを解決
    230 
    231         std::vector<const UserProc *> subs;
    232         GetOverloadSubHash( name, subs );
    233         if( subs.size() == 0 ){
    234             SetError(27,name,cp);
    235             return;
    236         }
    237 
    238         //オーバーロードを解決
    239         pUserProc=OverloadSolution(name,subs,compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params(), Type() );
    240 
    241         if(!pUserProc){
    242             SetError(27,name,cp);
    243             return;
    244         }
    245     }
    246     else{
    247         pUserProc=GetSubHash(name);
    248         if(!pUserProc){
    249             SetError(27,name,cp);
    250             return;
    251         }
    252     }
    253 
    254     if( pUserProc->IsVirtual() ){
     223
     224void _Opcode_Func_AddressOf( const char *methodInstanceName, const UserProc &userProc )
     225{
     226    if( userProc.IsVirtual() ){
    255227        ///////////////////////////////
    256228        // 仮想関数の場合
     
    262234        char ObjectName[VN_SIZE];
    263235        ReferenceKind referenceKind;
    264         SplitObjectName(name,ObjectName, referenceKind );
     236        SplitObjectName( methodInstanceName, ObjectName, referenceKind );
    265237
    266238        if(ObjectName[0]){
     
    305277        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
    306278
    307         int i2 = pobj_c->GetFuncNumInVtbl( pUserProc );
     279        int i2 = pobj_c->GetFuncNumInVtbl( &userProc );
    308280
    309281        //mov eax,dword ptr[edx+func_index]
     
    319291
    320292        //mov eax,ProcAddr
    321         compiler.codeGenerator.op_addressof( REG_EAX, pUserProc );
    322     }
    323 
    324     pUserProc->Using();
     293        compiler.codeGenerator.op_addressof( REG_EAX, &userProc );
     294    }
     295
     296    userProc.Using();
     297}
     298void Opcode_CreateSimpleDelegate( const char *methodInstanceName, const UserProc &userProc )
     299{
     300    /////////////////////////////////////////////////////////////////
     301    // 関数ポインタをpush
     302    /////////////////////////////////////////////////////////////////
     303
     304    //push AddressOf(userProc)
     305    _Opcode_Func_AddressOf( methodInstanceName, userProc );
     306    compiler.codeGenerator.op_push( REG_EAX );
     307
     308
     309    /////////////////////////////////////////////////////////////////
     310    // オブジェクト ポインタをpush
     311    /////////////////////////////////////////////////////////////////
     312
     313    // オブジェクト名を取得
     314    char objectName[VN_SIZE];
     315    char memberName[VN_SIZE];
     316    char *thisPtrName = "This";
     317    Type type;
     318    if( SplitMemberName( methodInstanceName, objectName, memberName ) )
     319    {
     320        if( GetVarType( objectName, type, false ) )
     321        {
     322            thisPtrName = objectName;
     323        }
     324    }
     325
     326    // オブジェクト ポインタを取得
     327    RELATIVE_VAR relativeVar;
     328    GetVarOffsetReadOnly( thisPtrName, &relativeVar, type );
     329    if( !type.IsObject() )
     330    {
     331        extern int cp;
     332        SetError(1,NULL,cp);
     333        return;
     334    }
     335
     336    SetVarPtrToEax( &relativeVar );
     337
     338    //mov eax,dword ptr[eax]
     339    compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
     340
     341    //push this
     342    compiler.codeGenerator.op_push( REG_EAX );
     343
     344
     345    /////////////////////////////////////////////////////////////////
     346    // call _System_CreateSimpleDynamicDelegate
     347    /////////////////////////////////////////////////////////////////
     348
     349    // call _System_CreateSimpleDynamicDelegate
     350    extern const UserProc *pSub_System_CreateSimpleDynamicDelegate;
     351    compiler.codeGenerator.op_call( pSub_System_CreateSimpleDynamicDelegate );
     352}
     353void Opcode_Func_AddressOf( const char *name, const Type &baseType, bool isCallOn, Type &resultType ){
     354    extern int cp;
     355    const UserProc *pUserProc;
     356
     357    const Parameters *pBaseParams = NULL;
     358    bool isDelegate = false;
     359    if( baseType.IsProcPtr() )
     360    {
     361        // 左辺で関数ポインタを要求されているとき
     362        pBaseParams = &compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params();
     363    }
     364    else if( baseType.IsObject() && baseType.GetClass().GetName() == "_SimpleDelegate" )
     365    {
     366        extern const Delegate *pConstructingDelegate;
     367        if( !pConstructingDelegate )
     368        {
     369            SetError();
     370        }
     371        // 左辺でデリゲートを要求されているとき
     372        pBaseParams = &pConstructingDelegate->Params();
     373
     374        isDelegate = true;
     375    }
     376
     377    if( pBaseParams )
     378    {
     379        //左辺の型にのっとり、オーバーロードを解決
     380
     381        std::vector<const UserProc *> subs;
     382        GetOverloadSubHash( name, subs );
     383        if( subs.size() == 0 ){
     384            SetError(27,name,cp);
     385            return;
     386        }
     387
     388        //オーバーロードを解決
     389        pUserProc=OverloadSolution( name, subs, *pBaseParams, Type() );
     390
     391        if(!pUserProc){
     392            SetError(27,name,cp);
     393            return;
     394        }
     395    }
     396    else{
     397        pUserProc=GetSubHash(name);
     398        if(!pUserProc){
     399            SetError(27,name,cp);
     400            return;
     401        }
     402    }
     403
     404    if( isDelegate )
     405    {
     406        if( isCallOn )
     407        {
     408            // デリゲートのとき
     409            Opcode_CreateSimpleDelegate( name, *pUserProc );
     410        }
     411        resultType = baseType;
     412    }
     413    else
     414    {
     415        if( isCallOn )
     416        {
     417            // 関数ポインタのとき
     418            _Opcode_Func_AddressOf( name, *pUserProc );
     419        }
     420        resultType.SetBasicType( DEF_PTR_VOID );
     421    }
    325422}
    326423void Opcode_Func_SizeOf( const string &typeName ){
     
    493590            break;
    494591        case FUNC_ADDRESSOF:
    495             if( isCallOn ) Opcode_Func_AddressOf( Parameter, baseType );
    496             resultType.SetBasicType( DEF_PTR_VOID );
     592            Opcode_Func_AddressOf( Parameter, baseType, isCallOn, resultType );
    497593            break;
    498594        case FUNC_SIZEOF:
Note: See TracChangeset for help on using the changeset viewer.