Changeset 89 in dev for BasicCompiler_Common


Ignore:
Timestamp:
Apr 4, 2007, 2:03:09 AM (17 years ago)
Author:
dai_9181
Message:

実行時型情報の生成に対応。
関数の戻り値の型に抽象クラスを指定できるようにした。

Location:
BasicCompiler_Common
Files:
1 deleted
8 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/Class.cpp

    r87 r89  
    117117
    118118            //ネイティブコードバッファの再確保
    119             extern int obp_AllocSize;
    120             if(obp_AllocSize<obp+8192){
    121                 obp_AllocSize+=8192;
    122                 OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); //matea
    123             }
     119            ReallocNativeCodeBuffer();
     120
    124121            i++;
    125122        }
     
    198195
    199196void CClass::Inherits( CClass *pInheritsClass ){
    200     int i3;
    201197
    202198    //メンバをコピー
     
    207203        pInheritsClass->iMemberNum*sizeof(CMember *));
    208204    iMemberNum=pInheritsClass->iMemberNum;
    209     for(i3=0;i3<pInheritsClass->iMemberNum;i3++){
     205    for(int i3=0;i3<pInheritsClass->iMemberNum;i3++){
    210206        ppobj_Member[i3]=new CMember( *pInheritsClass->ppobj_Member[i3] );
    211207
     
    315311{
    316312    for( int i=(int)methods.size()-1; i>=0; i-- ){
    317         if( pUserProc == methods[i]->pUserProc ) return methods[i];
     313        if( pUserProc == methods[i]->pUserProc ){
     314            return methods[i];
     315        }
    318316    }
    319317    return NULL;
     
    13501348
    13511349
    1352                         if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsObject()||
    1353                             pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsStruct()){
     1350                        if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsStruct()){
    13541351                            if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().ppobj_Member==0){
    13551352                                //参照先が読み取られていないとき
     
    13591356
    13601357
    1361                         if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsObject()){
     1358                        if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsStruct()){
    13621359                            //循環参照のチェック
    13631360                            pobj_LoopRefCheck->add(pobj_c->name);
     
    14221419    delete pobj_LoopRefCheck;
    14231420    pobj_LoopRefCheck=0;
    1424 }
    1425 
    1426 void CDBClass::GenerateRuntimeTypeInfo(){
     1421
     1422    // イテレータ用のデータを作る
     1423    pobj_DBClass->Iterator_Init();
     1424}
     1425
     1426void CDBClass::Compile_System_InitializeUserTypes(){
     1427
     1428    ////////////////////////////////////////////////////////////////////
     1429    // クラス登録
     1430    ////////////////////////////////////////////////////////////////////
     1431
     1432    // イテレータをリセット
     1433    Iterator_Reset();
     1434
     1435    while( Iterator_HasNext() ){
     1436        CClass *pClass = Iterator_GetNext();
     1437
     1438        char temporary[VN_SIZE];
     1439        sprintf( temporary
     1440            , "Add(%c%c_System_TypeForClass(\"%s\",\"%s\"))"
     1441            , 1
     1442            , ESC_NEW
     1443            , ""                // 名前空間 (TODO: 実装)
     1444            , pClass->name      // クラス名
     1445            );
     1446
     1447        // コンパイル
     1448        ChangeOpcode( temporary );
     1449
     1450        // ネイティブコードバッファの再確保
     1451        ReallocNativeCodeBuffer();
     1452    }
     1453
     1454
     1455    ////////////////////////////////////////////////////////////////////
     1456    // 継承関係登録
     1457    ////////////////////////////////////////////////////////////////////
     1458    // TODO: 未完成
     1459    /*
     1460
     1461    // イテレータをリセット
     1462    Iterator_Reset();
     1463
     1464    while( Iterator_HasNext() ){
     1465        CClass *pClass = Iterator_GetNext();
     1466
     1467        sprintf( genBuffer + length
     1468            , "obj.Search( \"%s\" ).SetBaseType( Search( \"%s\" ) ):"
     1469            , ""                // クラス名
     1470            , pClass->name      // クラス名
     1471            );
     1472        length += lstrlen( genBuffer + length );
     1473
     1474        while( length + 8192 > max ){
     1475            max += 8192;
     1476            genBuffer = (char *)realloc( genBuffer, max );
     1477        }
     1478    }*/
    14271479}
    14281480
     
    14751527//////////////////////
    14761528
    1477 void CDBClass::Iterator_Reset(void){
     1529void CDBClass::Iterator_Init(void){
    14781530    if(ppobj_IteClass) HeapDefaultFree(ppobj_IteClass);
    14791531
     
    14981550    }
    14991551}
     1552void CDBClass::Iterator_Reset(void){
     1553    iIteNextNum = 0;
     1554}
    15001555BOOL CDBClass::Iterator_HasNext(void){
    15011556    if(iIteNextNum<iIteMaxNum) return 1;
  • BasicCompiler_Common/Class.h

    r87 r89  
    217217    void GetClass_recur(const char *lpszInheritsClass);
    218218    void GetAllClassInfo(void);
    219     void GenerateRuntimeTypeInfo();
     219    void Compile_System_InitializeUserTypes();
    220220
    221221
     
    252252    int iIteNextNum;
    253253public:
     254    void Iterator_Init(void);
    254255    void Iterator_Reset(void);
    255256    BOOL Iterator_HasNext(void);
  • BasicCompiler_Common/Compile.cpp

    r78 r89  
    77#endif
    88
    9 int obp,obp_AllocSize;
    10 int GlobalOpBufferSize;
    11 char *OpBuffer;
    12 
    139//ラベルアドレス
    1410LABEL *pLabelNames;
     
    3632//With情報
    3733WITHINFO WithInfo;
     34
     35
     36int obp,obp_AllocSize;
     37int GlobalOpBufferSize;
     38char *OpBuffer;
     39void ReallocNativeCodeBuffer(){
     40    if(obp_AllocSize<obp+8192){
     41        obp_AllocSize+=8192;
     42        OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); //matea
     43    }
     44}
    3845
    3946
     
    428435                OpcodeDim(Command+2,0);
    429436
    430             if(obp_AllocSize<obp+8192){
    431                 obp_AllocSize+=8192;
    432                 OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize);
    433             }
     437            // ネイティブコードバッファの再確保
     438            ReallocNativeCodeBuffer();
    434439
    435440            if(basbuf[cp]=='\0') break;
  • BasicCompiler_Common/Object.cpp

    r75 r89  
    6464
    6565            //ネイティブコードバッファの再確保
    66             extern int obp_AllocSize;
    67             if(obp_AllocSize<obp+8192){
    68                 obp_AllocSize+=8192;
    69                 OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); //matea
    70             }
     66            ReallocNativeCodeBuffer();
    7167        }
    7268    }
  • BasicCompiler_Common/Procedure.h

    r78 r89  
    155155        return *pParentClass;
    156156    }
     157    bool HasParentClass() const
     158    {
     159        return ( pParentClass != NULL );
     160    }
    157161    void SetMethod( CMethod *pMethod ){
    158162        this->pMethod = pMethod;
  • BasicCompiler_Common/common.h

    r88 r89  
    496496
    497497//Compile.cpp
     498void ReallocNativeCodeBuffer();
    498499void GetIdentifierToken( char *token, const char *source, int &pos );
    499500int JumpStatement(const char *source, int &pos);
  • BasicCompiler_Common/include/Source.h

    r88 r89  
    2929class BasicSource : public Text
    3030{
     31    static const string generateDirectiveName;
     32
    3133    void Realloc( int newLength ){
    3234        buffer = (char *)realloc( buffer, newLength + 255 );
  • BasicCompiler_Common/src/Source.cpp

    r88 r89  
    44#include <windows.h>
    55
     6
     7const string BasicSource::generateDirectiveName = "#generate";
    68
    79
     
    409411
    410412void BasicSource::ChangeReturnLineChar(){
     413    int i,i2;
     414
    411415#ifdef _DEBUG
    412416    //改行コードの整合性チェック
    413     for( int i=0; ; i++ ){
     417    for( i=0; ; i++ ){
    414418        if( buffer[i] == '\0' ){
    415419            break;
     
    433437
    434438    //改行コードのCRLFをLFに変換
    435     int i,i2;
    436439    for(i=0,i2=0;;i++,i2++){
    437440        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i++;
     
    551554        if(i>LastFileByte[layer]){
    552555            HeapDefaultFree(LayerDir[layer]);
     556            LayerDir[layer]=0;
    553557            layer--;
    554558        }
     
    842846}
    843847
    844 bool BasicSource::Generate( const string &genName, const char *buffer ){
    845     return true;
     848bool BasicSource::Generate( const string &genName, const char *genBuffer ){
     849    const int genBufferLength = lstrlen( genBuffer );
     850
     851#ifdef _DEBUG
     852    // 挿入ソースに改行コードが含まれていないかを検査する
     853    for( int i=0; genBuffer[i] ; i++ ){
     854        if( genBuffer[i] == '\n' ){
     855            SetError();
     856            break;
     857        }
     858    }
     859#endif
     860
     861    bool isFound = false;
     862
     863    for( int i=0; ; i++ ){
     864        if( i == 0 || buffer[i] == '\n' ){
     865            if( buffer[i] == '\n' ){
     866                i++;
     867            }
     868            while( IsBlank( buffer[i] ) ){
     869                i++;
     870            }
     871
     872            int startIndex = i;
     873
     874            if( memicmp( buffer + i, generateDirectiveName.c_str(), generateDirectiveName.size() ) == 0 ){
     875                i += (int)generateDirectiveName.size();
     876                while( IsBlank( buffer[i] ) ){
     877                    i++;
     878                }
     879
     880                char temporary[VN_SIZE];
     881                for( int i2=0; ; i++, i2++ ){
     882                    if( buffer[i] == '\n' ){
     883                        temporary[i2] = 0;
     884                        break;
     885                    }
     886                    temporary[i2] = buffer[i];
     887                }
     888                if( genName == temporary ){
     889                    // 一致
     890
     891                    int endIndex = i;
     892
     893                    int lengthOffset = genBufferLength - ( endIndex - startIndex );
     894
     895                    Realloc( length + lengthOffset );
     896                    SlideString( buffer + endIndex, lengthOffset );
     897                    memcpy( buffer + startIndex, genBuffer, genBufferLength );
     898
     899                    isFound = true;
     900
     901                    break;
     902                }
     903            }
     904        }
     905    }
     906
     907    return isFound;
    846908}
    847909
Note: See TracChangeset for help on using the changeset viewer.