Changeset 89 in dev for BasicCompiler_Common/Class.cpp


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

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

File:
1 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;
Note: See TracChangeset for help on using the changeset viewer.