Ignore:
Timestamp:
Jul 30, 2007, 4:12:54 PM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

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

    r252 r253  
    236236    extern HANDLE hHeap;
    237237    extern BOOL bDebugCompile;
    238     int i3,i4,LocalVarSchedule,BaseOffset;
     238    int i3,i4,BaseOffset;
    239239    char temporary[VN_SIZE];
    240240
     
    263263    else bDebugSupportProc=0;
    264264
     265    extern int obp;
    265266    pUserProc->SetBeginOpAddress( obp );
    266267
     
    306307    extern int AllLocalVarSize;
    307308    AllLocalVarSize=0;
    308 
    309     //ローカル変数アドレススケジュール
    310     extern DWORD *pLocalVarAddrSchedule;
    311     extern int LocalVarAddrScheduleNum;
    312     pLocalVarAddrSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
    313     LocalVarAddrScheduleNum=0;
    314309
    315310    //パラメータ用の変数データを考慮
     
    362357
    363358    //sub esp,AllLocalVarSize(スケジュール)
    364     compiler.codeGenerator.op_sub_esp(0xFFFFFFFF);
    365     LocalVarSchedule=obp-sizeof(long);
     359    const PertialSchedule *pAllLocalVarPertialSchedule = compiler.codeGenerator.op_sub_esp( 0, true );
    366360
    367361    //push ebp
     
    641635        {
    642636            //fld qword ptr[ebp+offset]
    643             compiler.codeGenerator.op_fld_base_offset( i3, REG_EBP, RelativeVar.offset, Schedule::LocalVar );
     637            compiler.codeGenerator.localVarPertialSchedules.push_back(
     638                compiler.codeGenerator.op_fld_base_offset( i3, REG_EBP, RelativeVar.offset, Schedule::None, true )
     639            );
    644640        }
    645641        else if(i3==DEF_INT64||i3==DEF_QWORD){
    646642            //mov eax,dword ptr[ebp+offset]
    647             compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::LocalVar );
     643            compiler.codeGenerator.localVarPertialSchedules.push_back(
     644                compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::None, true )
     645            );
    648646
    649647            //mov edx,dword ptr[ebp+offset+sizeof(long)]
    650             compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EBP, RelativeVar.offset+sizeof(long), MOD_BASE_DISP32, Schedule::LocalVar );
     648            compiler.codeGenerator.localVarPertialSchedules.push_back(
     649                compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EBP, RelativeVar.offset+sizeof(long), MOD_BASE_DISP32, Schedule::None, true )
     650            );
    651651        }
    652652        else if(i3==DEF_LONG||i3==DEF_DWORD||
    653             IsPtrType(i3)){
     653            IsPtrType(i3))
     654        {
    654655            //mov eax,dword ptr[ebp+offset]
    655             compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::LocalVar );
     656            compiler.codeGenerator.localVarPertialSchedules.push_back(
     657                compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::None, true )
     658            );
    656659        }
    657660        else if(i3==DEF_INTEGER||i3==DEF_WORD || (Smoothie::IsUnicode()&&i3==DEF_CHAR)){
     
    660663
    661664            //mov ax,word ptr[ebp+offset]
    662             compiler.codeGenerator.op_mov_RM( sizeof(short), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::LocalVar );
     665            compiler.codeGenerator.localVarPertialSchedules.push_back(
     666                compiler.codeGenerator.op_mov_RM( sizeof(short), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::None, true )
     667            );
    663668        }
    664669        else if(i3==DEF_SBYTE||i3==DEF_BYTE||i3==DEF_BOOLEAN || (Smoothie::IsUnicode()==false&&i3==DEF_CHAR)){
     
    667672
    668673            //mov al,byte ptr[ebp+offset]
    669             compiler.codeGenerator.op_mov_RM( sizeof(char), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::LocalVar );
     674            compiler.codeGenerator.localVarPertialSchedules.push_back(
     675                compiler.codeGenerator.op_mov_RM( sizeof(char), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::None, true )
     676            );
    670677        }
    671678    }
    672679
    673680    //ローカル変数アドレススケジュール
    674     for(i3=0;i3<LocalVarAddrScheduleNum;i3++){
    675         *((long *)(OpBuffer+pLocalVarAddrSchedule[i3]))+=AllLocalVarSize;
    676     }
    677     HeapDefaultFree(pLocalVarAddrSchedule);
     681    BOOST_FOREACH( const PertialSchedule *pPertialSchedule, compiler.codeGenerator.localVarPertialSchedules )
     682    {
     683        compiler.codeGenerator.opfix_offset( pPertialSchedule, AllLocalVarSize );
     684    }
     685    compiler.codeGenerator.localVarPertialSchedules.clear();
    678686    BOOST_FOREACH( Variable *pVar, pUserProc->GetLocalVars() ){
    679687        //後にデバッグで利用する
     
    685693
    686694    //ローカル変数用メモリを確保するためのスケジュール(subコマンド)
    687     *((long *)(OpBuffer+LocalVarSchedule))=AllLocalVarSize-BaseOffset;
     695    compiler.codeGenerator.opfix( pAllLocalVarPertialSchedule, AllLocalVarSize - BaseOffset );
    688696
    689697    //pop edi
Note: See TracChangeset for help on using the changeset viewer.