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/Compile_ProcOp.cpp

    r285 r290  
    267267
    268268    //コンパイル中の関数が属するクラス
    269     compiler.pCompilingClass=pUserProc->GetParentClassPtr();
     269    compiler.pCompilingClass = pUserProc->GetParentClassPtr();
    270270
    271271    //コンパイルスタートをクラス管理クラスに追加
     
    495495                        &compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc(),
    496496                        0,
    497                         "",
    498                         0);
     497                        ""
     498                    );
    499499                }
    500500            }
     
    587587                        &method->GetUserProc(),
    588588                        0,
    589                         "",
    590                         0);
     589                        ""
     590                    );
    591591                }
    592592            }
     
    629629        GetVarOffsetReadWrite(temp,&RelativeVar,Type());
    630630
    631         i3=pUserProc->ReturnType().GetBasicType();
    632 
    633         if(i3==DEF_OBJECT || i3==DEF_STRUCT){
     631        const Type &returnType = pUserProc->ReturnType();
     632        if( returnType.IsObject() || returnType.IsStruct() )
     633        {
    634634            SetVarPtrToEax(&RelativeVar);
    635             if( i3==DEF_OBJECT ){
     635            if( returnType.IsObject() )
     636            {
    636637                //mov eax,dword ptr[eax]
    637638                compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
    638639            }
    639640        }
    640         else if( i3==DEF_DOUBLE
    641             || i3 == DEF_SINGLE )
     641        else if( returnType.IsReal() )
    642642        {
    643643            //fld qword ptr[ebp+offset]
    644644            compiler.codeGenerator.localVarPertialSchedules.push_back(
    645                 compiler.codeGenerator.op_fld_base_offset( i3, REG_EBP, RelativeVar.offset, Schedule::None, true )
     645                compiler.codeGenerator.op_fld_base_offset( returnType.GetBasicType(), REG_EBP, RelativeVar.offset, Schedule::None, true )
    646646            );
    647647        }
    648         else if(i3==DEF_INT64||i3==DEF_QWORD){
    649             //mov eax,dword ptr[ebp+offset]
    650             compiler.codeGenerator.localVarPertialSchedules.push_back(
    651                 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::None, true )
    652             );
    653 
    654             //mov edx,dword ptr[ebp+offset+sizeof(long)]
    655             compiler.codeGenerator.localVarPertialSchedules.push_back(
    656                 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EBP, RelativeVar.offset+sizeof(long), MOD_BASE_DISP32, Schedule::None, true )
    657             );
    658         }
    659         else if(i3==DEF_LONG||i3==DEF_DWORD||
    660             IsPtrType(i3))
     648        else if( returnType.Is64() )
    661649        {
    662650            //mov eax,dword ptr[ebp+offset]
     
    664652                compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::None, true )
    665653            );
    666         }
    667         else if(i3==DEF_INTEGER||i3==DEF_WORD || (Smoothie::IsUnicode()&&i3==DEF_CHAR)){
     654
     655            //mov edx,dword ptr[ebp+offset+sizeof(long)]
     656            compiler.codeGenerator.localVarPertialSchedules.push_back(
     657                compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EBP, RelativeVar.offset+sizeof(long), MOD_BASE_DISP32, Schedule::None, true )
     658            );
     659        }
     660        else if( returnType.GetSize() == sizeof(long) )
     661        {
     662            //mov eax,dword ptr[ebp+offset]
     663            compiler.codeGenerator.localVarPertialSchedules.push_back(
     664                compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::None, true )
     665            );
     666        }
     667        else if( returnType.GetSize() == sizeof(short) )
     668        {
    668669            //xor eax,eax(eaxを0に初期化する)
    669670            compiler.codeGenerator.op_zero_reg(REG_EAX);
     
    674675            );
    675676        }
    676         else if(i3==DEF_SBYTE||i3==DEF_BYTE||i3==DEF_BOOLEAN || (Smoothie::IsUnicode()==false&&i3==DEF_CHAR)){
     677        else if( returnType.GetSize() == sizeof(char) )
     678        {
    677679            //xor eax,eax(eaxを0に初期化する)
    678680            compiler.codeGenerator.op_zero_reg(REG_EAX);
     
    682684                compiler.codeGenerator.op_mov_RM( sizeof(char), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::None, true )
    683685            );
     686        }
     687        else
     688        {
     689            SetError();
    684690        }
    685691    }
Note: See TracChangeset for help on using the changeset viewer.