Changeset 364 in dev for trunk/abdev/BasicCompiler_Common/src/Exception.cpp
- Timestamp:
- Nov 11, 2007, 3:12:06 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/src/Exception.cpp
r361 r364 103 103 void Try() 104 104 { 105 // レキシカルスコープをレベルアップ 106 compiler.codeGenerator.lexicalScopes.Start( 107 compiler.codeGenerator.GetNativeCodeSize(), 108 LexicalScope::SCOPE_TRY 109 ); 105 110 } 106 111 … … 113 118 } 114 119 120 if( catchScopes.size() ) 121 { 122 // 既に1回以上のCatchが存在するとき 123 124 // レキシカルスコープをレベルダウン 125 compiler.codeGenerator.lexicalScopes.End(); 126 } 127 115 128 JmpFinally(); 116 129 117 130 catchScopes.push_back( CatchScope( paramType, compiler.codeGenerator.GetNativeCodeSize() ) ); 131 132 // レキシカルスコープをレベルアップ 133 compiler.codeGenerator.lexicalScopes.Start( 134 compiler.codeGenerator.GetNativeCodeSize(), 135 LexicalScope::SCOPE_CATCH 136 ); 118 137 } 119 138 void Finally() … … 125 144 } 126 145 146 if( catchScopes.size() ) 147 { 148 // 既に1回以上のCatchが存在するとき 149 150 // レキシカルスコープをレベルダウン 151 compiler.codeGenerator.lexicalScopes.End(); 152 } 153 127 154 isDefinedFinally = true; 128 155 129 156 ResolveJmpFinally(); 157 158 // レキシカルスコープをレベルアップ 159 compiler.codeGenerator.lexicalScopes.Start( 160 compiler.codeGenerator.GetNativeCodeSize(), 161 LexicalScope::SCOPE_FINALLY 162 ); 130 163 } 131 164 … … 136 169 Finally(); 137 170 } 171 172 if( catchScopes.size() || isDefinedFinally ) 173 { 174 // 既に1回以上のCatch、またはFinallyが存在するとき 175 176 // レキシカルスコープをレベルダウン 177 compiler.codeGenerator.lexicalScopes.End(); 178 } 179 180 // レキシカルスコープをレベルダウン 181 compiler.codeGenerator.lexicalScopes.End(); 138 182 } 139 183 … … 174 218 175 219 // Catchアドレス 176 compiler.GetObjectModule().dataTable.schedules.push_back( Schedule( &UserProc::CompilingUserProc(), dataTableOffset + pos ) ); 220 const UserProc *pUserProc = &UserProc::CompilingUserProc(); 221 if( UserProc::IsGlobalAreaCompiling() ) 222 { 223 pUserProc = UserProc::pGlobalProc; 224 } 225 compiler.GetObjectModule().dataTable.schedules.push_back( Schedule( pUserProc, dataTableOffset + pos ) ); 177 226 compiler.GetObjectModule().dataTable.schedules.back().SpecifyCatchAddress(); 178 227 pos += sizeof(LONG_PTR); … … 188 237 void TryCommand() 189 238 { 190 if( UserProc::IsGlobalAreaCompiling() )191 {192 SetError();193 }194 195 239 tryScopes.push_back( TryScope() ); 196 240 tryScopes.back().Try(); … … 213 257 } 214 258 259 char varName[VN_SIZE]; 215 260 Type paramType; 216 261 if( parameter[0] ) 217 262 { 218 char varName[VN_SIZE],typeName[VN_SIZE];263 char typeName[VN_SIZE]; 219 264 SplitSyntacticForAs( parameter, varName, typeName ); 220 265 if( !typeName[0] ) … … 232 277 233 278 tryScopes.back().Catch( paramType ); 279 280 if( paramType.IsObject() ) 281 { 282 int backCp = cp; 283 284 char temporary[1024]; 285 sprintf( temporary, "Dim %s = Thread.CurrentThread().__GetThrowintParamObject() As %s", varName, paramType.GetClass().GetFullName().c_str() ); 286 MakeMiddleCode( temporary ); 287 ChangeOpcode( temporary ); 288 lstrcpy( temporary, "Thread.CurrentThread().__Catched()" ); 289 MakeMiddleCode( temporary ); 290 ChangeOpcode( temporary ); 291 292 cp = backCp; 293 } 234 294 } 235 295 void FinallyCommand()
Note:
See TracChangeset
for help on using the changeset viewer.