source: dev/trunk/ab5.0/abdev/ab_common/src/Lexical/NativeCode.cpp@ 750

Last change on this file since 750 was 750, checked in by イグトランス (egtra), 16 years ago

BOOST_FOREACHを可能なものはVC++ 2005 for eachへ置換(やや速くなる)。

File size: 5.1 KB
RevLine 
[232]1#include "stdafx.h"
2
[237]3#define BREAK_EIP(checkEip) (obp+0x00401000>=checkEip)
[232]4
[465]5const ::DllProc &Schedule::GetDllProc() const
6{
[549]7 _ASSERT( type == Schedule::DllProc );
[465]8 return *pDllProc;
9}
10const ::UserProc &Schedule::GetUserProc() const
11{
[549]12 _ASSERT( type == Schedule::UserProc || type == Schedule::AddressOf || type == Schedule::CatchAddress );
[465]13 return *pUserProc;
14}
15const ::CClass &Schedule::GetClass() const
16{
[549]17 _ASSERT( type == Schedule::ComVtbl || type == Schedule::Vtbl || type == Schedule::TypeInfo );
[465]18 return *pClass;
19}
20
[640]21bool Schedule::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
[639]22{
23 switch( type )
24 {
25 case UserProc:
26 case AddressOf:
27 case CatchAddress:
[640]28 if( this->pUserProc->IsNeedResolve() )
[639]29 {
[640]30 const ::UserProc *pTempUserProc = resolver.meta.GetUserProcs().FindLike( this->pUserProc );
31 if( pTempUserProc )
32 {
33 this->pUserProc = pTempUserProc;
34 }
35 else
36 {
37 resolveErrors.Add( ResolveError( this->pUserProc->GetRelationalObjectModuleIndex(), this->pUserProc->GetFullName() ) );
38 }
[639]39 }
40 break;
41 case DllProc:
[640]42 if( this->pDllProc->IsNeedResolve() )
[639]43 {
[640]44 const ::DllProc *pTempDllProc = resolver.meta.GetDllProcs().FindLike( this->pDllProc );
45 if( pTempDllProc )
46 {
47 this->pDllProc = pTempDllProc;
48 }
49 else
50 {
51 resolveErrors.Add( ResolveError( this->pDllProc->GetRelationalObjectModuleIndex(), this->pDllProc->GetFullName() ) );
52 }
[639]53 }
54 break;
55 case ComVtbl:
56 case Vtbl:
57 case TypeInfo:
[640]58 if( this->pClass->IsNeedResolve() )
[639]59 {
[640]60 const CClass *pTempClass = resolver.meta.GetClasses().FindLike( this->pClass );
61 if( pTempClass )
62 {
63 this->pClass = pTempClass;
64 }
65 else
66 {
67 resolveErrors.Add( ResolveError( this->pClass->GetRelationalObjectModuleIndex(), this->pClass->GetFullName() ) );
68 }
[639]69 }
70 break;
71 default:
72 break;
73 }
74
75 return true;
76}
77
[287]78void NativeCode::PutEx( const NativeCode &nativeCode )
[232]79{
[287]80 long baseOffset = GetSize();
[257]81
[263]82 // コードバッファを追加
[287]83 Put( nativeCode.GetBuffer(), nativeCode.GetSize() );
[257]84
[263]85 // スケジュールを追加
[750]86 foreach( const Schedule &schedule, nativeCode.schedules )
[257]87 {
88 this->schedules.push_back(
89 Schedule(
90 schedule.GetType(),
[258]91 baseOffset + schedule.GetOffset(),
92 schedule.GetLongPtrValue()
[257]93 )
94 );
95 }
[263]96
97 // ソースコード行番号とネイティブコード位置の対応情報を追加
[750]98 foreach( const SourceLine &sourceLine, nativeCode.sourceLines )
[263]99 {
100 this->sourceLines.push_back(
101 SourceLine(
102 baseOffset + sourceLine.GetNativeCodePos(),
[637]103 sourceLine.GetCodeType(),
104 sourceLine.GetSourceCodePosition()
[263]105 )
106 );
107 }
[257]108}
109
[357]110void NativeCode::PutEx( long l, Schedule::Type scheduleType )
111{
[551]112 if( scheduleType != Schedule::None )
[357]113 {
[551]114 schedules.push_back( Schedule( scheduleType, GetSize() ) );
[357]115 }
116
[551]117 Put( l );
[357]118}
119
[245]120void NativeCode::PutUserProcSchedule( const UserProc *pUserProc, bool isCall )
121{
122 pUserProc->Using();
123
[550]124 Schedule::Type type = isCall ? Schedule::UserProc : Schedule::AddressOf;
[245]125
[550]126 schedules.push_back( Schedule( type, pUserProc, GetSize() ) );
127
[287]128 Put( (long)0 );
[245]129}
[250]130
[357]131void NativeCode::PutCatchAddressSchedule( const UserProc *pUserProc, long codePos )
132{
133 pUserProc->Using();
134
[550]135 schedules.push_back( Schedule( Schedule::CatchAddress, pUserProc, GetSize() ) );
[357]136
137 Put( codePos );
138}
139
[250]140void NativeCode::PutDllProcSchedule( const DllProc *pDllProc )
141{
[287]142 schedules.push_back( Schedule( pDllProc, GetSize() ) );
[250]143
[287]144 Put( (long)0 );
[250]145}
[263]146
[370]147void NativeCode::PutComVtblSchedule( const CClass *pClass )
148{
149 schedules.push_back( Schedule( Schedule::ComVtbl, pClass, GetSize() ) );
150
151 Put( (long)0 );
152}
153
[282]154void NativeCode::PutVtblSchedule( const CClass *pClass )
155{
[370]156 schedules.push_back( Schedule( Schedule::Vtbl, pClass, GetSize() ) );
[282]157
[287]158 Put( (long)0 );
[282]159}
160
[641]161void NativeCode::NextSourceLine( const SourceCodePosition &sourceCodePosition, bool isInSystemProc )
[263]162{
163 if( sourceLines.size() )
164 {
[287]165 if( sourceLines.back().GetNativeCodePos() == GetSize() )
[263]166 {
[637]167 sourceLines.back().SetSourceCodePosition( sourceCodePosition );
[263]168 return;
169 }
170 }
171
172 extern BOOL bDebugSupportProc;
173 DWORD sourceLineType = 0;
174 if( bDebugSupportProc )
175 {
176 sourceLineType |= CODETYPE_DEBUGPROC;
177 }
[641]178 if( isInSystemProc )
[263]179 {
180 sourceLineType |= CODETYPE_SYSTEMPROC;
181 }
[280]182 sourceLines.push_back(
183 SourceLine(
[287]184 GetSize(),
[637]185 sourceLineType,
186 sourceCodePosition
[280]187 )
188 );
[263]189}
[273]190
191void NativeCode::ResetDataSectionBaseOffset( long dataSectionBaseOffset )
192{
[750]193 foreach( const Schedule &schedule, schedules )
[273]194 {
195 if( schedule.GetType() == Schedule::DataTable )
196 {
197 Overwrite(
198 schedule.GetOffset(),
199 GetLong( schedule.GetOffset() ) + dataSectionBaseOffset
200 );
201 }
202 }
203}
[637]204void NativeCode::ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable )
[280]205{
206 BOOST_FOREACH( SourceLine &sourceLine, sourceLines )
207 {
[637]208 sourceLine.GetSourceCodePosition().SetRelationalObjectModuleIndex(
209 relationTable[sourceLine.GetSourceCodePosition().GetRelationalObjectModuleIndex()]
210 );
[280]211 }
212}
[637]213
[640]214void NativeCode::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
[637]215{
[639]216 BOOST_FOREACH( Schedule &schedule, schedules )
217 {
[640]218 schedule.Resolve( resolver, resolveErrors );
[639]219 }
[637]220}
Note: See TracBrowser for help on using the repository browser.