Ignore:
Timestamp:
Aug 23, 2007, 6:17:00 PM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler_Common/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/src/BoostSerializationSupport.cpp

    r288 r299  
    1414//boost libraries
    1515#include <boost/foreach.hpp>
     16
     17#include <jenga/include/common/String.h>
    1618
    1719#include "../common.h"
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r297 r299  
    188188        }
    189189
     190        // ジェネリクス構文を分解
    190191        char className[VN_SIZE];
    191         std::vector<std::string> typeParameters;
    192         SplitGenericClassInstance( temporary, className, typeParameters );
     192        Jenga::Common::Strings typeParameterStrings;
     193        SplitGenericClassInstance( temporary, className, typeParameterStrings );
     194
     195        // 型パラメータ文字列から型データを取得
     196        std::vector<Type> actualTypeParameters;
     197        BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings )
     198        {
     199            Type type;
     200            compiler.StringToType( typeParameterStr, type );
     201            actualTypeParameters.push_back( type );
     202        }
    193203
    194204        //継承元クラスを取得
     
    206216            isInheritsClass = true;
    207217
    208             if( !InheritsClass( *pInheritsClass, nowLine ) ){
     218            if( !InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){
    209219                return false;
    210220            }
     
    223233    if( !isInheritsClass ){
    224234        // クラスを一つも継承していないとき
    225         if( !InheritsClass( *compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr(), nowLine ) ){
     235        if( !InheritsClass( *compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr(), Types(), nowLine ) ){
    226236            return false;
    227237        }
     
    241251
    242252        char className[VN_SIZE];
    243         std::vector<std::string> typeParameters;
     253        Jenga::Common::Strings typeParameters;
    244254        SplitGenericClassInstance( temporary, className, typeParameters );
    245255
     
    273283    return true;
    274284}
    275 bool CClass::InheritsClass( const CClass &inheritsClass, int nowLine ){
     285bool CClass::InheritsClass( const CClass &inheritsClass, const Types &actualTypeParameters, int nowLine ){
    276286
    277287    //ループ継承でないかをチェック
     
    300310        }
    301311
     312        // メンバのみ、型パラメータを解決する(メソッドのほうは呼び出し時に解決する)
     313        if( pMember->GetType().IsTypeParameter() )
     314        {
     315            pMember->ResetType( actualTypeParameters[pMember->GetType().GetFormalTypeIndex()] );
     316        }
     317
    302318        dynamicMembers.push_back( pMember );
    303319    }
     
    332348    //継承先のクラスをメンバとして保持する
    333349    SetSuperClass( &inheritsClass );
     350    SetSuperClassActualTypeParameters( actualTypeParameters );
    334351
    335352    return true;
     
    10751092    namespaceScopes.clear();
    10761093
     1094    // 呼び出し元でコンパイル中のクラスポインタをバックアップ
     1095    const CClass *pBackCompilingClass = compiler.pCompilingClass;
     1096
    10771097    for(i=0;;i++){
    10781098        if(basbuf[i]=='\0') break;
     
    11621182
    11631183                //継承させる
    1164                 if( !pobj_c->InheritsClass( *pInheritsClass, i ) ){
     1184                if( !pobj_c->InheritsClass( *pInheritsClass, Types(), i ) ){
    11651185                    goto Interface_InheritsError;
    11661186                }
     
    12701290
    12711291            char className[VN_SIZE];
    1272             std::vector<std::string> typeParameters;
     1292            Jenga::Common::Strings typeParameters;
    12731293            SplitGenericClassInstance( temporary, className, typeParameters );
    12741294
     
    14761496                            if(!MemberVar_LoopRefCheck(pobj_c->GetDynamicMembers()[pobj_c->GetDynamicMembers().size()-1]->GetType().GetClass())){
    14771497                                //エラー回避
    1478                                 pobj_c->GetDynamicMembers()[pobj_c->GetDynamicMembers().size()-1]->GetType().SetBasicType( DEF_PTR_VOID );
     1498                                Type &type = const_cast<Type &>(pobj_c->GetDynamicMembers().back()->GetType());
     1499                                type.SetBasicType( DEF_PTR_VOID );
    14791500                            }
    14801501                            pobj_LoopRefCheck->del(pobj_c->GetName().c_str());
     
    15241545    }
    15251546
     1547    // 呼び出し元でコンパイル中のクラスポインタを元に戻す
     1548    compiler.pCompilingClass = pBackCompilingClass;
    15261549
    15271550    // 名前空間を元に戻す
  • trunk/abdev/BasicCompiler_Common/src/Compiler.cpp

    r290 r299  
    3434
    3535        // ジェネリクスクラスを取得
    36         const CClass *pGenericClass = compiler.GetObjectModule().meta.GetClasses().Find( className );
     36        const CClass *pGenericClass = this->GetObjectModule().meta.GetClasses().Find( className );
    3737
    3838        // 型パラメータの型情報を取得
     
    6262                //関数ポインタ(*Function)
    6363                type.SetBasicType( DEF_PTR_PROC );
    64                 type.SetIndex( compiler.GetObjectModule().meta.GetProcPointers().Add( typeName ) );
     64                type.SetIndex( this->GetObjectModule().meta.GetProcPointers().Add( typeName ) );
    6565                return true;
    6666        }
     
    8888    // Object型だったとき
    8989    if( typeName == "Object" ){
    90         type.SetType( DEF_OBJECT, compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr() );
     90        type.SetType( DEF_OBJECT, this->GetObjectModule().meta.GetClasses().GetObjectClassPtr() );
    9191        return true;
    9292    }
     
    9494    // String型だったとき
    9595    if( typeName == "String" ){
    96         type.SetType( DEF_OBJECT, compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr() );
     96        type.SetType( DEF_OBJECT, this->GetObjectModule().meta.GetClasses().GetStringClassPtr() );
    9797        return true;
    9898    }
     
    102102    // TypeDefされた型
    103103    ////////////////////
    104     int i=compiler.GetObjectModule().meta.GetTypeDefs().GetIndex( typeName );
     104    int i=this->GetObjectModule().meta.GetTypeDefs().GetIndex( typeName );
    105105    if(i!=-1){
    106         type = compiler.GetObjectModule().meta.GetTypeDefs()[i].GetBaseType();
     106        type = this->GetObjectModule().meta.GetTypeDefs()[i].GetBaseType();
    107107        return true;
    108108    }
    109109
    110110    //クラス
    111     const CClass *pobj_c = compiler.GetObjectModule().meta.GetClasses().Find( typeName );
     111    const CClass *pobj_c = this->GetObjectModule().meta.GetClasses().Find( typeName );
    112112    if(pobj_c){
    113113        if( pobj_c->IsStructure() ){
     
    126126
    127127    // 型パラメータ
    128     if( compiler.pCompilingClass )
     128    if( this->pCompilingClass )
    129129    {
    130130        // クラスに属するメソッドをコンパイルしているとき
    131         if( compiler.pCompilingClass->IsExistFormalGenericTypeParameter( typeName ) )
     131        int formalTypeIndex = this->pCompilingClass->GetFormalGenericTypeParameterIndex( typeName );
     132        if( formalTypeIndex != -1 )
    132133        {
    133134            // コンパイル中クラスにおけるジェネリクス用の型パラメータのとき
    134135            type.SetBasicType( DEF_TYPE_PARAMETER );
    135             type.SetClassPtr( compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr() );
     136            type.SetClassPtr( this->GetObjectModule().meta.GetClasses().GetObjectClassPtr() );
     137            type.SetFormalTypeName( typeName );
     138            type.SetFormalTypeIndex( formalTypeIndex );
    136139            return true;
    137140        }
     
    169172        }
    170173        else{
    171             if( compiler.GetObjectModule().meta.GetProcPointers()[type.GetIndex()]->ReturnType().IsNull() ){
     174            if( this->GetObjectModule().meta.GetProcPointers()[type.GetIndex()]->ReturnType().IsNull() ){
    172175                return "*Sub";
    173176            }
  • trunk/abdev/BasicCompiler_Common/src/Type.cpp

    r292 r299  
    493493
    494494
     495void ResolveFormalGenericTypeParameter( Type &typeParameter, const Type &classType, const UserProc *pUserProc )
     496{
     497    /////////////////////////////////////////////////////////
     498    // ☆★☆ ジェネリクスサポート ☆★☆
     499
     500    if( typeParameter.IsTypeParameter() )
     501    {
     502        // 型パラメータだったとき
     503
     504        // ポインタレベルを抽出
     505        int ptrLevel = PTR_LEVEL( typeParameter.GetBasicType() );
     506
     507        if( pUserProc )
     508        {
     509            // 基底クラスでの自己解決
     510            const CClass *pClass = &classType.GetClass();
     511            while( pClass->HasSuperClass() )
     512            {
     513                if( pUserProc->GetParentClassPtr() == &pClass->GetSuperClass() )
     514                {
     515                    if( pClass->GetSuperClassActualTypeParameters().size() )
     516                    {
     517                        typeParameter = pClass->GetSuperClassActualTypeParameters()[0];
     518                    }
     519                }
     520                pClass = &pClass->GetSuperClass();
     521            }
     522        }
     523
     524        if( typeParameter.IsTypeParameter() )
     525        {
     526            if( classType.HasActualGenericType() )
     527            {
     528                // TODO: GetDummyActualGenericTypeを適切な形に実装し直す
     529                typeParameter = classType.GetDummyActualGenericType();
     530            }
     531            else
     532            {
     533                // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする
     534                typeParameter.SetBasicType( DEF_OBJECT );
     535            }
     536        }
     537
     538        for( int i=0; i<ptrLevel; i++ )
     539        {
     540            typeParameter.PtrLevelUp();
     541        }
     542    }
     543
     544    //
     545    /////////////////////////////////////////////////////////
     546}
     547
     548
    495549const string BlittableType::GetCreateStaticMethodFullName() const
    496550{
  • trunk/abdev/BasicCompiler_Common/src/TypeDef.cpp

    r272 r299  
    1313    , baseName( baseName )
    1414{
    15     if( !Compiler::StringToType( baseName, baseType ) ){
     15    if( !compiler.StringToType( baseName, baseType ) ){
    1616        SmoothieException::Throw(3, baseName, nowLine );
    1717        return;
Note: See TracChangeset for help on using the changeset viewer.