Changeset 206 in dev for trunk/abdev/BasicCompiler32/MakePeHdr.cpp
- Timestamp:
- Jul 12, 2007, 2:58:26 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/MakePeHdr.cpp
r201 r206 1 #include "stdafx.h" 2 1 3 #include <jenga/include/common/Environment.h> 2 4 … … 4 6 5 7 #include <LexicalScopingImpl.h> 6 #include <Class Impl.h>8 #include <Class.h> 7 9 #include <Compiler.h> 8 10 #include <NamespaceSupporter.h> 9 11 12 #include <../Enum.h> 13 10 14 #include "../BasicCompiler_Common/common.h" 15 #include "../BasicCompiler_Common/DebugSection.h" 11 16 #include "Opcode.h" 12 17 … … 19 24 20 25 // グローバル関数、静的メソッド 21 UserProc26 const UserProc 22 27 *pSub_System_StartupProgram, 23 28 *pSub_DebugSys_StartProc, … … 51 56 52 57 // 動的メソッド 53 UserProc58 const UserProc 54 59 *pUserProc_System_CGarbageCollection_RegisterGlobalRoots; 55 60 … … 176 181 177 182 //クラス名を取得(詳細情報はGetAllClassInfoで取得) 178 // GetSubInfo関数の中で参照されるオブジェクト名を事前に取得する。183 // CollectUserProcs関数の中で参照されるオブジェクト名を事前に取得する。 179 184 // ※オブジェクトの内容までは取得しない 180 185 compiler.GetMeta().GetClasses().CollectClassesForNameOnly( Smoothie::Lexical::source ); … … 186 191 GetConstInfo(); 187 192 188 // サブルーチン(ユーザー定義、DLL関数)の識別子、アドレスを取得189 Smoothie::Temp::pCompilingClass=0;190 GetSubInfo();191 192 // クラス情報を取得(※注 - GetSubInfoの後に呼び出す)193 // サブルーチン(ユーザー定義、DLL関数)の識別子、アドレスを取得 194 compiler.pCompilingClass=0; 195 UserProcs::CollectUserProcs( Smoothie::Lexical::source, compiler.GetMeta().GetUserProcs() ); 196 197 // クラス情報を取得(※注 - CollectUserProcsの後に呼び出す) 193 198 compiler.GetMeta().GetClasses().GetAllClassInfo(); 199 200 // サブルーチン(ユーザー定義、DLL関数)のイテレータの準備 201 compiler.GetMeta().GetUserProcs().Iterator_Init(); 194 202 195 203 if( !compiler.GetMeta().Write( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" ) ) … … 197 205 MessageBox(0,"XML書き込みに失敗","test",0); 198 206 } 199 MetaImpl tempMeta;200 if( ! tempMeta.Read( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" ) )207 MetaImpl *pTempMeta = new MetaImpl(); 208 if( !pTempMeta->Read( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" ) ) 201 209 { 202 210 MessageBox(0,"XML読み込みに失敗","test",0); 203 211 } 212 compiler.GetMeta() = (*pTempMeta); 204 213 205 214 //コードと行番号の関係 … … 401 410 extern DWORD dwContinueAddress; 402 411 dwContinueAddress=-1; 412 413 trace_for_sourcecodestep( "★★★ グローバル領域のコンパイルを開始" ); 403 414 404 415 … … 451 462 452 463 //call _System_End 453 extern UserProc *pSub_System_End;464 extern const UserProc *pSub_System_End; 454 465 op_call(pSub_System_End); 455 466 … … 593 604 ExportNamesLength=lstrlen(lpExportNames)+1; 594 605 595 extern GlobalProc **ppSubHash; 596 GlobalProc *pUserProc,*psi2; 606 UserProc *pUserProc,*psi2; 597 607 while(1){ 598 608 //辞書順にサーチ 599 609 temporary[0]=0; 600 for(i=0,psi2=0;i<MAX_HASH;i++){ 601 pUserProc=ppSubHash[i]; 602 while(pUserProc){ 603 if(pUserProc->IsExport()){ 604 if(temporary[0]=='\0'){ 610 compiler.GetMeta().GetUserProcs().Iterator_Reset(); 611 while( compiler.GetMeta().GetUserProcs().Iterator_HasNext() ) 612 { 613 pUserProc = compiler.GetMeta().GetUserProcs().Iterator_GetNext(); 614 if(pUserProc->IsExport()){ 615 if(temporary[0]=='\0'){ 616 lstrcpy(temporary,pUserProc->GetName().c_str()); 617 psi2=pUserProc; 618 } 619 else{ 620 i3=lstrlen(temporary); 621 i4=(int)pUserProc->GetName().size(); 622 if(i3<i4) i3=i4; 623 if(memcmp(temporary,pUserProc->GetName().c_str(),i3)>0){ 605 624 lstrcpy(temporary,pUserProc->GetName().c_str()); 606 625 psi2=pUserProc; 607 626 } 608 else{609 i3=lstrlen(temporary);610 i4=(int)pUserProc->GetName().size();611 if(i3<i4) i3=i4;612 if(memcmp(temporary,pUserProc->GetName().c_str(),i3)>0){613 lstrcpy(temporary,pUserProc->GetName().c_str());614 psi2=pUserProc;615 }616 }617 627 } 618 pUserProc=pUserProc->pNextData;619 628 } 620 629 } … … 625 634 626 635 if( pUserProc->GetName() == "DllMain" ){ 627 DllMain_EntryPoint=pUserProc-> beginOpAddress;636 DllMain_EntryPoint=pUserProc->GetBeginOpAddress(); 628 637 } 629 638 630 639 lpdwExportAddressTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportAddressTable,(ExportNum+1)*sizeof(DWORD)); 631 lpdwExportAddressTable[ExportNum]=pUserProc-> beginOpAddress;640 lpdwExportAddressTable[ExportNum]=pUserProc->GetBeginOpAddress(); 632 641 633 642 lpdwExportNamePointerTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportNamePointerTable,(ExportNum+1)*sizeof(DWORD)); … … 808 817 //(デバッグ情報で利用される) 809 818 extern int AllInitGlobalVarSize; 810 BOOST_FOREACH( Variable *pVar, globalVars){811 if(pVar-> offset&0x80000000){812 pVar-> offset=(pVar->offset&0x7FFFFFFF)+AllInitGlobalVarSize;819 BOOST_FOREACH( Variable *pVar, compiler.GetMeta().GetGlobalVars() ){ 820 if(pVar->GetOffsetAddress()&0x80000000){ 821 pVar->SetOffsetAddress( (pVar->GetOffsetAddress()&0x7FFFFFFF)+AllInitGlobalVarSize ); 813 822 } 814 823 } … … 1110 1119 // プロシージャポインタスケジュール 1111 1120 for(i=0;i<pobj_SubAddrSchedule->num;i++){ 1112 if(pobj_SubAddrSchedule->ppsi[i]-> beginOpAddress==01113 &&pobj_SubAddrSchedule->ppsi[i]-> endOpAddress==0){1121 if(pobj_SubAddrSchedule->ppsi[i]->GetBeginOpAddress()==0 1122 &&pobj_SubAddrSchedule->ppsi[i]->GetEndOpAddress()==0){ 1114 1123 SetError(300,NULL,-1); 1115 1124 } … … 1117 1126 if(pobj_SubAddrSchedule->pbCall[i]){ 1118 1127 *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))= 1119 pobj_SubAddrSchedule->ppsi[i]-> beginOpAddress-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));1128 pobj_SubAddrSchedule->ppsi[i]->GetBeginOpAddress()-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long)); 1120 1129 } 1121 1130 else{ 1122 1131 *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))= 1123 pobj_SubAddrSchedule->ppsi[i]-> beginOpAddress+ImageBase+MemPos_CodeSection;1132 pobj_SubAddrSchedule->ppsi[i]->GetBeginOpAddress()+ImageBase+MemPos_CodeSection; 1124 1133 } 1125 1134 }
Note:
See TracChangeset
for help on using the changeset viewer.