Changeset 292 in dev for trunk/abdev


Ignore:
Timestamp:
Aug 22, 2007, 3:46:23 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev
Files:
11 edited

Legend:

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

    r284 r292  
    213213            dummyType = *params[i2];
    214214            bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE;
     215
     216
     217            /////////////////////////////////////////////////////////
     218            // ☆★☆ ジェネリクスサポート ☆★☆
     219
     220            if( dummyType.IsTypeParameter() )
     221            {
     222                // 型パラメータだったとき
     223
     224                int ptrLevel = PTR_LEVEL( dummyType.GetBasicType() );
     225
     226                if( leftType.HasActualGenericType() )
     227                {
     228                    // TODO: GetDummyActualGenericTypeを適切な形に実装し直す
     229                    dummyType = leftType.GetDummyActualGenericType();
     230                }
     231                else
     232                {
     233                    // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする
     234                    dummyType.SetBasicType( DEF_OBJECT );
     235                }
     236
     237                for( int i=0; i<ptrLevel; i++ )
     238                {
     239                    dummyType.PtrLevelUp();
     240                }
     241            }
     242
     243            //
     244            /////////////////////////////////////////////////////////
    215245        }
    216246
  • trunk/abdev/BasicCompiler32/Compile_CallProc.cpp

    r290 r292  
    104104    const CClass *pobj_c = NULL;
    105105    const CMethod *pMethod = NULL;
     106    Type leftType;
    106107    if( pUserProc->GetParentClassPtr() ){
    107108        //クラスのメンバ関数を呼び出す場合はアクセスチェックを行う
     
    118119                {
    119120                    pobj_c = &varType.GetClass();
     121                    leftType = varType;
    120122                }
    121123                else
     
    222224    pobj_parameter->ApplyDefaultParameters( pUserProc->RealParams() );
    223225
     226    // 型パラメータを適用
     227    pobj_parameter->SetLeftType( leftType );
     228
    224229    //エラーチェック
    225230    if( !pobj_parameter->ErrorCheck(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetSecondParmNum() ) ){
  • trunk/abdev/BasicCompiler32/Compile_Var.cpp

    r290 r292  
    230230    {
    231231        // 型パラメータだったとき
     232
     233        int ptrLevel = PTR_LEVEL( resultType.GetBasicType() );
     234
    232235        if( classType.HasActualGenericType() )
    233236        {
     
    239242            // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする
    240243            resultType.SetBasicType( DEF_OBJECT );
     244        }
     245
     246        for( int i=0; i<ptrLevel; i++ )
     247        {
     248            resultType.PtrLevelUp();
    241249        }
    242250    }
     
    436444            pSubscripts = &pVar->GetSubscripts();
    437445            bConst = pVar->IsConst();
     446
     447
     448            /////////////////////////////////////////////////////////
     449            // ☆★☆ ジェネリクスサポート ☆★☆
     450
     451            if( resultType.IsTypeParameter() )
     452            {
     453                // 型パラメータだったとき
     454
     455                int ptrLevel = PTR_LEVEL( resultType.GetBasicType() );
     456
     457                // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする
     458                resultType.SetBasicType( DEF_OBJECT );
     459
     460                for( int i=0; i<ptrLevel; i++ )
     461                {
     462                    resultType.PtrLevelUp();
     463                }
     464            }
     465
     466            //
     467            /////////////////////////////////////////////////////////
    438468
    439469            goto ok;
  • trunk/abdev/BasicCompiler32/NumOpe.cpp

    r290 r292  
    228228                {
    229229                    // 型パラメータだったとき
     230
     231                    int ptrLevel = PTR_LEVEL( resultType.GetBasicType() );
     232
    230233                    if( leftType.HasActualGenericType() )
    231234                    {
     
    237240                        // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする
    238241                        resultType.SetBasicType( DEF_OBJECT );
     242                    }
     243
     244                    for( int i=0; i<ptrLevel; i++ )
     245                    {
     246                        resultType.PtrLevelUp();
    239247                    }
    240248                }
     
    253261    char parameter[VN_SIZE];
    254262
    255     if( (string)term=="a.x")
     263    if( (string)term=="a[1]")
    256264    {
    257265        int test=0;
     
    447455    GetArrayElement(termFull,VarName,ArrayElements);
    448456    if(ArrayElements[0]){
    449         GetVarType(VarName,resultType,false);
    450         if( resultType.IsObject() ){
    451             CallIndexerGetterProc(/*UseReg,*/&resultType.GetClass(),VarName,ArrayElements,resultType);
     457        Type leftType;
     458        GetVarType(VarName,leftType,false);
     459        if( leftType.IsObject() )
     460        {
     461            CallIndexerGetterProc(/*UseReg,*/&resultType.GetClass(),VarName, leftType, ArrayElements,resultType);
    452462
    453463            isLiteral = false;
  • trunk/abdev/BasicCompiler32/Opcode.h

    r290 r292  
    175175    int ParmsNum;
    176176
     177    Type leftType;
    177178    Type returnType;
    178179
     
    186187    ParamImpl(const Parameters &params);
    187188    ~ParamImpl();
     189    void SetLeftType( const Type &type )
     190    {
     191        this->leftType = type;
     192    }
    188193    void SetReturnType( const Type &returnType );
    189194
     
    222227int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
    223228void CallCastOperatorProc(Type &calcType,BOOL bCalcUseHeap,const Type &toType);
    224 void CallIndexerGetterProc(const CClass *pobj_Class,char *ObjectName,char *Parameter,Type &resultType);
     229void CallIndexerGetterProc(const CClass *pobj_Class,char *ObjectName, const Type &leftType, char *Parameter,Type &resultType);
    225230
    226231//Compile_Statement.cpp
  • trunk/abdev/BasicCompiler32/OperatorProc.cpp

    r290 r292  
    252252    SetError(-1,"キャスト演算子がオーバーロードされていません。",cp);
    253253}
    254 void CallIndexerGetterProc(const CClass *pobj_Class,char *ObjectName,char *Parameter,Type &resultType){
     254void CallIndexerGetterProc(const CClass *pobj_Class,char *ObjectName, const Type &leftType, char *Parameter,Type &resultType){
    255255    std::vector<const UserProc *> subs;
    256256    pobj_Class->GetMethods().Enum( CALC_ARRAY_GET, subs );
     
    261261    Opcode_CallProc(Parameter,subs[0],0,ObjectName);
    262262    resultType = subs[0]->ReturnType();
    263 }
     263
     264
     265    /////////////////////////////////////////////////////////
     266    // ☆★☆ ジェネリクスサポート ☆★☆
     267
     268    if( resultType.IsTypeParameter() )
     269    {
     270        // 型パラメータだったとき
     271
     272        int ptrLevel = PTR_LEVEL( resultType.GetBasicType() );
     273
     274        if( leftType.HasActualGenericType() )
     275        {
     276            // TODO: GetDummyActualGenericTypeを適切な形に実装し直す
     277            resultType = leftType.GetDummyActualGenericType();
     278        }
     279        else
     280        {
     281            // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする
     282            resultType.SetBasicType( DEF_OBJECT );
     283        }
     284
     285        for( int i=0; i<ptrLevel; i++ )
     286        {
     287            resultType.PtrLevelUp();
     288        }
     289    }
     290
     291    //
     292    /////////////////////////////////////////////////////////
     293}
  • trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp

    r290 r292  
    301301}
    302302
    303 bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName ){
     303bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName )
     304{
     305    if( (string)term=="a[1]")
     306    {
     307        int test=0;
     308    }
    304309    char parameter[VN_SIZE];
    305310
     
    390395                {
    391396                    // 型パラメータだったとき
     397
     398                    int ptrLevel = PTR_LEVEL( resultType.GetBasicType() );
     399
    392400                    if( leftType.HasActualGenericType() )
    393401                    {
     
    399407                        // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする
    400408                        resultType.SetBasicType( DEF_OBJECT );
     409                    }
     410
     411                    for( int i=0; i<ptrLevel; i++ )
     412                    {
     413                        resultType.PtrLevelUp();
    401414                    }
    402415                }
     
    513526    GetArrayElement(termFull,VarName,ArrayElements);
    514527    if(ArrayElements[0]){
    515         GetVarType(VarName,resultType,false);
    516         if( resultType.IsObject() ){
    517             if( !GetReturnTypeOfIndexerGetterProc( resultType.GetClass(),resultType) ){
     528        Type classType;
     529        GetVarType(VarName,classType,false);
     530        if( classType.IsObject() ){
     531            if( !GetReturnTypeOfIndexerGetterProc( classType, resultType ) ){
    518532                SetError(1,NULL,cp);
    519533                return false;
  • trunk/abdev/BasicCompiler_Common/Subroutine.cpp

    r290 r292  
    228228
    229229        resultType = pUserProc->ReturnType();
     230
     231        Type leftType;
     232        GetVarType( ObjectName, leftType, false );
     233
     234        /////////////////////////////////////////////////////////
     235        // ☆★☆ ジェネリクスサポート ☆★☆
     236
     237        if( resultType.IsTypeParameter() )
     238        {
     239            // 型パラメータだったとき
     240
     241            int ptrLevel = PTR_LEVEL( resultType.GetBasicType() );
     242
     243            if( leftType.HasActualGenericType() )
     244            {
     245                // TODO: GetDummyActualGenericTypeを適切な形に実装し直す
     246                resultType = leftType.GetDummyActualGenericType();
     247            }
     248            else
     249            {
     250                // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする
     251                resultType.SetBasicType( DEF_OBJECT );
     252            }
     253
     254            for( int i=0; i<ptrLevel; i++ )
     255            {
     256                resultType.PtrLevelUp();
     257            }
     258        }
     259
     260        //
     261        /////////////////////////////////////////////////////////
    230262    }
    231263
     
    274306
    275307//インデクサ(getter)の戻り値を取得
    276 bool GetReturnTypeOfIndexerGetterProc( const CClass &objClass, Type &resultType ){
     308bool GetReturnTypeOfIndexerGetterProc( const Type &classType, Type &resultType )
     309{
    277310    vector<const UserProc *> subs;
    278     objClass.GetMethods().Enum( CALC_ARRAY_GET, subs );
     311    classType.GetClass().GetMethods().Enum( CALC_ARRAY_GET, subs );
    279312    if( subs.size() == 0 ){
    280313        return false;
     
    282315
    283316    resultType = subs[0]->ReturnType();
     317
     318
     319    /////////////////////////////////////////////////////////
     320    // ☆★☆ ジェネリクスサポート ☆★☆
     321
     322    if( resultType.IsTypeParameter() )
     323    {
     324        // 型パラメータだったとき
     325
     326        int ptrLevel = PTR_LEVEL( resultType.GetBasicType() );
     327
     328        if( classType.HasActualGenericType() )
     329        {
     330            // TODO: GetDummyActualGenericTypeを適切な形に実装し直す
     331            resultType = classType.GetDummyActualGenericType();
     332        }
     333        else
     334        {
     335            // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする
     336            resultType.SetBasicType( DEF_OBJECT );
     337        }
     338
     339        for( int i=0; i<ptrLevel; i++ )
     340        {
     341            resultType.PtrLevelUp();
     342        }
     343    }
     344
     345    //
     346    /////////////////////////////////////////////////////////
    284347
    285348    return true;
  • trunk/abdev/BasicCompiler_Common/VariableOpe.cpp

    r290 r292  
    480480    {
    481481        // 型パラメータだったとき
     482
     483        int ptrLevel = PTR_LEVEL( resultType.GetBasicType() );
     484
    482485        if( classType.HasActualGenericType() )
    483486        {
     
    489492            // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする
    490493            resultType.SetBasicType( DEF_OBJECT );
     494        }
     495
     496        for( int i=0; i<ptrLevel; i++ )
     497        {
     498            resultType.PtrLevelUp();
    491499        }
    492500    }
  • trunk/abdev/BasicCompiler_Common/common.h

    r290 r292  
    356356bool CallPropertyMethod( const char *variable, const char *rightSide, Type &resultType);
    357357bool GetReturnTypeOfPropertyMethod( const char *variable, const char *rightSide, Type &resultType );
    358 bool GetReturnTypeOfIndexerGetterProc( const CClass &objClass, Type &resultType );
     358bool GetReturnTypeOfIndexerGetterProc( const Type &classType, Type &resultType );
    359359int AddProcPtrInfo( const string &typeExpression, int nowLine );
    360360bool IsNeedProcCompile();
  • trunk/abdev/BasicCompiler_Common/src/Type.cpp

    r290 r292  
    408408bool Type::IsTypeParameter() const
    409409{
    410     return ( basicType == DEF_TYPE_PARAMETER );
     410    return ( NATURAL_TYPE(basicType) == DEF_TYPE_PARAMETER );
    411411}
    412412bool Type::IsObjectClass() const
Note: See TracChangeset for help on using the changeset viewer.