Changeset 350 in dev for trunk


Ignore:
Timestamp:
Oct 14, 2007, 9:41:03 PM (17 years ago)
Author:
dai_9181
Message:

インターフェイスを実装

Location:
trunk/abdev
Files:
1 deleted
28 edited

Legend:

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

    r349 r350  
    156156        /////////////////////////////////
    157157        pMethod = NULL;
    158         if( ! isStatic ) pMethod = pobj_c->GetDynamicMethodOfInterfaceMethod( pUserProc );
     158        if( ! isStatic ) pMethod = pobj_c->GetDynamicMethodOrInterfaceMethod( pUserProc );
    159159        if( ! pMethod ){
    160160            //動的メソッドが取得できなかったときは静的メソッドを当たる
     
    280280        //////////////////////////////////////////////////////
    281281        // メンバ関数の場合
    282         // ※_System_LocalThis パラメータをセット
     282        // ※_System_LocalThis パラメータをecxにセット
    283283        //////////////////////////////////////////////////////
    284284
     
    319319            }
    320320        }
    321 
    322         //push ecx
    323         compiler.codeGenerator.op_push(REG_ECX);
    324     }
    325 
    326     if( pUserProc->IsVirtual() && !isFixedClass ){
    327         //仮想関数(オブジェクトメソッド)呼び出し
    328         //pObj->func_table->func1
    329         //                ->func2
    330         //                ->func3
    331 
     321    }
     322
     323    if( pUserProc->IsVirtual() && !isFixedClass )
     324    {
    332325        int vtblIndex;
    333326        if( pobj_c->IsInterface() )
     
    347340
    348341            // インターフェイスの場合は更に__thisを取得する
    349             //mov rcx,qword ptr[rcx+offset_this]
     342            //mov ecx,qword ptr[ecx+offset_this]
    350343            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_ECX, offset_this, MOD_BASE_DISP8 );
    351344
     
    376369            // vtblのポインタを取得
    377370            //mov edx,dword ptr[edx+vtblMasterListIndex]
    378             compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 );
    379         }
     371            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex*PTR_SIZE, MOD_BASE_DISP32 );
     372        }
     373
     374        //push ecx
     375        compiler.codeGenerator.op_push(REG_ECX);   
    380376
    381377        //call dword ptr[edx+func_index]
     
    399395        //通常呼び出し
    400396
     397        if( pUserProc->GetParentClassPtr() && isStatic == false )
     398        {
     399            //push ecx
     400            compiler.codeGenerator.op_push(REG_ECX);
     401        }
     402
    401403        //call ProcAddr
    402404        compiler.codeGenerator.op_call(pUserProc);
  • trunk/abdev/BasicCompiler32/Compile_Func.cpp

    r349 r350  
    315315            // vtblのポインタを取得
    316316            //mov edx,dword ptr[edx+vtblMasterListIndex]
    317             compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 );
     317            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex*PTR_SIZE, MOD_BASE_DISP32 );
    318318        }
    319319
  • trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp

    r331 r350  
    258258        UserProc::CompileStartForUserProc( pBackUserProc );
    259259        cp=BackCp;
     260    }
     261    else if( userProc.HasParentClass()
     262        && userProc.IsCastOperator()
     263        && userProc.ReturnType().IsInterface() )
     264    {
     265        // インターフェイス型にキャストするためのメソッド
     266
     267        int vtblMasterListIndex = userProc.GetParentClass().GetVtblMasterListIndex( &userProc.ReturnType().GetClass() );
     268
     269        char temporary[1024];
     270        sprintf( temporary,
     271            "Return New %s(ObjPtr( This ),Get_LONG_PTR( (Get_LONG_PTR( ObjPtr(This) ) + SizeOf(LONG_PTR)*%d) As VoidPtr ) As VoidPtr )",
     272            userProc.ReturnType().GetClass().GetName().c_str(),
     273            vtblMasterListIndex
     274        );
     275        MakeMiddleCode( temporary );
     276
     277        ChangeOpcode( temporary );
    260278    }
    261279    else{
  • trunk/abdev/BasicCompiler32/Compile_Var.cpp

    r334 r350  
    12141214
    12151215    //New呼び出し
    1216     if( type.IsObject() &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){
     1216    if( type.IsObject()
     1217        && !type.IsInterface()
     1218        &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0
     1219        &&InitBuf[0]=='\0')
     1220    {
    12171221        char objectSize[255];
    12181222        if( subscripts.size() == 0 ){
  • trunk/abdev/BasicCompiler32/NumOpe.cpp

    r347 r350  
    232232    GetVarFormatString(methodName,parameter,lpPtrOffset,dummy,refType);
    233233
    234     objClass.EnumDynamicMethodsOfInterfaceMethods( methodName, userProcs );
     234    objClass.EnumDynamicMethodsOrInterfaceMethods( methodName, userProcs );
    235235    if(userProcs.size()){
    236236        //オーバーロードを解決
     
    819819                    || term[0] == '\"' )
    820820                {
    821                     if( baseType.IsObject() || baseType.IsNull() )
     821                    if( !baseType.IsPointer() )
    822822                    {
    823823                        //要求タイプがオブジェクト、または未定のとき
  • trunk/abdev/BasicCompiler32/Opcode.h

    r334 r350  
    220220//OperatorProc.cpp
    221221void FreeTempObject(int reg,const CClass *pobj_c);
    222 int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
     222int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack, LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
    223223void CallCastOperatorProc(Type &calcType,BOOL bCalcUseHeap,const Type &toType);
    224224void CallIndexerGetterProc( const Type &classType, const char *ObjectName, char *Parameter,Type &resultType, DWORD dwProcFlags = 0 );
  • trunk/abdev/BasicCompiler32/OperatorProc.cpp

    r342 r350  
    2828}
    2929
    30 int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
     30int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack, LONG_PTR *index_stack,BOOL *bUseHeap,int &sp)
     31{
     32    Type leftType( type_stack[sp-2], index_stack[sp-2] );
     33    Type rightType( type_stack[sp-1] & (~FLAG_CAST), index_stack[sp-1] );
     34
    3135    //オーバーロードされたオペレータ関数を呼び出す
    32     CClass *pobj_c;
    33     pobj_c=(CClass *)index_stack[sp-2];
     36    const CClass *pobj_c = &leftType.GetClass();
    3437
    3538    std::vector<const UserProc *> subs;
     
    5255
    5356    if(bTwoTerm){
    54         params.push_back( new Parameter( "", Type( type_stack[sp-1], index_stack[sp-1] ) ) );
     57        params.push_back( new Parameter( "", rightType ) );
    5558    }
    5659
     
    8992    }
    9093
    91     int right_side_size = Type(type_stack[sp-1],index_stack[sp-1]).GetSize();
     94    int right_side_size = rightType.GetSize();
    9295
    9396    if(bTwoTerm){
  • trunk/abdev/BasicCompiler64/BasicCompiler.vcproj

    r345 r350  
    795795                    >
    796796                    <File
    797                         RelativePath=".\Compile_Interface.cpp"
    798                         >
    799                         <FileConfiguration
    800                             Name="Debug|Win32"
    801                             >
    802                             <Tool
    803                                 Name="VCCLCompilerTool"
    804                                 UsePrecompiledHeader="2"
    805                             />
    806                         </FileConfiguration>
    807                         <FileConfiguration
    808                             Name="Release|Win32"
    809                             >
    810                             <Tool
    811                                 Name="VCCLCompilerTool"
    812                                 UsePrecompiledHeader="2"
    813                             />
    814                         </FileConfiguration>
    815                     </File>
    816                     <File
    817797                        RelativePath=".\Compile_Object.cpp"
    818798                        >
  • trunk/abdev/BasicCompiler64/Compile_CallProc.cpp

    r349 r350  
    164164        /////////////////////////////////
    165165        pMethod = NULL;
    166         if( ! isStatic ) pMethod = pobj_c->GetDynamicMethodOfInterfaceMethod( pUserProc );
     166        if( ! isStatic ) pMethod = pobj_c->GetDynamicMethodOrInterfaceMethod( pUserProc );
    167167        if( ! pMethod ){
    168168            //動的メソッドが取得できなかったときは静的メソッドを当たる
  • trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp

    r331 r350  
    179179        UserProc::CompileStartForUserProc( pBackUserProc );
    180180        cp=BackCp;
     181    }
     182    else if( userProc.HasParentClass()
     183        && userProc.IsCastOperator()
     184        && userProc.ReturnType().IsInterface() )
     185    {
     186        // インターフェイス型にキャストするためのメソッド
     187
     188        int vtblMasterListIndex = userProc.GetParentClass().GetVtblMasterListIndex( &userProc.ReturnType().GetClass() );
     189
     190        char temporary[1024];
     191        sprintf( temporary,
     192            "Return New %s(ObjPtr( This ),Get_LONG_PTR( (Get_LONG_PTR( ObjPtr(This) ) + SizeOf(LONG_PTR)*%d) As VoidPtr ) As VoidPtr )",
     193            userProc.ReturnType().GetClass().GetName().c_str(),
     194            vtblMasterListIndex
     195        );
     196        MakeMiddleCode( temporary );
     197
     198        ChangeOpcode( temporary );
    181199    }
    182200    else{
  • trunk/abdev/BasicCompiler64/Compile_Var.cpp

    r339 r350  
    12261226    }
    12271227
    1228     //コンストラクタ呼び出し
    1229     if( type.IsObject() &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){
     1228    //New呼び出し
     1229    if( type.IsObject()
     1230        && !type.IsInterface()
     1231        &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0
     1232        &&InitBuf[0]=='\0')
     1233    {
    12301234        char objectSize[255];
    12311235        if( subscripts.size() == 0 ){
  • trunk/abdev/BasicCompiler64/NumOpe.cpp

    r347 r350  
    233233    GetVarFormatString(methodName,parameter,lpPtrOffset,dummy,refType);
    234234
    235     objClass.EnumDynamicMethodsOfInterfaceMethods( methodName, userProcs );
     235    objClass.EnumDynamicMethodsOrInterfaceMethods( methodName, userProcs );
    236236    if(userProcs.size()){
    237237        //オーバーロードを解決
     
    751751
    752752
     753    if( strstr(expression,"xxxxx"))
     754    {
     755        int test=0;
     756    }
    753757
    754758    ////////////////////////////////
     
    789793                        // ダウンキャストを許可する
    790794                }
    791                 else if( idCalc == CALC_AS
    792                     && type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST ) && ((CClass *)index_stack[sp-1])->IsInterface()
    793                     ){
    794                         // インターフェイスへのキャスト
    795                         // TODO: 実装
    796                         CastToInterface( pobj_reg->GetLockingReg(), REG_R15, *(CClass *)index_stack[sp-2], *(CClass *)index_stack[sp-1] );
    797                 }
    798795                else{
    799796                    //オーバーロードされたオペレータを呼び出す
     
    853850                    || term[0] == '\"' )
    854851                {
    855                     if( baseType.IsObject() || baseType.IsNull() )
     852                    if( !baseType.IsPointer() )
    856853                    {
    857854                        //要求タイプがオブジェクト、または未定のとき
  • trunk/abdev/BasicCompiler64/Opcode.h

    r339 r350  
    245245void SetReg_WholeVariable( const Type &type, RELATIVE_VAR *pRelativeVar,int reg);
    246246
    247 //Compile_Interface.cpp
    248 bool CastToInterface( int reg, int vtblReg, const CClass &baseClass, const CClass &interfaceClass );
    249 
    250247//Compile_Object.cpp
    251248void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter,const Type &baseTypeInfo );
  • trunk/abdev/BasicCompiler64/OperatorProc.cpp

    r345 r350  
    3333}
    3434
    35 int CallOperatorProc(BYTE idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
     35int CallOperatorProc(BYTE idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp)
     36{
     37    Type leftType( type_stack[sp-2], index_stack[sp-2] );
     38    Type rightType( type_stack[sp-1] & (~FLAG_CAST), index_stack[sp-1] );
     39
    3640    //オーバーロードされたオペレータ関数を呼び出す
    37     CClass *pobj_c;
    38     pobj_c=(CClass *)index_stack[sp-2];
     41    const CClass *pobj_c = &leftType.GetClass();
    3942
    4043    std::vector<const UserProc *> subs;
     
    5659    Parameters params;
    5760
    58     if(bTwoTerm){
    59         params.push_back( new Parameter( "", Type( type_stack[sp-1], index_stack[sp-1] ) ) );
     61    if(bTwoTerm)
     62    {
     63        params.push_back( new Parameter( "", rightType ) );
    6064    }
    6165
     
    9498    }
    9599
    96     int right_side_size = Type(type_stack[sp-1],index_stack[sp-1]).GetSize();
     100    int right_side_size = rightType.GetSize();
    97101
    98102    if(bTwoTerm){
  • trunk/abdev/BasicCompiler_Common/MakeExe.cpp

    r322 r350  
    1111    extern HWND hMainDlg;
    1212    PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_STEPIT,0,0);
     13}
     14
     15void MakeMiddleCode( char *buffer )
     16{
     17    // 改行コードをCRLFからLFにする
     18    ChangeReturnCode( buffer );
     19
     20    // コメントを除去
     21    DeleteComment( buffer );
     22
     23    //エスケープシーケンス設定
     24    SetEscapeSequenceFormat( buffer );
     25
     26    //コマンド対応
     27    ChangeCommandToCode( buffer );
    1328}
    1429
     
    1833    lstrcpy(temp,buffer);
    1934
    20     // 改行コードをCRLFからLFにする
    21     ChangeReturnCode(temp);
    22 
    23     // コメントを除去
    24     DeleteComment( temp );
    25 
    26     //エスケープシーケンス設定
    27     SetEscapeSequenceFormat(temp);
    28 
    29     //コマンド対応
    30     ChangeCommandToCode(temp);
     35    MakeMiddleCode( temp );
    3136
    3237    //最後尾に貼り付け
  • trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp

    r347 r350  
    342342
    343343    vector<const UserProc *> userProcs;
    344     leftType.GetClass().EnumDynamicMethodsOfInterfaceMethods( methodName, userProcs );
     344    leftType.GetClass().EnumDynamicMethodsOrInterfaceMethods( methodName, userProcs );
    345345    if(userProcs.size()){
    346346        //オーバーロードを解決
     
    597597    if( expression[0] == '[' ){
    598598        if( !baseType.IsPointer() ){
    599             SetError(1,NULL,cp);
    600599            return false;
    601600        }
     
    716715StrLiteral:
    717716
    718                     if( baseType.IsObject() || baseType.IsNull() ){
     717                    if( !baseType.IsPointer() ){
    719718                        //要求タイプがオブジェクト、または未定のとき
    720719                        type_stack[sp]=DEF_OBJECT;
  • trunk/abdev/BasicCompiler_Common/common.h

    r331 r350  
    274274//MakeExe.cpp
    275275void StepCompileProgress(void);
     276void MakeMiddleCode( char *buffer );
    276277void AddSourceCode(const char *buffer);
    277278void OutputExe(void);
  • trunk/abdev/BasicCompiler_Common/hash.cpp

    r347 r350  
    9090            else{
    9191                //動的メソッドから列挙
    92                 pobj_c->EnumDynamicMethodsOfInterfaceMethods( NestMember, subs );
     92                pobj_c->EnumDynamicMethodsOrInterfaceMethods( NestMember, subs );
    9393            }
    9494
     
    105105
    106106        // 動的メソッド
    107         compiler.pCompilingClass->EnumDynamicMethodsOfInterfaceMethods( name, subs );
     107        compiler.pCompilingClass->EnumDynamicMethodsOrInterfaceMethods( name, subs );
    108108    }
    109109
     
    157157    if( pClass ){
    158158        vector<const UserProc *> userProcs;
    159         pClass->EnumDynamicMethodsOfInterfaceMethods( methodName, userProcs );
     159        pClass->EnumDynamicMethodsOrInterfaceMethods( methodName, userProcs );
    160160        if( userProcs.size() == 1 ){
    161161            return userProcs[0];
  • trunk/abdev/BasicCompiler_Common/include/Class.h

    r349 r350  
    386386
    387387    void AddMethod(CClass *pobj_c, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract,
    388         bool isVirtual, bool isOverride, char *buffer, int nowLine);
     388        bool isVirtual, bool isOverride, bool isAutoGeneration, char *buffer, int nowLine);
    389389
    390390    //重複チェック
     
    409409    }
    410410
    411     void EnumDynamicMethodsOfInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const;
    412     const CMethod *GetDynamicMethodOfInterfaceMethod( const UserProc *pUserProc ) const;
     411    void EnumDynamicMethodsOrInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const;
     412    const CMethod *GetDynamicMethodOrInterfaceMethod( const UserProc *pUserProc ) const;
    413413
    414414    const Methods &GetStaticMethods() const
     
    494494public:
    495495    void GetVtblMasterListIndexAndVtblIndex( const UserProc *pUserProc, int &vtblMasterListIndex, int &vtblIndex ) const;
     496    int GetVtblMasterListIndex( const CClass *pClass ) const;
    496497    long GetVtblMasterListOffset() const;
    497498    void GenerateVTableMasterList( const std::vector<long> &vtableMasterList, long &offset );
     
    513514        , pStringClass( NULL )
    514515        , pObjectClass( NULL )
     516        , pInterfaceInfo( NULL )
    515517    {
    516518    }
  • trunk/abdev/BasicCompiler_Common/include/Procedure.h

    r336 r350  
    323323
    324324    std::string GetFullName() const;
     325    bool IsCastOperator() const;
    325326
    326327    bool IsVirtual() const;
  • trunk/abdev/BasicCompiler_Common/include/Type.h

    r332 r350  
    189189    bool IsAny() const;
    190190    bool IsDelegate() const;
     191    bool IsInterface() const;
    191192
    192193    // オブジェクトや構造体など、メンバを持つ型かどうかを判別する
  • trunk/abdev/BasicCompiler_Common/include/option.h

    r312 r350  
    1919#ifdef USE_TRACE
    2020    // オーバーロードに関するログを生成する
    21     //#define USE_TRACE_FOR_OVERLOAD
     21    #define USE_TRACE_FOR_OVERLOAD
    2222
    2323    // モジュールサイズに関するログを生成する
    24     #define USE_TRACE_FOR_SIZE
     24    //#define USE_TRACE_FOR_SIZE
    2525
    2626    // XMLシリアライズに関するログを生成する
    27     #define USE_TRACE_FOR_SERIALIZE
     27    //#define USE_TRACE_FOR_SERIALIZE
    2828
    2929    // ソースコードステップに関するログを生成する
    30     #define USE_TRACE_FOR_SOURCECODESTEP
     30    //#define USE_TRACE_FOR_SOURCECODESTEP
    3131#endif
    3232
  • trunk/abdev/BasicCompiler_Common/include/ver.h

    r340 r350  
    66// バージョン付加文字列
    77#ifdef _AMD64_
    8 #define VER_INFO        "(x64) (rev.351)"
     8#define VER_INFO        "(x64) (rev.356)"
    99#else
    10 #define VER_INFO        "(rev.351)"
     10#define VER_INFO        "(rev.356)"
    1111#endif
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r349 r350  
    449449    interfaces.push_back( new ::Interface( &interfaceClass ) );
    450450
     451    // キャストメソッドを追加(内部コードは自動生成すること)
     452    {
     453        // Function Operator() As ITest
     454
     455        char temporary[1024];
     456        sprintf(temporary,"%c%c%c%c()%c%c%s",
     457            1, ESC_FUNCTION,
     458            1, ESC_OPERATOR,
     459            1, ESC_AS,
     460            interfaceClass.GetName().c_str()
     461        );
     462
     463        this->AddMethod(this,
     464            Prototype::Public,
     465            0,
     466            false,          // isConst
     467            false,          // isAbstract
     468            false,          // isVirtual
     469            false,          // isOverride
     470            true,           // isAutoGeneration
     471            temporary,
     472            -1
     473        );
     474    }
     475
    451476    return true;
    452477}
     
    505530
    506531void CClass::AddMethod(CClass *pobj_c, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract,
    507                          bool isVirtual, bool isOverride, char *buffer, int nowLine){
     532                         bool isVirtual, bool isOverride, bool isAutoGeneration, char *buffer, int nowLine){
    508533    int i,i2;
    509534    char temporary[VN_SIZE];
     
    522547    UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Add( NamespaceScopes(), NamespaceScopesCollection(), buffer,nowLine,isVirtual,pobj_c, (bStatic!=0) );
    523548    if(!pUserProc) return;
     549
     550    if( isAutoGeneration )
     551    {
     552        // コード自動生成
     553        pUserProc->ThisIsAutoGenerationProc();
     554    }
    524555
    525556
     
    665696}
    666697
    667 void CClass::EnumDynamicMethodsOfInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const
     698void CClass::EnumDynamicMethodsOrInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const
    668699{
    669700    // 動的メソッド
     
    676707    }
    677708}
    678 const CMethod *CClass::GetDynamicMethodOfInterfaceMethod( const UserProc *pUserProc ) const
     709const CMethod *CClass::GetDynamicMethodOrInterfaceMethod( const UserProc *pUserProc ) const
    679710{
    680711    // 動的メソッド
     
    687718        {
    688719            result = pInterface->GetDynamicMethods().GetMethodPtr( pUserProc );
     720            if( result )
     721            {
     722                return result;
     723            }
    689724        }
    690725    }
     
    854889    SetError();
    855890    return;
     891}
     892int CClass::GetVtblMasterListIndex( const CClass *pClass ) const
     893{
     894    int result = 0;
     895
     896    BOOST_FOREACH( const ::Interface *pInterface, interfaces )
     897    {
     898        result++;
     899       
     900        if( &pInterface->GetClass() == pClass )
     901        {
     902            return result;
     903        }
     904    }
     905
     906    SetError();
     907    return 0;
    856908}
    857909long CClass::GetVtblMasterListOffset() const
     
    14281480                pobj_c->AddMethod(pobj_c,
    14291481                    Prototype::Public,  //Publicアクセス権
    1430                     0,                  //Static指定なし
    1431                     false,              //Constではない
    1432                     1,                  //Abstract
    1433                     1,                  //Virtual
    1434                     0,
     1482                    0,                  // bStatic
     1483                    false,              // isConst
     1484                    true,               // isAbstract
     1485                    true,               // isVirtual
     1486                    false,              // isOverride
     1487                    false,              // isAutoGeneration
    14351488                    temporary,
    14361489                    sub_address
     
    17191772                        isVirtual,
    17201773                        isOverride,
     1774                        false,
    17211775                        temporary,
    17221776                        sub_address);
     
    19462000        }
    19472001
    1948         pCompilingMethod = pParentClass->GetDynamicMethodOfInterfaceMethod( pUserProc );
     2002        pCompilingMethod = pParentClass->GetDynamicMethodOrInterfaceMethod( pUserProc );
    19492003        if( !pCompilingMethod ){
    19502004            pCompilingMethod = pParentClass->GetStaticMethods().GetMethodPtr( pUserProc );
  • trunk/abdev/BasicCompiler_Common/src/Procedure.cpp

    r336 r350  
    2424
    2525    return GetName();
     26}
     27bool UserProc::IsCastOperator() const
     28{
     29    if( GetName()[0] == 1 && GetName()[1] == ESC_OPERATOR && GetName()[2] == CALC_AS )
     30    {
     31        return true;
     32    }
     33    return false;
    2634}
    2735const NamespaceScopes &UserProc::GetNamespaceScopes() const
  • trunk/abdev/BasicCompiler_Common/src/Type.cpp

    r335 r350  
    211211    if( IsObject() )
    212212    {
    213         if( GetClass().IsInterface() ){
    214             // vtblOffsetのサイズを含める
    215             return PTR_SIZE*2;
    216         }
    217213        return PTR_SIZE;
    218214    }
     
    298294bool Type::IsPointer( int basicType )
    299295{
     296    if( basicType == DEF_NON )
     297    {
     298        return false;
     299    }
     300
    300301    if(PTR_LEVEL( basicType )|| basicType == DEF_PTR_VOID || basicType == DEF_PTR_PROC
    301302        || ( basicType & FLAG_PTR ) ){
     
    448449    return ( IsObject() && GetClass().IsDelegate() );
    449450}
     451bool Type::IsInterface() const
     452{
     453    return ( IsObject() && GetClass().IsInterface() );
     454}
     455
    450456
    451457bool Type::HasMember() const
  • trunk/abdev/ProjectEditor/Common.h

    r308 r350  
    6666#define APPLICATION_NAME "ActiveBasic 5.0"
    6767#define VERSION_APPLI_NAME APPLICATION_NAME
    68 #define VERSION_STRING "5.00.00 (rev.317)"
     68#define VERSION_STRING "5.00.00 (rev.356)"
    6969
    7070#endif
  • trunk/abdev/ProjectEditor/SubOperation.cpp

    r302 r350  
    519519        if(lstrcmpi(str,"If")==0) return COM_IF;
    520520        if(lstrcmpi(str,"Imports")==0) return -1;
     521        if(lstrcmpi(str,"Implements")==0) return -1;
    521522        if(lstrcmpi(str,"Inherits")==0) return COM_INHERITS;
    522523        if(lstrcmpi(str,"Input")==0) return COM_INPUT;
Note: See TracChangeset for help on using the changeset viewer.