Changeset 301 in dev


Ignore:
Timestamp:
Aug 23, 2007, 10:58:43 PM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev
Files:
11 edited

Legend:

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

    r299 r301  
    159159}
    160160
    161 int ParamImpl::SetParameter( const string &procName, const Parameters &params, int SecondParmNum ){
     161int ParamImpl::SetParameter( const string &procName, const Parameters &params, int SecondParmNum, const UserProc *pUserProc ){
    162162    if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
    163163
     
    215215
    216216            // 型パラメータを解決
    217             ResolveFormalGenericTypeParameter( dummyType, leftType );
     217            ResolveFormalGenericTypeParameter( dummyType, leftType, pUserProc );
    218218        }
    219219
  • trunk/abdev/BasicCompiler32/Compile_CallProc.cpp

    r294 r301  
    244244
    245245    //レジスタ、スタックフレームにセット
    246     int ParmSize = pobj_parameter->SetParameter(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() );
     246    int ParmSize = pobj_parameter->SetParameter(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum(), pUserProc );
    247247
    248248    if(pUserProc->ReturnType().IsStruct() ){
  • trunk/abdev/BasicCompiler32/Compile_Func.cpp

    r299 r301  
    357357
    358358    SetVarPtrToEax(&RelativeVar);
    359 
    360     // TODO: 取り除く(この動きはObjPtrに託す)
    361     /*
    362     if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
    363         //参照をオブジェクトポインタに変更
    364 
    365         //mov eax,dword ptr[eax]
    366         compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
    367 
    368         SetError(-120,NULL,cp);
    369     }*/
    370359}
    371360void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn ){
  • trunk/abdev/BasicCompiler32/Compile_Var.cpp

    r299 r301  
    726726        }
    727727
     728        Type classType( resultType );
     729
    728730        if(!_member_offset(
    729731            isErrorEnabled,
    730732            isWriteAccess,
    731             resultType,
     733            classType,
    732734            member,pRelativeVar,resultType,0)) return false;
    733735
  • trunk/abdev/BasicCompiler32/NumOpe.cpp

    r299 r301  
    233233bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool isWantObject, bool *pIsClassName, bool isProcedureCallOnly ){
    234234    char parameter[VN_SIZE];
    235 
    236     if( (string)term=="a[1]")
    237     {
    238         int test=0;
    239     }
    240235
    241236    // Withを解決
  • trunk/abdev/BasicCompiler32/Opcode.h

    r299 r301  
    203203    void MacroParameterSupport( const Parameters &params );
    204204    void SetStructParameter( const Type &baseType, const char *expression );
    205     int SetParameter( const string &procName, const Parameters &params, int SecondParmNum = -1 );
     205    int SetParameter( const string &procName, const Parameters &params, int SecondParmNum = -1, const UserProc *pUserProc = NULL );
    206206
    207207    //一時オブジェクトパラメータの生成と破棄
  • trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp

    r299 r301  
    303303bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName )
    304304{
    305     if( (string)term=="a[1]")
    306     {
    307         int test=0;
    308     }
    309305    char parameter[VN_SIZE];
    310306
  • trunk/abdev/BasicCompiler_Common/VariableOpe.cpp

    r299 r301  
    473473    resultType = pMember->GetType();
    474474
    475 
    476     /////////////////////////////////////////////////////////
    477     // ☆★☆ ジェネリクスサポート ☆★☆
    478 
    479     if( resultType.IsTypeParameter() )
    480     {
    481         // 型パラメータだったとき
    482 
    483         int ptrLevel = PTR_LEVEL( resultType.GetBasicType() );
    484 
    485         if( classType.HasActualGenericType() )
    486         {
    487             // TODO: GetDummyActualGenericTypeを適切な形に実装し直す
    488             resultType = classType.GetDummyActualGenericType();
    489         }
    490         else
    491         {
    492             // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする
    493             resultType.SetBasicType( DEF_OBJECT );
    494         }
    495 
    496         for( int i=0; i<ptrLevel; i++ )
    497         {
    498             resultType.PtrLevelUp();
    499         }
    500     }
    501 
    502     //
    503     /////////////////////////////////////////////////////////
     475    // 型パラメータを解決
     476    ResolveFormalGenericTypeParameter( resultType, classType );
    504477
    505478
     
    838811
    839812        for(i+=2,i2=0;;i++,i2++){
    840             if(buffer[i]==','||buffer[i]=='('||buffer[i]=='\0'){
     813            if(buffer[i]=='('||buffer[i]=='\0'){
    841814                temporary[i2]=0;
    842815                break;
     
    868841        }
    869842
    870         if( (string)temporary == "T" )
    871         {
    872             int test=0;
    873         }
    874 
    875843        if( !compiler.StringToType( temporary, type ) ){
    876844            SetError(3,temporary,cp);
     
    11601128            continue;
    11611129        }
     1130        if( Parameter[i] == '<' && IsStr == 0 )
     1131        {
     1132            if( IsGenericTypeSourcePart( Parameter + i ) )
     1133            {
     1134                // ジェネリクス構文
     1135                i3=GetStringInGenericBracket(temporary+i2,Parameter+i);
     1136                i+=i3-1;
     1137                i2+=i3-1;
     1138                continue;
     1139            }
     1140            else
     1141            {
     1142                // 一般構文
     1143            }
     1144        }
    11621145        if((Parameter[i]==','&&IsStr==0)||
    11631146            Parameter[i]=='\0'){
  • trunk/abdev/BasicCompiler_Common/include/Type.h

    r299 r301  
    227227
    228228    // 未完成
    229     const Type &GetDummyActualGenericType() const;
     229    const Type &GetActualGenericType( int index ) const;
    230230    bool HasActualGenericType() const;
    231231
  • trunk/abdev/BasicCompiler_Common/src/Compiler.cpp

    r299 r301  
    2828        // ジェネリッククラスをインスタンス化した型の場合
    2929        int i = 0;
    30         char className[VN_SIZE], typeParameter[VN_SIZE];
     30        char className[VN_SIZE];
    3131        GetIdentifierToken( className, typeName.c_str(), i );
    32         i++;
    33         GetIdentifierToken( typeParameter, typeName.c_str(), i );
    3432
    3533        // ジェネリクスクラスを取得
    3634        const CClass *pGenericClass = this->GetObjectModule().meta.GetClasses().Find( className );
    3735
    38         // 型パラメータの型情報を取得
    39         Type baseType;
    40         StringToType( typeParameter, baseType );
     36        if( !pGenericClass )
     37        {
     38            Jenga::Throw( "StringToType内のジェネリクスクラス取得部分でpGenericClassがNULL" );
     39        }
     40
     41        if( typeName[i] != '<' )
     42        {
     43            Jenga::Throw( "StringToType内でジェネリクス構文の解析に失敗" );
     44        }
    4145
    4246        GenericTypes genericTypes;
    43         genericTypes.push_back( GenericType( "(non support)", baseType ) );
     47        while( true )
     48        {
     49            i++;
     50
     51            char typeParameter[VN_SIZE];
     52            GetIdentifierToken( typeParameter, typeName.c_str(), i );
     53
     54            // 型パラメータの型情報を取得
     55            Type baseType;
     56            StringToType( typeParameter, baseType );
     57
     58            genericTypes.push_back( GenericType( "(non support)", baseType ) );
     59
     60            if( typeName[i] != ',' )
     61            {
     62                break;
     63            }
     64        }
    4465
    4566        // 基本型をセット
  • trunk/abdev/BasicCompiler_Common/src/Type.cpp

    r299 r301  
    455455}
    456456
    457 const Type &Type::GetDummyActualGenericType() const
    458 {
    459     return actualGenericTypes[0].GetType();
     457const Type &Type::GetActualGenericType( int index ) const
     458{
     459    return actualGenericTypes[index].GetType();
    460460}
    461461bool Type::HasActualGenericType() const
     
    515515                    if( pClass->GetSuperClassActualTypeParameters().size() )
    516516                    {
     517                        // TODO: 適切な形に実装し直す(暫定的にトップの型を持ってきている)
    517518                        typeParameter = pClass->GetSuperClassActualTypeParameters()[0];
    518519                    }
     
    526527            if( classType.HasActualGenericType() )
    527528            {
    528                 // TODO: GetDummyActualGenericTypeを適切な形に実装し直す
    529                 typeParameter = classType.GetDummyActualGenericType();
     529                typeParameter = classType.GetActualGenericType( typeParameter.GetFormalTypeIndex() );
    530530            }
    531531            else
Note: See TracChangeset for help on using the changeset viewer.