Changeset 357 in dev for trunk/abdev/BasicCompiler_Common/src/Exception.cpp
- Timestamp:
- Nov 5, 2007, 3:26:20 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/src/Exception.cpp
r206 r357 1 1 #include "stdafx.h" 2 3 #ifdef _AMD64_ 4 #include "../../BasicCompiler64/opcode.h" 5 #else 6 #include "../../BasicCompiler32/opcode.h" 7 #endif 2 8 3 9 #include <Exception.h> … … 5 11 namespace Exception{ 6 12 13 class TryScope 14 { 15 public: 16 const PertialSchedule *pPertialScheduleForCatchAddress; 17 TryScope() 18 { 19 } 20 ~TryScope() 21 { 22 } 7 23 8 void TryCommand(){ 24 void RegistPertialScheduleForCatchAddress( const PertialSchedule *pPertialScheduleForCatchAddress ) 25 { 26 this->pPertialScheduleForCatchAddress = pPertialScheduleForCatchAddress; 27 } 28 29 void AddCatch() 30 { 31 } 32 33 void EndTry() 34 { 35 } 36 }; 37 typedef std::vector<TryScope> TryScopes; 38 39 TryScopes tryScopes; 40 41 void TryCommand() 42 { 43 if( UserProc::IsGlobalAreaCompiling() ) 44 { 45 SetError(); 46 } 47 48 tryScopes.push_back( TryScope() ); 49 50 int backCp = cp; 51 52 char temporary[1024]; 53 lstrcpy( temporary, "_System_pobj_AllThreads->GetCurrentException()->BeginTryScope( _System_GetNowScopeCatchAddresses() As VoidPtr, _System_GetBp() As LONG_PTR, _System_GetSp() As LONG_PTR )" ); 54 MakeMiddleCode( temporary ); 55 ChangeOpcode( temporary ); 56 57 cp = backCp; 9 58 } 10 void CatchCommand(){ 59 void CatchCommand() 60 { 61 if( tryScopes.size() == 0 ) 62 { 63 SetError(1,NULL,cp); 64 return; 65 } 66 67 compiler.codeGenerator.opfix( tryScopes.back().pPertialScheduleForCatchAddress, compiler.codeGenerator.GetNativeCodeSize() ); 11 68 } 12 void FinallyCommand(){ 69 void FinallyCommand() 70 { 13 71 } 14 void EndTryCommand(){ 72 void EndTryCommand() 73 { 74 if( tryScopes.size() == 0 ) 75 { 76 SetError(1,NULL,cp); 77 return; 78 } 79 80 int backCp = cp; 81 82 char temporary[1024]; 83 lstrcpy( temporary, "_System_pobj_AllThreads->GetCurrentException()->EndTryScope()" ); 84 MakeMiddleCode( temporary ); 85 ChangeOpcode( temporary ); 86 87 cp = backCp; 88 89 tryScopes.pop_back(); 15 90 } 16 91 17 void ThrowCommand( const char *Parameter ){ 92 void ThrowCommand( const char *Parameter ) 93 { 94 int backCp = cp; 95 96 char temporary[1024]; 97 lstrcpy( temporary, "_System_pobj_AllThreads->GetCurrentException()->_Throw()" ); 98 MakeMiddleCode( temporary ); 99 ChangeOpcode( temporary ); 100 101 cp = backCp; 102 } 103 104 void Opcode_Func_System_GetNowScopeCatchAddress() 105 { 106 if( tryScopes.size() == 0 ) 107 { 108 SetError(1,NULL,cp); 109 return; 110 } 111 112 #ifdef _WIN64 113 //mov rax,catchAddress 114 const PertialSchedule *pPertialSchedule = compiler.codeGenerator.op_mov_RV( sizeof(long), REG_RAX, 0, Schedule::CatchAddress, true ); 115 #else 116 //mov eax,catchAddress 117 const PertialSchedule *pPertialSchedule = compiler.codeGenerator.op_mov_RV( REG_EAX, 0, Schedule::CatchAddress, true ); 118 #endif 119 120 tryScopes.back().RegistPertialScheduleForCatchAddress( pPertialSchedule ); 121 122 /* 123 int dataTableOffset = compiler.GetObjectModule().dataTable.Add( static_cast<LONG_PTR>(0) ); 124 125 #ifdef _WIN64 126 //mov rax,dataTableOffset 127 compiler.codeGenerator.op_mov_RV( sizeof(_int64), REG_RAX, dataTableOffset, Schedule::DataTable); 128 #else 129 //mov eax,dataTableOffset 130 compiler.codeGenerator.op_mov_RV( REG_EAX, dataTableOffset, Schedule::DataTable); 131 #endif 132 */ 18 133 } 19 134
Note:
See TracChangeset
for help on using the changeset viewer.