Changeset 334 in dev for trunk/abdev/BasicCompiler32


Ignore:
Timestamp:
Sep 28, 2007, 12:05:10 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler32
Files:
7 edited

Legend:

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

    r332 r334  
    296296    userProc.Using();
    297297}
    298 void Opcode_CreateSimpleDelegate( const char *methodInstanceName, const UserProc &userProc )
     298void Opcode_CreateSimpleDelegate( const CClass &dgClass, const char *methodInstanceName, const UserProc &userProc )
    299299{
    300300    /////////////////////////////////////////////////////////////////
     
    339339    compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
    340340
    341     //push this
     341    //push eax
    342342    compiler.codeGenerator.op_push( REG_EAX );
    343343
     
    347347    /////////////////////////////////////////////////////////////////
    348348
     349    std::vector<const UserProc *> subs;
     350    dgClass.GetStaticMethods().Enum( "_CreateDelegate", subs );
     351
    349352    // call _System_CreateSimpleDynamicDelegate
    350     extern const UserProc *pSub_System_CreateSimpleDynamicDelegate;
    351     compiler.codeGenerator.op_call( pSub_System_CreateSimpleDynamicDelegate );
     353    compiler.codeGenerator.op_call( subs[0] );
    352354}
    353355void Opcode_Func_AddressOf( const char *name, const Type &baseType, bool isCallOn, Type &resultType ){
     
    356358
    357359    const Parameters *pBaseParams = NULL;
    358     bool isDelegate = false;
    359360    if( baseType.IsProcPtr() )
    360361    {
     
    362363        pBaseParams = &compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params();
    363364    }
    364     else if( baseType.IsObject() && baseType.GetClass().GetName() == "_SimpleDelegate" )
    365     {
    366         extern const Delegate *pConstructingDelegate;
    367         if( !pConstructingDelegate )
    368         {
    369             SetError();
    370         }
     365    else if( baseType.IsDelegate() )
     366    {
    371367        // 左辺でデリゲートを要求されているとき
    372         pBaseParams = &pConstructingDelegate->Params();
    373 
    374         isDelegate = true;
     368        pBaseParams = &baseType.GetClass().GetDelegate().Params();
    375369    }
    376370
     
    402396    }
    403397
    404     if( isDelegate )
     398    if( baseType.IsDelegate() )
    405399    {
    406400        if( isCallOn )
    407401        {
    408402            // デリゲートのとき
    409             Opcode_CreateSimpleDelegate( name, *pUserProc );
     403            Opcode_CreateSimpleDelegate( baseType.GetClass(), name, *pUserProc );
    410404        }
    411405        resultType = baseType;
  • trunk/abdev/BasicCompiler32/Compile_Object.cpp

    r332 r334  
    1717
    1818
    19     const Delegate *pBackConstructingDelegate;
    20     if( pobj_c->IsDelegate() )
    21     {
    22         // デリゲートの場合はオーバーロード解決用のグローバル変数をセットする
    23         extern const Delegate *pConstructingDelegate;
    24         pBackConstructingDelegate = pConstructingDelegate;
    25         pConstructingDelegate = &pobj_c->GetDelegate();
    26     }
    27 
    28 
    2919/*  //jnzのジャンプ先番地
    3020    extern int obp;
     
    10696        */
    10797    }
    108 
    109     if( pobj_c->IsDelegate() )
    110     {
    111         // デリゲートの場合はオーバーロード解決用のグローバル変数を元に戻す
    112         extern const Delegate *pConstructingDelegate;
    113         pConstructingDelegate = pBackConstructingDelegate;
    114     }
    11598}
    11699void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter, const Type &baseType ){
  • trunk/abdev/BasicCompiler32/Compile_Var.cpp

    r301 r334  
    250250        if(!GetArrayOffset(pMember->GetSubscripts(),array,pMember->GetType())){
    251251            if(isErrorEnabled) SetError(14,member,cp);
     252            return false;
    252253        }
    253254    }
  • trunk/abdev/BasicCompiler32/MakePeHdr.cpp

    r332 r334  
    4242    *pSub_System_GC_free_for_SweepingDelete,
    4343    *pSubStaticMethod_System_TypeBase_InitializeUserTypes,
    44     *pSub_System_CreateSimpleDynamicDelegate,
    4544
    4645    *pSub_allrem,
     
    284283        pSubStaticMethod_System_TypeBase_InitializeUserTypes->ThisIsAutoGenerationProc();
    285284    }
    286 
    287     pSub_System_CreateSimpleDynamicDelegate = GetSubHash( "_System_CreateSimpleDynamicDelegate", TRUE );
    288285
    289286    if( pUserProc_System_CGarbageCollection_RegisterGlobalRoots = GetClassMethod( "_System_CGarbageCollection", "RegisterGlobalRoots" ) ){
  • trunk/abdev/BasicCompiler32/NumOpe.cpp

    r331 r334  
    147147    const int useReg = REG_EAX;
    148148
     149
     150    ////////////////////////////////
     151    // インデクサ(getアクセサ)
     152    ////////////////////////////////
     153    char VarName[VN_SIZE],ArrayElements[VN_SIZE];
     154    GetArrayElement(member,VarName,ArrayElements);
     155    if(ArrayElements[0]){
     156        Type classType;
     157        GetMemberType( leftType, VarName, classType, 0, false );
     158        if( classType.IsObject() )
     159        {
     160            //オブジェクトポインタをecxにコピー
     161            compiler.codeGenerator.op_mov_RR( REG_ECX, useReg );
     162
     163            RELATIVE_VAR relativeVar;
     164            relativeVar.dwKind=VAR_DIRECTMEM;
     165
     166            if( !_member_offset(
     167                true,   //エラー表示あり
     168                false,  //読み込み専用
     169                leftType,
     170                VarName,&relativeVar,classType,0)){
     171                    return false;
     172            }
     173
     174            // オブジェクトメンバのポインタをeaxにコピー
     175            if( !VarToReg( relativeVar, baseType, resultType ) ){
     176                SetError(11,termFull,cp);
     177            }
     178
     179
     180            //オブジェクトポインタをスタックに入れておく
     181            //push eax
     182            compiler.codeGenerator.op_push( REG_EAX );
     183
     184            char objectFullName[VN_SIZE], dummyArrayElements[VN_SIZE];
     185            GetArrayElement(termFull,objectFullName,dummyArrayElements);
     186
     187            CallIndexerGetterProc(/*UseReg,*/classType,objectFullName, ArrayElements,resultType, PROCFLAG_NEW );
     188
     189            compiler.codeGenerator.op_pop();
     190
     191            return true;
     192        }
     193    }
     194
     195
     196    ///////////////////////////////////////////////////////////////////
     197    // メンバを検索
     198    ///////////////////////////////////////////////////////////////////
    149199    if( GetMemberType( leftType, member, resultType, 0, false ) ){
    150200        // メンバが見つかったとき
  • trunk/abdev/BasicCompiler32/Opcode.h

    r331 r334  
    222222int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
    223223void CallCastOperatorProc(Type &calcType,BOOL bCalcUseHeap,const Type &toType);
    224 void CallIndexerGetterProc( const Type &classType, char *ObjectName, char *Parameter,Type &resultType);
     224void CallIndexerGetterProc( const Type &classType, const char *ObjectName, char *Parameter,Type &resultType, DWORD dwProcFlags = 0 );
    225225
    226226//Compile_Statement.cpp
  • trunk/abdev/BasicCompiler32/OperatorProc.cpp

    r299 r334  
    252252    SetError(-1,"キャスト演算子がオーバーロードされていません。",cp);
    253253}
    254 void CallIndexerGetterProc( const Type &classType, char *ObjectName, char *Parameter,Type &resultType){
     254void CallIndexerGetterProc( const Type &classType, const char *ObjectName, char *Parameter,Type &resultType, DWORD dwProcFlags ){
    255255    std::vector<const UserProc *> subs;
    256256    classType.GetClass().GetMethods().Enum( CALC_ARRAY_GET, subs );
     
    261261    const UserProc *pUserProc = subs[0];
    262262
    263     Opcode_CallProc(Parameter,pUserProc,0,ObjectName);
     263    Opcode_CallProc(Parameter,pUserProc,dwProcFlags,ObjectName);
    264264    resultType = pUserProc->ReturnType();
    265265
Note: See TracChangeset for help on using the changeset viewer.