Changeset 131 in dev


Ignore:
Timestamp:
Jun 4, 2007, 7:49:17 AM (17 years ago)
Author:
dai_9181
Message:

Prototypeクラスを用意した。

Files:
1 added
22 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/BasicCompiler.vcproj

    r124 r131  
    19491949                    <File
    19501950                        RelativePath="..\BasicCompiler_Common\Procedure.h"
     1951                        >
     1952                    </File>
     1953                    <File
     1954                        RelativePath="..\BasicCompiler_Common\include\Prototype.h"
    19511955                        >
    19521956                    </File>
  • BasicCompiler32/Compile_Object.cpp

    r123 r131  
    3636
    3737    std::vector<UserProc *> subs;
    38     pobj_c->EnumMethod( pobj_c->name, subs );
     38    pobj_c->EnumMethod( pobj_c->GetName().c_str(), subs );
    3939
    4040    UserProc *pUserProc;
    4141    if( subs.size() > 0 ){
    4242        //オーバーロードを解決
    43         pUserProc=OverloadSolutionWithStrParam(pobj_c->name,
     43        pUserProc=OverloadSolutionWithStrParam(pobj_c->GetName().c_str(),
    4444            subs,CreateParameter,"");
    4545
     
    5959        if( subs.size() == 1 ){
    6060            char temporary[VN_SIZE];
    61             sprintf( temporary, "_System_TypeBase.Search(\"\",\"%s\"))", pobj_c->name );
     61            sprintf( temporary, "_System_TypeBase.Search(\"\",\"%s\"))", pobj_c->GetName().c_str() );
    6262
    6363            Opcode_CallProc(temporary,
     
    101101    if(classObj.IsAbstract()){
    102102        //抽象クラスだったとき
    103         SetError(125,classObj.name,cp);
     103        SetError(125,classObj.GetName(),cp);
    104104    }
    105105
  • BasicCompiler32/Compile_ProcOp.cpp

    r129 r131  
    215215    if( userProc.GetName() == "InitializeUserTypes"
    216216        && userProc.HasParentClass()
    217         && (string)userProc.GetParentClass().name == "_System_TypeBase" ){
     217        && userProc.GetParentClass().GetName() == "_System_TypeBase" ){
    218218
    219219            pobj_DBClass->Compile_System_InitializeUserTypes();
     
    221221    else if( userProc.GetName() == "RegisterGlobalRoots"
    222222        && userProc.HasParentClass()
    223         && (string)userProc.GetParentClass().name == "_System_CGarbageCollection" ){
     223        && userProc.GetParentClass().GetName() == "_System_CGarbageCollection" ){
    224224
    225225            Compile_AddGlobalRootsForGc();
     
    451451
    452452    if(pobj_CompilingClass){
    453         if( pUserProc->GetName() == pobj_CompilingClass->name ){
     453        if( pUserProc->GetName() == pobj_CompilingClass->GetName() ){
    454454            ////////////////////////////////////
    455455            // コンストラクタをコンパイルするとき
     
    482482                    temporary[i4]=basbuf[i3];
    483483                }
    484                 if(lstrcmp(temporary,
    485                     pobj_CompilingClass->pobj_InheritsClass->name)==0){
     484                if( pobj_CompilingClass->pobj_InheritsClass->GetName() == temporary ){
    486485                    //基底クラスのコンストラクタを呼び出す
    487486                    cp=i3;
  • BasicCompiler32/Compile_Var.cpp

    r120 r131  
    534534            //自身のクラスから静的メンバを参照する場合
    535535            char temp2[VN_SIZE];
    536             sprintf(temp2,"%s.%s",pobj_CompilingClass->name,VarName);
     536            sprintf(temp2,"%s.%s",pobj_CompilingClass->GetName().c_str(),VarName);
    537537            pVar = globalVars.Find( temp2 );
    538538            if( pVar ){
  • BasicCompiler64/BasicCompiler.vcproj

    r128 r131  
    492492                    </File>
    493493                    <File
     494                        RelativePath="..\BasicCompiler_Common\include\Prototype.h"
     495                        >
     496                    </File>
     497                    <File
    494498                        RelativePath="..\BasicCompiler_Common\Type.h"
    495499                        >
     
    11271131                    >
    11281132                    <File
     1133                        RelativePath=".\Compile_Interface.cpp"
     1134                        >
     1135                    </File>
     1136                    <File
    11291137                        RelativePath=".\Compile_Object.cpp"
    11301138                        >
  • BasicCompiler64/Compile_Object.cpp

    r123 r131  
    3434
    3535    std::vector<UserProc *> subs;
    36     pobj_c->EnumMethod( pobj_c->name, subs );
     36    pobj_c->EnumMethod( pobj_c->GetName().c_str(), subs );
    3737
    3838    UserProc *pUserProc;
    3939    if( subs.size() > 0 ){
    4040        //オーバーロードを解決
    41         pUserProc=OverloadSolutionWithStrParam(pobj_c->name,
     41        pUserProc=OverloadSolutionWithStrParam(pobj_c->GetName().c_str(),
    4242            subs,CreateParameter,"");
    4343
     
    5757        if( subs.size() == 1 ){
    5858            char temporary[VN_SIZE];
    59             sprintf( temporary, "_System_TypeBase.Search(\"\",\"%s\"))", pobj_c->name );
     59            sprintf( temporary, "_System_TypeBase.Search(\"\",\"%s\"))", pobj_c->GetName().c_str() );
    6060
    6161            Opcode_CallProc(temporary,
     
    9797    if(classObj.IsAbstract()){
    9898        //抽象クラスだったとき
    99         SetError(125,classObj.name,cp);
     99        SetError(125,classObj.GetName().c_str(),cp);
    100100    }
    101101
  • BasicCompiler64/Compile_ProcOp.cpp

    r129 r131  
    206206    if( userProc.GetName() == "InitializeUserTypes"
    207207        && userProc.HasParentClass()
    208         && (string)userProc.GetParentClass().name == "_System_TypeBase" ){
     208        && userProc.GetParentClass().GetName() == "_System_TypeBase" ){
    209209
    210210            pobj_DBClass->Compile_System_InitializeUserTypes();
     
    212212    else if( userProc.GetName() == "RegisterGlobalRoots"
    213213        && userProc.HasParentClass()
    214         && (string)userProc.GetParentClass().name == "_System_CGarbageCollection" ){
     214        && userProc.GetParentClass().GetName() == "_System_CGarbageCollection" ){
    215215
    216216            Compile_AddGlobalRootsForGc();
     
    503503
    504504    if(pobj_CompilingClass){
    505         if( pUserProc->GetName() == pobj_CompilingClass->name ){
     505        if( pUserProc->GetName() == pobj_CompilingClass->GetName() ){
    506506            ////////////////////////////////////
    507507            // コンストラクタをコンパイルするとき
     
    534534                    temporary[i4]=basbuf[i3];
    535535                }
    536                 if(lstrcmp(temporary,
    537                     pobj_CompilingClass->pobj_InheritsClass->name)==0){
     536                if( pobj_CompilingClass->pobj_InheritsClass->GetName() == temporary ){
    538537                    //基底クラスのコンストラクタを呼び出す
    539538                    cp=i3;
  • BasicCompiler64/Compile_Var.cpp

    r129 r131  
    558558            //自身のクラスから静的メンバを参照する場合
    559559            char temp2[VN_SIZE];
    560             sprintf(temp2,"%s.%s",pobj_CompilingClass->name,VarName);
     560            sprintf(temp2,"%s.%s",pobj_CompilingClass->GetName().c_str(),VarName);
    561561            pVar = globalVars.Find( temp2 );
    562562            if( pVar ){
  • BasicCompiler64/NumOpe.cpp

    r129 r131  
    678678                    )){
    679679                        // ダウンキャストを許可する
     680                }
     681                else if( idCalc == CALC_AS
     682                    && type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST ) && ((CClass *)index_stack[sp-1])->IsInterface()
     683                    ){
     684                        // インターフェイスへのキャスト
     685                        // TODO: 実装
     686                        CastToInterface( pobj_reg->GetLockingReg(), REG_R15, *(CClass *)index_stack[sp-2], *(CClass *)index_stack[sp-1] );
    680687                }
    681688                else{
  • BasicCompiler64/Opcode.h

    r129 r131  
    245245BOOL IsXmmReg(int reg);
    246246BOOL IsVolatileReg(int reg);
     247void IfR14Push( int reg );
    247248
    248249//Compile_Calc.cpp
     
    311312void SetXmmReg_SingleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg);
    312313void SetReg_WholeVariable(int type,RELATIVE_VAR *pRelativeVar,int reg);
     314
     315//Compile_Interface.cpp
     316bool CastToInterface( int reg, int vtblReg, const CClass &baseClass, const CClass &interfaceClass );
    313317
    314318//Compile_Object.cpp
  • BasicCompiler64/Register.cpp

    r19 r131  
    308308    }
    309309}
     310
     311void IfR14Push( int reg ){
     312    if( reg == REG_R14 ){
     313        //mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
     314        pobj_sf->push( REG_R14 );
     315    }
     316}
  • BasicCompiler_Common/Class.cpp

    r129 r131  
    102102        foreach( CMember *member, objClass.staticMembers ){
    103103            char temporary[VN_SIZE];
    104             sprintf(temporary,"%s.%s",objClass.name,member->name);
     104            sprintf(temporary,"%s.%s",objClass.GetName().c_str(),member->name);
    105105            dim(
    106106                temporary,
     
    151151
    152152
    153 CClass::CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const char *name )
    154     : namespaceScopes( namespaceScopes )
     153CClass::CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const string &name )
     154    : Prototype( namespaceScopes, name )
    155155    , importedNamespaces( importedNamespaces )
    156156    , ConstructorMemberSubIndex( 0 )
     
    168168    , pobj_NextClass( NULL )
    169169{
    170     this->name=(char *)HeapAlloc(hHeap,0,lstrlen(name)+1);
    171     lstrcpy(this->name,name);
    172170}
    173171CClass::~CClass(){
    174172    int i;
    175 
    176     //クラス名
    177     HeapDefaultFree(name);
    178173
    179174    if(ppobj_Member){
     
    202197}
    203198
     199bool CClass::IsInheritsInterface( const CClass *pInterfaceClass ) const
     200{
     201    BOOST_FOREACH( const InheritedInterface &objInterface, interfaces ){
     202        if( pInterfaceClass == &objInterface.GetInterfaceClass() ){
     203            return true;
     204        }
     205    }
     206    return false;
     207}
     208
    204209bool CClass::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
    205210{
     
    253258}
    254259
    255 bool CClass::Inherits( const CClass &inheritsClass, int nowLine ){
     260bool CClass::Inherits( const char *inheritNames, int nowLine ){
     261    int i = 0;
     262    bool isInheritsClass = false;
     263    while( true ){
     264
     265        char temporary[VN_SIZE];
     266        for( int i2=0;; i++, i2++ ){
     267            if( inheritNames[i] == '\0' || inheritNames[i] == ',' ){
     268                temporary[i2] = 0;
     269                break;
     270            }
     271            temporary[i2] = inheritNames[i];
     272        }
     273
     274        //継承元クラスを取得
     275        const CClass *pInheritsClass = pobj_DBClass->Find(temporary);
     276        if( !pInheritsClass ){
     277            SetError(106,temporary,i);
     278            return false;
     279        }
     280
     281        if( pInheritsClass->IsInterface() ){
     282            // インターフェイスを継承する
     283            if( !InheritsInterface( *pInheritsClass, nowLine ) ){
     284                return false;
     285            }
     286        }
     287        else if( pInheritsClass->IsClass() ){
     288            // クラスを継承する
     289            isInheritsClass = true;
     290
     291            if( !InheritsClass( *pInheritsClass, nowLine ) ){
     292                return false;
     293            }
     294        }
     295        else{
     296            SetError(135,NULL,nowLine);
     297            return false;
     298        }
     299
     300        if( inheritNames[i] == '\0' ){
     301            break;
     302        }
     303        i++;
     304    }
     305
     306    if( !isInheritsClass ){
     307        // クラスを一つも継承していないとき
     308        const CClass *pObjectClass = pobj_DBClass->Find("Object");
     309        if( !pObjectClass ){
     310            SetError(106,"Object",i);
     311            return false;
     312        }
     313
     314        if( !InheritsClass( *pObjectClass, i ) ){
     315            return false;
     316        }
     317    }
     318
     319    return true;
     320}
     321bool CClass::InheritsClass( const CClass &inheritsClass, int nowLine ){
    256322
    257323    //ループ継承でないかをチェック
    258324    if(pobj_LoopRefCheck->check(inheritsClass)){
    259         SetError(123,inheritsClass.name,nowLine);
     325        SetError(123,inheritsClass.GetName(),nowLine);
    260326        return false;
    261327    }
     
    263329    if( inheritsClass.ppobj_Member == 0 ){
    264330        //継承先が読み取られていないとき
    265         pobj_LoopRefCheck->add(this->name);
    266         pobj_DBClass->GetClass_recur(inheritsClass.name);
    267         pobj_LoopRefCheck->del(this->name);
     331        pobj_LoopRefCheck->add(this->GetName().c_str());
     332        pobj_DBClass->GetClass_recur(inheritsClass.GetName().c_str());
     333        pobj_LoopRefCheck->del(this->GetName().c_str());
    268334    }
    269335
     
    317383    //ループ継承でないかをチェック
    318384    if(pobj_LoopRefCheck->check(inheritsInterface)){
    319         SetError(123,inheritsInterface.name,nowLine);
     385        SetError(123,inheritsInterface.GetName(),nowLine);
    320386        return false;
    321387    }
     
    323389    if( inheritsInterface.ppobj_Member == 0 ){
    324390        //継承先が読み取られていないとき
    325         pobj_LoopRefCheck->add(this->name);
    326         pobj_DBClass->GetClass_recur(inheritsInterface.name);
    327         pobj_LoopRefCheck->del(this->name);
     391        pobj_LoopRefCheck->add(this->GetName().c_str());
     392        pobj_DBClass->GetClass_recur(inheritsInterface.GetName().c_str());
     393        pobj_LoopRefCheck->del(this->GetName().c_str());
    328394    }
    329395
     
    348414    }
    349415
     416    interfaces.push_back( InheritedInterface( const_cast<CClass *>(&inheritsInterface), vtbl_num ) );
     417
    350418    //仮想関数の数
    351419    vtbl_num += inheritsInterface.vtbl_num;
    352 
    353     /*
    354     TODO: インターフェイス向けの機構を作る
    355     //継承先のクラスをメンバとして保持する
    356     pobj_InheritsClass = &inheritsInterface;
    357     */
    358420
    359421    return true;
     
    404466    //メンバ
    405467    for( int i=0;i<iMemberNum;i++){
    406         if(lstrcmp(name,ppobj_Member[i]->name)==0){
     468        if( GetName() == ppobj_Member[i]->name ){
    407469            return 1;
    408470        }
     
    411473    //静的メンバ
    412474    foreach( CMember *member, staticMembers ){
    413         if( lstrcmp( name, member->name ) == 0 ){
     475        if( GetName() == member->name ){
    414476            return 1;
    415477        }
     
    10661128    BOOL fConstructor=0,bDestructor=0;
    10671129
    1068     if(lstrcmp(temporary,pobj_c->name)==0){
     1130    if(lstrcmp(temporary,pobj_c->GetName().c_str())==0){
    10691131        //コンストラクタの場合
    10701132
     
    10771139    else if(temporary[0]=='~'){
    10781140        //デストラクタの場合はその名前が正しいかチェックを行う
    1079         if(lstrcmp(temporary+1,pobj_c->name)!=0)
     1141        if(lstrcmp(temporary+1,pobj_c->GetName().c_str())!=0)
    10801142            SetError(117,NULL,nowLine);
    10811143        else
     
    11701232            if(pobj_LoopRefCheck->check(pMember->GetClass())){
    11711233                extern int cp;
    1172                 SetError(124,pMember->GetClass().name,cp);
     1234                SetError(124,pMember->GetClass().GetName(),cp);
    11731235                return 0;
    11741236            }
    11751237
    1176             pobj_LoopRefCheck->add(objClass.name);
     1238            pobj_LoopRefCheck->add(objClass.GetName().c_str());
    11771239
    11781240            i2=MemberVar_LoopRefCheck(pMember->GetClass());
    11791241            if(bRet==1) bRet=i2;
    11801242
    1181             pobj_LoopRefCheck->del(objClass.name);
     1243            pobj_LoopRefCheck->del(objClass.GetName().c_str());
    11821244        }
    11831245    }
     
    12431305
    12441306            if(lpszInheritsClass){
    1245                 if(lstrcmp(lpszInheritsClass,pobj_c->name)!=0){
     1307                if(lstrcmp(lpszInheritsClass,pobj_c->GetName().c_str())!=0){
    12461308                    //継承先先読み用
    12471309                    continue;
     
    12711333                }
    12721334
    1273                 if(lstrcmpi(temporary,pobj_c->name)==0){
     1335                if(lstrcmpi(temporary,pobj_c->GetName().c_str())==0){
    12741336                    SetError(105,temporary,i);
    12751337                    goto Interface_InheritsError;
     
    12841346
    12851347                //継承させる
    1286                 if( !pobj_c->InheritsInterface( *pInheritsClass, i ) ){
     1348                if( !pobj_c->InheritsClass( *pInheritsClass, i ) ){
    12871349                    goto Interface_InheritsError;
    12881350                }
     
    13941456
    13951457            if(lpszInheritsClass){
    1396                 if(lstrcmp(lpszInheritsClass,pobj_c->name)!=0){
     1458                if( pobj_c->GetName() != lpszInheritsClass ){
    13971459                    //継承先先読み用
    13981460                    continue;
     
    14181480            else dwAccess=ACCESS_PUBLIC;
    14191481
    1420             if( lstrcmp( pobj_c->name, "Object" ) == 0 || dwClassType == ESC_TYPE ){
    1421                 //継承無し
    1422                 pobj_c->pobj_InheritsClass=0;
    1423 
    1424                 //仮想関数の数を初期化
    1425                 pobj_c->vtbl_num=0;
     1482            if( pobj_c->GetName() == "Object" || dwClassType == ESC_TYPE ){
     1483                // 継承無し
     1484                pobj_c->pobj_InheritsClass = NULL;
     1485
     1486                // 仮想関数の数を初期化
     1487                pobj_c->vtbl_num = 0;
    14261488            }
    14271489            else{
     
    14391501                    }
    14401502
    1441                     if(lstrcmpi(temporary,pobj_c->name)==0){
     1503                    if(lstrcmpi(temporary,pobj_c->GetName().c_str())==0){
    14421504                        SetError(105,temporary,i);
    14431505                        goto InheritsError;
     
    14501512                }
    14511513
    1452                 //継承元クラスを取得
    1453                 const CClass *pInheritsClass = Find(temporary);
    1454                 if( !pInheritsClass ){
    1455                     SetError(106,temporary,i);
    1456                     goto InheritsError;
    1457                 }
    1458 
    1459                 if( pInheritsClass->IsInterface() ){
    1460                     // クラスを継承していないとき
    1461                     const CClass *pObjectClass = Find("Object");
    1462                     if( !pObjectClass ){
    1463                         SetError(106,"Object",i);
    1464                         goto InheritsError;
    1465                     }
    1466 
    1467                     if( !pobj_c->Inherits( *pObjectClass, i ) ){
    1468                         goto InheritsError;
    1469                     }
    1470                 }
    1471 
    1472                 //継承させる
    1473                 if( !pobj_c->Inherits( *pInheritsClass, i ) ){
    1474                     goto InheritsError;
    1475                 }
     1514                pobj_c->Inherits( temporary, i );
    14761515            }
    14771516InheritsError:
     
    15961635                            if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().ppobj_Member==0){
    15971636                                //参照先が読み取られていないとき
    1598                                 GetClass_recur(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().name);
     1637                                GetClass_recur(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().GetName().c_str());
    15991638                            }
    16001639                        }
     
    16031642                        if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsStruct()){
    16041643                            //循環参照のチェック
    1605                             pobj_LoopRefCheck->add(pobj_c->name);
     1644                            pobj_LoopRefCheck->add(pobj_c->GetName().c_str());
    16061645                            if(!MemberVar_LoopRefCheck(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass())){
    16071646                                //エラー回避
    16081647                                pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->SetBasicType( DEF_PTR_VOID );
    16091648                            }
    1610                             pobj_LoopRefCheck->del(pobj_c->name);
     1649                            pobj_LoopRefCheck->del(pobj_c->GetName().c_str());
    16111650                        }
    16121651                    }
     
    17091748            , 1
    17101749            , ESC_NEW
    1711             , ""                        // 名前空間 (TODO: 実装)
    1712             , objClass.name             // クラス名
    1713             , referenceOffsetsBuffer    // 参照メンバオフセット配列
    1714             , numOfReference            // 参照メンバの個数
     1750            , ""                            // 名前空間 (TODO: 実装)
     1751            , objClass.GetName().c_str()    // クラス名
     1752            , referenceOffsetsBuffer        // 参照メンバオフセット配列
     1753            , numOfReference                // 参照メンバの個数
    17151754            );
    17161755
     
    17491788            sprintf( temporary
    17501789                , "tempType=Search(\"%s\",\"%s\")"
    1751                 , ""                // 名前空間 (TODO: 実装)
    1752                 , objClass.name     // クラス名
     1790                , ""                            // 名前空間 (TODO: 実装)
     1791                , objClass.GetName().c_str()    // クラス名
    17531792                );
    17541793
     
    17591798                , "tempType.SetBaseType(Search(\"%s\",\"%s\"))"
    17601799                , ""                                // 名前空間 (TODO: 実装)
    1761                 , objClass.pobj_InheritsClass->name // 基底クラス名
     1800                , objClass.pobj_InheritsClass->GetName().c_str()    // 基底クラス名
    17621801                );
    17631802
  • BasicCompiler_Common/Class.h

    r128 r131  
    22
    33#include <vector>
     4#include <string>
     5
     6#include <Prototype.h>
    47#include "Type.h"
    58#include "Procedure.h"
     
    5760class CDBClass;
    5861class CDebugSection;
    59 class CClass{
     62class CClass;
     63class InheritedInterface
     64{
     65    CClass *pInterfaceClass;
     66    int vtblOffset;
     67public:
     68    InheritedInterface( CClass *pInterfaceClass, int vtblOffset )
     69        : pInterfaceClass( pInterfaceClass )
     70        , vtblOffset( vtblOffset )
     71    {
     72    }
     73
     74    CClass &GetInterfaceClass() const{
     75        return *pInterfaceClass;
     76    }
     77    int GetVtblOffset() const
     78    {
     79        return vtblOffset;
     80    }
     81};
     82typedef vector<InheritedInterface> Interfaces;
     83class CClass : public Prototype
     84{
    6085    friend CMember;
    6186    friend CDBClass;
    6287    friend CDebugSection;
    6388
    64     // 名前空間
    65     NamespaceScopes namespaceScopes;
     89    // importされている名前空間
    6690    NamespaceScopesCollection importedNamespaces;
     91
     92    // 継承するインターフェイス
     93    Interfaces interfaces;
    6794
    6895    // Blittable型情報
     
    93120
    94121public:
    95     //クラス名
    96     char *name;
    97122
    98123    //継承クラスへのポインタ
     
    111136
    112137public:
    113     CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const char *name );
     138    CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const string &name );
    114139    ~CClass();
    115140
    116     const NamespaceScopes &GetNamespaceScopes() const
    117     {
    118         return namespaceScopes;
    119     }
    120141    const NamespaceScopesCollection &GetImportedNamespaces() const
    121142    {
     
    123144    }
    124145
    125     const string GetName() const
    126     {
    127         return name;
    128     }
    129 
     146    // インターフェイス
     147    bool HasInterfaces() const
     148    {
     149        return ( interfaces.size() != 0 );
     150    }
     151    bool IsInheritsInterface( const CClass *pInterfaceClass ) const;
     152
     153    // Blittable型
    130154    bool IsBlittableType() const
    131155    {
     
    140164    }
    141165
     166    // シンボル比較
    142167    bool IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const;
    143168    bool IsEqualSymbol( const CClass &objClass ) const;
     
    154179
    155180    //継承させる
    156     bool Inherits( const CClass &inheritsClass, int nowLine );
     181    bool Inherits( const char *inheritNames, int nowLine );
     182    bool InheritsClass( const CClass &inheritsClass, int nowLine );
    157183    bool InheritsInterface( const CClass &inheritsClass, int nowLine );
    158184
  • BasicCompiler_Common/DebugMiddleFile.cpp

    r114 r131  
    1212void SetLpIndex_DebugFile(char *buffer,int *p,const Type &type){
    1313    if(NATURAL_TYPE(type.GetBasicType())==DEF_OBJECT || NATURAL_TYPE(type.GetBasicType())==DEF_STRUCT){
    14         lstrcpy(buffer+(*p),type.GetClass().name);
     14        lstrcpy(buffer+(*p),type.GetClass().GetName().c_str());
    1515        (*p)+=lstrlen(buffer+(*p))+1;
    1616    }
     
    127127
    128128        //クラス名
    129         lstrcpy(buffer+i2,pobj_c->name);
     129        lstrcpy(buffer+i2,pobj_c->GetName().c_str());
    130130        i2+=lstrlen(buffer+i2)+1;
    131131    }
     
    214214        while(pUserProc){
    215215            if(pUserProc->GetParentClassPtr()){
    216                 lstrcpy(buffer+i2,pUserProc->GetParentClassPtr()->name);
     216                lstrcpy(buffer+i2,pUserProc->GetParentClassPtr()->GetName().c_str());
    217217                i2+=lstrlen(buffer+i2)+1;
    218218            }
     
    312312
    313313        //クラス名
    314         lstrcpy(buffer+i2,pobj_c->name);
     314        lstrcpy(buffer+i2,pobj_c->GetName().c_str());
    315315        i2+=lstrlen(buffer+i2)+1;
    316316
     
    357357            i2+=sizeof(long);
    358358            if(method->pobj_InheritsClass){
    359                 lstrcpy(buffer+i2,method->pobj_InheritsClass->name);
     359                lstrcpy(buffer+i2,method->pobj_InheritsClass->GetName().c_str());
    360360                i2+=lstrlen(buffer+i2)+1;
    361361            }
  • BasicCompiler_Common/Diagnose.cpp

    r100 r131  
    126126                temporary[0]=0;
    127127                lstrcat( temporary, "------------------------------------------------------------------\n" );
    128                 sprintf( temporary + lstrlen(temporary), "【 %s クラスのコード情報】\n", objClass.name );
     128                sprintf( temporary + lstrlen(temporary), "【 %s クラスのコード情報】\n", objClass.GetName().c_str() );
    129129                sprintf( temporary + lstrlen(temporary), "class code size: %d bytes\n", codeSizeOfClass );
    130130                lstrcat( temporary, "------------------------------------------------------------------\n" );
  • BasicCompiler_Common/LoopRefCheck.cpp

    r90 r131  
    2424    init();
    2525}
    26 void CLoopRefCheck::add(char *lpszInheritsClass){
     26void CLoopRefCheck::add(const char *lpszInheritsClass){
    2727    names=(char **)HeapReAlloc(hHeap,0,names,(num+1)*sizeof(char *));
    2828    names[num]=(char *)HeapAlloc(hHeap,0,lstrlen(lpszInheritsClass)+1);
     
    3030    num++;
    3131}
    32 void CLoopRefCheck::del(char *lpszInheritsClass){
     32void CLoopRefCheck::del(const char *lpszInheritsClass){
    3333    int i;
    3434    for(i=0;i<num;i++){
     
    5050    int i;
    5151    for(i=0;i<num;i++){
    52         if(lstrcmp(names[i],inheritsClass.name)==0) return 1;
     52        if( inheritsClass.GetName() == names[i] ){
     53            return 1;
     54        }
    5355    }
    5456    return 0;
  • BasicCompiler_Common/Object.cpp

    r89 r131  
    2020
    2121    UserProc *pUserProc;
    22     pUserProc=GetMethodHash(ObjectName,type.GetClass().name,Parameter);
     22    pUserProc=GetMethodHash(ObjectName,type.GetClass().GetName().c_str(),Parameter);
    2323    if(!pUserProc){
    24         if(Parameter[0]) SetError(113,type.GetClass().name,cp);
     24        if(Parameter[0]) SetError(113,type.GetClass().GetName().c_str(),cp);
    2525        return;
    2626    }
     
    5353
    5454            Type dummyType;
    55             sprintf(temporary+lstrlen(temporary),".%s",type.GetClass().name);
     55            sprintf(temporary+lstrlen(temporary),".%s",type.GetClass().GetName().c_str());
    5656            CallProc( PROC_DEFAULT,
    5757                pUserProc,
     
    6969    else{
    7070        Type dummyType;
    71         sprintf(temporary,"%s.%s",ObjectName,type.GetClass().name);
     71        sprintf(temporary,"%s.%s",ObjectName,type.GetClass().GetName().c_str());
    7272        CallProc( PROC_DEFAULT,
    7373            pUserProc,
  • BasicCompiler_Common/Procedure.cpp

    r128 r131  
    44{
    55    if( HasParentClass() ){
    6         return (string)GetParentClass().name + "." + GetName();
     6        return GetParentClass().GetName() + "." + GetName();
    77    }
    88
     
    153153        //パラメータを追加
    154154        this->params.push_back( pParam );
     155
     156/*      if( type.IsObject() && type.GetClass().IsInterface() ){
     157            // インターフェイスが引数だったとき
     158            // vtblOffsetを引き渡すための引数も用意しておく
     159            this->params.push_back( new Parameter( ((string)name + "_vtbl").c_str(), Type(DEF_LONG) ) );
     160        }*/
    155161
    156162        if(sourceOfParams[i]==','){
     
    299305
    300306        if( this->pParentClass ){
    301             if( this->GetName() == this->pParentClass->name ||
     307            if( this->GetName() == this->pParentClass->GetName() ||
    302308                this->GetName()[0]=='~'){
    303309                //クラスのコンストラクタ、デストラクタがFunction定義の場合はエラーをだす
  • BasicCompiler_Common/Type.cpp

    r128 r131  
    243243    // オブジェクト
    244244    if(basicType==DEF_OBJECT){
     245        if( GetClass().IsInterface() ){
     246            // vtblOffsetのサイズを含める
     247            return PTR_SIZE*2;
     248        }
    245249        return PTR_SIZE;
    246250    }
     
    433437{
    434438    if( basicType == DEF_OBJECT ){
    435         if( lstrcmp( pClass->name,"Object")==0){
     439        if( pClass->GetName() == "Object" ){
    436440            return true;
    437441        }
     
    442446{
    443447    if( basicType == DEF_OBJECT ){
    444         if( lstrcmp( pClass->name,"String")==0){
     448        if( pClass->GetName() == "String" ){
    445449            return true;
    446450        }
     
    486490
    487491        if( !( index == 0 || index == -1 ) ){
    488             return pClass->name;
     492            return pClass->GetName();
    489493        }
    490494    }
  • BasicCompiler_Common/VariableOpe.cpp

    r128 r131  
    210210        if(lpIndex==0) lstrcpy(name,"non");
    211211        else{
    212             lstrcpy(name,((CClass *)lpIndex)->name);
     212            lstrcpy(name,((CClass *)lpIndex)->GetName().c_str());
    213213        }
    214214    }
     
    751751        //自身のクラスから静的メンバを参照する場合
    752752        char temp2[VN_SIZE];
    753         sprintf(temp2,"%s.%s",pobj_CompilingClass->name,VarName);
     753        sprintf(temp2,"%s.%s",pobj_CompilingClass->GetName().c_str(),VarName);
    754754
    755755        pVar = globalVars.Find( temp2 );
     
    10091009    //クラス名
    10101010    if(pobj_CompilingClass){
    1011         lstrcat(FullName,pobj_CompilingClass->name);
     1011        lstrcat(FullName,pobj_CompilingClass->GetName().c_str());
    10121012        lstrcat(FullName,"%");
    10131013    }
  • BasicCompiler_Common/common.h

    r130 r131  
    472472    CLoopRefCheck();
    473473    ~CLoopRefCheck();
    474     void add(char *lpszInheritsClass);
    475     void del(char *lpszInheritsClass);
     474    void add(const char *lpszInheritsClass);
     475    void del(const char *lpszInheritsClass);
    476476    BOOL check(const CClass &inheritsClass) const;
    477477};
  • BasicCompiler_Common/error.cpp

    r114 r131  
    191191    if(num==133) lstrcpy(msg,"Thisに代入はできません。");
    192192    if(num==134) lstrcpy( msg,"ObjPtr関数にはオブジェクト インスタンス以外を指定できません。" );
     193    if(num==135) lstrcpy( msg, "クラスまたはインターフェイス以外の型を継承元として指定することはできません。" );
    193194
    194195    //Enum関連
Note: See TracChangeset for help on using the changeset viewer.