- Timestamp:
- Aug 19, 2008, 2:13:22 PM (16 years ago)
- Location:
- trunk/ab5.0/abdev/BasicCompiler_Common
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/BasicCompiler_Common/include/LexicalAnalyzer.h
r708 r726 39 39 static void Implements( CClass &_class, Interface *pInterface, std::vector<DynamicMethod::OverrideResult> &overrideResults ); 40 40 static bool Implements( CClass &_class, const char *interfaceNames, int nowLine ); 41 static void LookaheadClass( const char *className, Classes &classes );41 static void LookaheadClass( const std::string &className, Classes &classes ); 42 42 static bool LoopRefCheck( const CClass &objClass ); 43 43 static void CollectClasses( const char *source, Classes &classes ); -
trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp
r723 r726 8 8 #endif 9 9 10 #include <hash_set> 11 10 12 using namespace ActiveBasic::Compiler; 11 13 … … 167 169 168 170 class CLoopRefCheck{ 169 char **names; 170 int num; 171 void init(){ 172 int i; 173 for(i=0;i<num;i++){ 174 free(names[i]); 175 } 176 free(names); 177 } 171 stdext::hash_set<std::string> names; 172 178 173 public: 179 174 CLoopRefCheck() 180 175 { 181 names=(char **)malloc(1);182 num=0;183 176 } 184 177 ~CLoopRefCheck() 185 178 { 186 init(); 187 } 188 void add(const char *lpszInheritsClass) 189 { 190 names=(char **)realloc(names,(num+1)*sizeof(char *)); 191 names[num]=(char *)malloc(lstrlen(lpszInheritsClass)+1); 192 lstrcpy(names[num],lpszInheritsClass); 193 num++; 194 } 195 void del(const char *lpszInheritsClass) 196 { 197 int i; 198 for(i=0;i<num;i++){ 199 if(lstrcmp(names[i],lpszInheritsClass)==0){ 200 free(names[i]); 201 break; 202 } 203 } 204 if(i!=num){ 205 num--; 206 for(;i<num;i++){ 207 names[i]=names[i+1]; 208 } 209 } 210 } 211 BOOL check(const CClass &inheritsClass) const 179 } 180 void add(const std::string &lpszInheritsClass) 181 { 182 names.insert(lpszInheritsClass); 183 } 184 void del(const std::string &lpszInheritsClass) 185 { 186 names.erase(lpszInheritsClass); 187 } 188 bool check(const CClass &inheritsClass) const 212 189 { 213 190 //ループ継承チェック 214 int i; 215 for(i=0;i<num;i++){ 216 if( inheritsClass.GetName() == names[i] ){ 217 return 1; 218 } 219 } 220 return 0; 221 } 191 return names.find(inheritsClass.GetName()) != names.end(); 192 } 193 private: 194 CLoopRefCheck(const CLoopRefCheck&); 195 CLoopRefCheck& operator =(const CLoopRefCheck&); 222 196 }; 223 197 CLoopRefCheck *pobj_LoopRefCheck; … … 243 217 } 244 218 245 pobj_LoopRefCheck->add(objClass.GetName() .c_str());219 pobj_LoopRefCheck->add(objClass.GetName()); 246 220 247 221 bool tempResult = MemberVar_LoopRefCheck(pMember->GetType().GetClass()); … … 251 225 } 252 226 253 pobj_LoopRefCheck->del(objClass.GetName() .c_str());227 pobj_LoopRefCheck->del(objClass.GetName()); 254 228 } 255 229 } … … 403 377 // インターフェイスが未解析のとき 404 378 LexicalAnalyzer::LookaheadClass( 405 pInterface->GetClass().GetName() .c_str(),379 pInterface->GetClass().GetName(), 406 380 compiler.GetObjectModule().meta.GetClasses() 407 381 ); … … 494 468 //継承先が読み取られていないとき 495 469 LexicalAnalyzer::LookaheadClass( 496 pInheritsClass->GetName() .c_str(),470 pInheritsClass->GetName(), 497 471 compiler.GetObjectModule().meta.GetClasses() 498 472 ); … … 526 500 //継承先が読み取られていないとき 527 501 LexicalAnalyzer::LookaheadClass( 528 pObjectClass->GetName() .c_str(),502 pObjectClass->GetName(), 529 503 compiler.GetObjectModule().meta.GetClasses() 530 504 ); … … 652 626 // インターフェイスが未解析のとき 653 627 LexicalAnalyzer::LookaheadClass( 654 pInterfaceClass->GetName() .c_str(),628 pInterfaceClass->GetName(), 655 629 compiler.GetObjectModule().meta.GetClasses() 656 630 ); … … 1256 1230 if(pobj_c->GetDynamicMembers().back()->GetType().IsStruct()){ 1257 1231 //循環参照のチェック 1258 pobj_LoopRefCheck->add(pobj_c->GetName() .c_str());1232 pobj_LoopRefCheck->add(pobj_c->GetName()); 1259 1233 if(!MemberVar_LoopRefCheck(pobj_c->GetDynamicMembers().back()->GetType().GetClass())){ 1260 1234 //エラー回避 … … 1262 1236 type.SetBasicType( DEF_PTR_VOID ); 1263 1237 } 1264 pobj_LoopRefCheck->del(pobj_c->GetName() .c_str());1238 pobj_LoopRefCheck->del(pobj_c->GetName()); 1265 1239 } 1266 1240 } … … 1340 1314 } 1341 1315 1342 void LexicalAnalyzer::LookaheadClass( const char *className, Classes &classes )1316 void LexicalAnalyzer::LookaheadClass( const std::string &className, Classes &classes ) 1343 1317 { 1344 1318 pobj_LoopRefCheck->add( className ); 1345 GetClass_recur( className , classes );1319 GetClass_recur( className.c_str(), classes ); 1346 1320 pobj_LoopRefCheck->del( className ); 1347 1321 }
Note:
See TracChangeset
for help on using the changeset viewer.