Ignore:
Timestamp:
Aug 21, 2007, 11:00:25 PM (17 years ago)
Author:
dai_9181
Message:

ジェネリクスのベースを実装

File:
1 edited

Legend:

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

    r276 r290  
    122122    else if( resultType.IsWhole() || resultType.IsObject()){
    123123        //整数型
    124         SetReg_WholeVariable(resultType.GetBasicType(),&relativeVar,useReg);
     124        SetReg_WholeVariable(resultType,&relativeVar,useReg);
    125125    }
    126126    else if( resultType.IsStruct() ){
     
    142142    return true;
    143143}
    144 bool TermMemberOpe( const CClass &objClass, const Type &baseType, Type &resultType, const char *termFull, const char *termLeft, const char *member ){
     144bool TermMemberOpe( const Type &leftType, const Type &baseType, Type &resultType, const char *termFull, const char *termLeft, const char *member )
     145{
     146    const CClass &objClass = leftType.GetClass();
     147
    145148    const int useReg = REG_EAX;
    146149
    147     if( GetMemberType( objClass, member, resultType, 0, false ) ){
     150    if( GetMemberType( leftType, member, resultType, 0, false ) ){
    148151        // メンバが見つかったとき
    149152
     
    157160            true,   //エラー表示あり
    158161            false,  //読み込み専用
    159             objClass,
     162            leftType,
    160163            member,&relativeVar,resultType,0)){
    161164                return false;
     
    194197                compiler.codeGenerator.op_push( useReg );
    195198
    196                 if( !Opcode_CallProc(parameter,pUserProc,PROCFLAG_NEW,termLeft,0 ) ){
     199                if( !Opcode_CallProc(parameter,pUserProc,PROCFLAG_NEW,termLeft) ){
    197200
    198201                    return false;
     
    217220
    218221                //SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);
     222
     223
     224                /////////////////////////////////////////////////////////
     225                // ☆★☆ ジェネリクスサポート ☆★☆
     226
     227                if( resultType.IsTypeParameter() )
     228                {
     229                    // 型パラメータだったとき
     230                    if( leftType.HasActualGenericType() )
     231                    {
     232                        // TODO: GetDummyActualGenericTypeを適切な形に実装し直す
     233                        resultType = leftType.GetDummyActualGenericType();
     234                    }
     235                    else
     236                    {
     237                        // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする
     238                        resultType.SetBasicType( DEF_OBJECT );
     239                    }
     240                }
     241
     242                //
     243                /////////////////////////////////////////////////////////
    219244            }
    220245           
     
    227252bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool isWantObject, bool *pIsClassName, bool isProcedureCallOnly ){
    228253    char parameter[VN_SIZE];
     254
     255    if( (string)term=="a.x")
     256    {
     257        int test=0;
     258    }
    229259
    230260    // Withを解決
     
    279309        }
    280310
    281         return TermMemberOpe( leftType.GetClass(), baseType, resultType, termFull, termLeft, member );
     311        return TermMemberOpe( leftType, baseType, resultType, termFull, termLeft, member );
    282312    }
    283313globalArea:
Note: See TracChangeset for help on using the changeset viewer.