Ignore:
Timestamp:
Jul 27, 2007, 12:14:00 PM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler_Common/include
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r243 r244  
    300300    void op_ret();
    301301    void op_ret( short stackFrameSize );
     302    void op_addressof( int reg, const UserProc *pUserProc );
    302303#endif
    303304
  • trunk/abdev/BasicCompiler_Common/include/NativeCode.h

    r241 r244  
    99void AddLocalVarAddrSchedule();
    1010void ObpPlus( int step = 1 );
     11
     12class UserProc;
    1113
    1214class Schedule
     
    2022        DataTable,      // データテーブル スケジュール
    2123        Relocation,     // リロケーション情報スケジュール
     24        UserProc,       // ユーザ定義関数呼び出し側スケジュール
     25        AddressOf,      // ユーザ定義関数位置スケジュール
    2226    };
    2327
    2428private:
    2529    Type type;
    26     int offset;
     30    long offset;
     31
     32    union{
     33        LONG_PTR lpValue;
     34        const ::UserProc *pUserProc;
     35    };
    2736
    2837    // XMLシリアライズ用
     
    3948    {
    4049    }
    41     Schedule( Type type, int offset )
     50    Schedule( Type type, long offset )
    4251        : type( type )
    4352        , offset( offset )
     53        , lpValue( 0 )
     54    {
     55    }
     56    Schedule( const ::UserProc *pUserProc, long offest )
     57        : type( Schedule::UserProc )
     58        , offset( offset )
     59        , pUserProc( pUserProc )
    4460    {
    4561    }
    4662    ~Schedule()
    4763    {
     64    }
     65
     66    void SpecifyAddressOf()
     67    {
     68        if( type != Schedule::UserProc )
     69        {
     70            SetError();
     71        }
     72        type = Schedule::AddressOf;
    4873    }
    4974};
     
    191216        {
    192217        case Schedule::None:
     218            // 何もしない
    193219            break;
    194220        case Schedule::GlobalVar:
     
    204230            break;
    205231        case Schedule::Relocation:
     232            // 未完成
    206233            break;
    207234        default:
     
    214241        ObpPlus( sizeof(long) );
    215242    }
     243    void PutUserProcSchedule( const UserProc *pUserProc, bool isCall )
     244    {
     245        Schedule schedule( pUserProc, size );
     246        if( isCall == false )
     247        {
     248            schedule.SpecifyAddressOf();
     249        }
     250        schedules.push_back( schedule );
     251
     252        *((long *)(codeBuffer+size))=0;
     253        size += sizeof(long);
     254
     255
     256
     257        // 未完成
     258        if( isCall )
     259        {
     260            pobj_SubAddrSchedule->add(pUserProc,1);
     261        }
     262        else
     263        {
     264            pobj_SubAddrSchedule->add(pUserProc,0);
     265        }
     266        extern char *OpBuffer;
     267        extern int obp;
     268        *((long *)(OpBuffer+obp))=0;
     269        ObpPlus( sizeof(long) );
     270    }
    216271    void Put( short s )
    217272    {
Note: See TracChangeset for help on using the changeset viewer.