Changeset 75 in dev for BasicCompiler_Common/Class.cpp
- Timestamp:
- Mar 20, 2007, 4:36:16 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/Class.cpp
r73 r75 16 16 17 17 18 CMember::CMember( CClass *pobj_c, DWORD access, bool isConst, bool isRef, char *buffer, int NowLine ){18 CMember::CMember( CClass *pobj_c, DWORD access, bool isConst, bool isRef, char *buffer, int nowLine ){ 19 19 extern int cp; 20 20 … … 23 23 char init_buf[VN_SIZE]; 24 24 char constract_parameter[VN_SIZE]; 25 GetDimentionFormat(buffer, isRef,VarName,SubScripts,&TypeInfo,init_buf,constract_parameter);25 GetDimentionFormat(buffer,VarName,SubScripts,*this,init_buf,constract_parameter); 26 26 27 27 //重複チェック … … 30 30 } 31 31 32 if( TypeInfo.type==DEF_OBJECT){33 if( TypeInfo.u.pobj_Class->IsAbstract()){32 if( IsObject() ){ 33 if( GetClass().IsAbstract() ){ 34 34 //抽象クラスだったとき 35 SetError(125, TypeInfo.u.pobj_Class->name,cp);35 SetError(125,GetClass().name,cp); 36 36 } 37 37 } … … 47 47 this->isConst = isConst; 48 48 49 //参照型かどうか50 this->isRef = isRef;51 52 49 //初期データ 53 50 InitBuf=(char *)HeapAlloc(hHeap,0,lstrlen(init_buf)+1); … … 59 56 60 57 //ソースコードの位置 61 source_code_address= NowLine;62 } 63 CMember::CMember(CMember *pobj){64 //コピーコンストラクタ65 memset(this,0,sizeof(CMember)); 58 source_code_address=nowLine; 59 } 60 CMember::CMember(CMember &member): 61 Type( member ) 62 { 66 63 67 64 //name 68 name=(char *)HeapAlloc(hHeap,0,lstrlen( pobj->name)+1);69 lstrcpy(name, pobj->name);65 name=(char *)HeapAlloc(hHeap,0,lstrlen(member.name)+1); 66 lstrcpy(name,member.name); 70 67 71 68 //定数扱いかどうか 72 isConst = pobj->isConst; 73 74 //参照型かどうか 75 isRef = pobj->isRef; 69 isConst = member.isConst; 76 70 77 71 //SubScripts 78 memcpy(SubScripts,pobj->SubScripts,MAX_ARRAYDIM*sizeof(int)); 79 80 //TypeInfo 81 TypeInfo=pobj->TypeInfo; 72 memcpy(SubScripts,member.SubScripts,MAX_ARRAYDIM*sizeof(int)); 82 73 83 74 //ソースコードの位置 84 source_code_address= pobj->source_code_address;75 source_code_address=member.source_code_address; 85 76 } 86 77 CMember::CMember(){ … … 95 86 bool CMember::IsConst(){ 96 87 return isConst; 97 }98 bool CMember::IsRef(){99 return isRef;100 }101 102 int CMember::GetSize(){103 //メンバサイズを取得104 return GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);105 88 } 106 89 … … 126 109 temporary, 127 110 member->SubScripts, 128 member->TypeInfo, 129 GetTypeSize(member->TypeInfo.type,member->TypeInfo.u.lpIndex), 111 *member, 130 112 member->InitBuf, 131 113 member->ConstractParameter, … … 151 133 memset(this,0,sizeof(CMethod)); 152 134 153 p si=pobj->psi;135 pUserProc=pobj->pUserProc; 154 136 155 137 bAbstract=pobj->bAbstract; … … 224 206 iMemberNum=pInheritsClass->iMemberNum; 225 207 for(i3=0;i3<pInheritsClass->iMemberNum;i3++){ 226 ppobj_Member[i3]=new CMember( pInheritsClass->ppobj_Member[i3]);208 ppobj_Member[i3]=new CMember( *pInheritsClass->ppobj_Member[i3] ); 227 209 228 210 //dwAccess … … 263 245 iMemberNum++; 264 246 } 265 void CClass::AddStaticMember( DWORD dwAccess, bool isConst, bool isRef, char *buffer, int NowLine ){266 CMember *member = new CMember( this, dwAccess, isConst, isRef, buffer, NowLine );247 void CClass::AddStaticMember( DWORD dwAccess, bool isConst, bool isRef, char *buffer, int nowLine ){ 248 CMember *member = new CMember( this, dwAccess, isConst, isRef, buffer, nowLine ); 267 249 staticMembers.push_back( member ); 268 250 } 269 void CClass::AddMethod( SubInfo *psi,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual ){251 void CClass::AddMethod( UserProc *pUserProc,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual ){ 270 252 CMethod *method = new CMethod(); 271 method->p si = psi;253 method->pUserProc = pUserProc; 272 254 method->dwAccess = dwAccess; 273 255 method->isConst = isConst; … … 277 259 278 260 methods.push_back( method ); 279 } 280 void CClass::AddStaticMethod(SubInfo *psi,DWORD dwAccess){ 261 262 // プロシージャオブジェクトと関連付け 263 pUserProc->SetMethod( method ); 264 } 265 void CClass::AddStaticMethod(UserProc *pUserProc,DWORD dwAccess){ 281 266 CMethod *method = new CMethod(); 282 method->p si=psi;267 method->pUserProc=pUserProc; 283 268 method->dwAccess=dwAccess; 284 269 method->bAbstract=0; … … 287 272 288 273 staticMethods.push_back( method ); 274 275 // プロシージャオブジェクトと関連付け 276 pUserProc->SetMethod( method ); 289 277 } 290 278 BOOL CClass::DupliCheckAll(const char *name){ … … 296 284 //メソッド 297 285 foreach( CMethod *method, methods ){ 298 if( lstrcmp( name, method->p si->name) == 0 ){286 if( lstrcmp( name, method->pUserProc->GetName().c_str() ) == 0 ){ 299 287 return 1; 300 288 } … … 322 310 return 0; 323 311 } 324 CMethod *CClass::GetMethodInfo( SubInfo *psi ){ 312 CMethod *CClass::GetMethodInfo( UserProc *pUserProc ) const 313 { 325 314 for( int i=(int)methods.size()-1; i>=0; i-- ){ 326 if( p si == methods[i]->psi) return methods[i];315 if( pUserProc == methods[i]->pUserProc ) return methods[i]; 327 316 } 328 317 return NULL; 329 318 } 330 CMethod *CClass::GetStaticMethodInfo( SubInfo *psi ){ 319 CMethod *CClass::GetStaticMethodInfo( UserProc *pUserProc ) const 320 { 331 321 for( int i=(int)staticMethods.size()-1; i>=0; i-- ){ 332 if( p si == staticMethods[i]->psi) return staticMethods[i];322 if( pUserProc == staticMethods[i]->pUserProc ) return staticMethods[i]; 333 323 } 334 324 return NULL; 335 325 } 336 bool CClass::IsExistMethod( const char *name ){ 326 bool CClass::IsExistMethod( const char *name ) const 327 { 337 328 foreach( CMethod *method, methods ){ 338 if( lstrcmp( method->psi->name, name ) == 0) return true;329 if( method->pUserProc->GetName() == name ) return true; 339 330 } 340 331 return false; 341 332 } 342 bool CClass::IsExistStaticMethod( const char *name ){ 333 bool CClass::IsExistStaticMethod( const char *name ) const 334 { 343 335 foreach( CMethod *method, staticMethods ){ 344 if( lstrcmp( method->psi->name, name ) == 0) return true;336 if( method->pUserProc->GetName() == name ) return true; 345 337 } 346 338 return false; 347 339 } 348 340 349 void CClass::EnumStaticMethod( const char *methodName, std::vector< SubInfo*> &subs ) const341 void CClass::EnumStaticMethod( const char *methodName, std::vector<UserProc *> &subs ) const 350 342 { 351 343 foreach( CMethod *method, staticMethods ){ 352 if( lstrcmp(methodName,method->psi->name)==0){353 subs.push_back( method->p si);354 } 355 } 356 } 357 358 void CClass::EnumMethod( const char *methodName, std::vector< SubInfo*> &subs ) const344 if( method->pUserProc->GetName() == methodName ){ 345 subs.push_back( method->pUserProc ); 346 } 347 } 348 } 349 350 void CClass::EnumMethod( const char *methodName, std::vector<UserProc *> &subs ) const 359 351 { 360 352 //オブジェクトのメンバ関数の場合 361 353 //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う 362 354 for( int i=(int)methods.size()-1; i>=0; i-- ){ 363 if( lstrcmp(methodName,methods[i]->psi->name)==0){364 subs.push_back( methods[i]->p si);365 } 366 } 367 } 368 369 void CClass::EnumMethod( const BYTE idOperatorCalc, std::vector< SubInfo*> &subs ) const355 if( methods[i]->pUserProc->GetName() == methodName ){ 356 subs.push_back( methods[i]->pUserProc ); 357 } 358 } 359 } 360 361 void CClass::EnumMethod( const BYTE idOperatorCalc, std::vector<UserProc *> &subs ) const 370 362 { 371 363 //オブジェクトのメンバ関数の場合 372 364 //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う 373 365 for( int i=(int)methods.size()-1; i>=0; i-- ){ 374 SubInfo *psi = methods[i]->psi;375 c har *temp = psi->name;366 UserProc *pUserProc = methods[i]->pUserProc; 367 const char *temp = pUserProc->GetName().c_str(); 376 368 if(temp[0]==1&&temp[1]==ESC_OPERATOR){ 377 369 if((BYTE)temp[2]==idOperatorCalc){ 378 subs.push_back( p si);370 subs.push_back( pUserProc ); 379 371 } 380 372 } … … 423 415 //アラインメントを算出 424 416 int member_size; 425 if( pMember->TypeInfo.type==DEF_STRUCT){417 if( pMember->IsStruct() ){ 426 418 //メンバクラスのアラインメントを取得 427 member_size=pMember-> TypeInfo.u.pobj_Class->GetAlignment();419 member_size=pMember->GetClass().GetAlignment(); 428 420 } 429 421 else{ … … 486 478 CMember *pMember = ppobj_Member[i]; 487 479 488 if(pMember-> TypeInfo.type==DEF_STRUCT){480 if(pMember->IsStruct()){ 489 481 //メンバクラスのアラインメントを取得 490 member_size=pMember-> TypeInfo.u.pobj_Class->GetAlignment();482 member_size=pMember->GetClass().GetAlignment(); 491 483 } 492 484 else{ … … 508 500 509 501 510 int CClass::GetFuncNumInVtbl( const SubInfo *psi) const502 int CClass::GetFuncNumInVtbl( const UserProc *pUserProc ) const 511 503 { 512 504 int n = 0; 513 505 foreach( CMethod *method, methods ){ 514 if( method->p si == psi) break;515 if( method-> psi->bVirtual ) n++;506 if( method->pUserProc == pUserProc ) break; 507 if( method->bVirtual ) n++; 516 508 } 517 509 return n; … … 527 519 ////////////////////////////////////// 528 520 529 SubInfo**ppsi;530 ppsi=( SubInfo **)HeapAlloc(hHeap,0,vtbl_num*sizeof(SubInfo*));521 UserProc **ppsi; 522 ppsi=(UserProc **)HeapAlloc(hHeap,0,vtbl_num*sizeof(UserProc *)); 531 523 532 524 //関数テーブルに値をセット … … 534 526 foreach( CMethod *method, methods ){ 535 527 if(method->bVirtual){ 536 method->p si->bUse=1;528 method->pUserProc->Using(); 537 529 538 530 if(method->bAbstract){ … … 542 534 ppsi[i2]=0; 543 535 } 544 else ppsi[i2]=method->p si;536 else ppsi[i2]=method->pUserProc; 545 537 i2++; 546 538 } … … 565 557 int i; 566 558 for(i=0;i<vtbl_num;i++){ 567 SubInfo *psi; 568 psi=(SubInfo *)pVtbl[i]; 569 if(!psi) continue; 570 pVtbl[i]=psi->CompileAddress+ImageBase+MemPos_CodeSection; 571 } 572 } 573 bool CClass::IsAbstract(){ 559 UserProc *pUserProc; 560 pUserProc=(UserProc *)pVtbl[i]; 561 if(!pUserProc) continue; 562 pVtbl[i]=pUserProc->beginOpAddress+ImageBase+MemPos_CodeSection; 563 } 564 } 565 bool CClass::IsAbstract() const 566 { 574 567 //未実装の仮想関数を持つ場合はtrueを返す 575 568 … … 584 577 //コンポジションの関係にあるメンバも検査する 585 578 for(int i=0;i < iMemberNum;i++){ 586 if(ppobj_Member[i]-> TypeInfo.type==DEF_OBJECT){587 if(ppobj_Member[i]-> TypeInfo.u.pobj_Class->IsAbstract())579 if(ppobj_Member[i]->IsObject()){ 580 if(ppobj_Member[i]->GetClass().IsAbstract()) 588 581 return true; 589 582 } … … 604 597 605 598 //コンストラクタをコンパイル中かどうかを判別 606 bool CClass::IsCompilingConstructor(){ 599 bool CClass::IsCompilingConstructor() const 600 { 607 601 return isCompilingConstructor; 608 602 } … … 619 613 620 614 //デストラクタをコンパイル中かどうかを判別 621 bool CClass::IsCompilingDestructor(){ 615 bool CClass::IsCompilingDestructor() const 616 { 622 617 return isCompilingDestructor; 623 618 } … … 625 620 626 621 //自身と等しいクラスかどうかを確認 627 bool CClass::IsEquals( CClass *pClass ){ 622 bool CClass::IsEquals( const CClass *pClass ) const 623 { 628 624 if( this == pClass ) return true; 629 625 return false; … … 631 627 632 628 //自身の派生クラスかどうかを確認 633 bool CClass::IsSubClass( CClass *pClass ){ 629 bool CClass::IsSubClass( const CClass *pClass ) const 630 { 634 631 pClass = pClass->pobj_InheritsClass; 635 632 while( pClass ){ … … 641 638 642 639 //自身と等しいまたは派生クラスかどうかを確認 643 bool CClass::IsEqualsOrSubClass( CClass *pClass ){ 640 bool CClass::IsEqualsOrSubClass( const CClass *pClass ) const 641 { 644 642 if( IsEquals( pClass ) ) return true; 645 643 return IsSubClass( pClass ); … … 722 720 } 723 721 724 CClass *CDBClass::AddClass(const char *name,int NowLine){722 CClass *CDBClass::AddClass(const char *name,int nowLine){ 725 723 ////////////////////////////////////////////////////////////////////////// 726 724 // クラスを追加 … … 753 751 if(lstrcmp(name,pobj_c2->name)==0){ 754 752 //重複した場合 755 SetError(15,name, NowLine);753 SetError(15,name,nowLine); 756 754 return 0; 757 755 } … … 781 779 basbuf[i+1]==ESC_INTERFACE 782 780 )){ 783 int NowLine;784 NowLine=i;781 int nowLine; 782 nowLine=i; 785 783 786 784 i+=2; … … 802 800 803 801 //クラスを追加 804 CClass *pClass = pobj_DBClass->AddClass(temporary, NowLine);802 CClass *pClass = pobj_DBClass->AddClass(temporary,nowLine); 805 803 if( pClass ){ 806 if( basbuf[ NowLine+1] == ESC_CLASS ){804 if( basbuf[nowLine+1] == ESC_CLASS ){ 807 805 pClass->classType = CClass::Class; 808 806 } 809 else if( basbuf[ NowLine+1] == ESC_INTERFACE ){807 else if( basbuf[nowLine+1] == ESC_INTERFACE ){ 810 808 pClass->classType = CClass::Interface; 811 809 } … … 820 818 821 819 void CDBClass::AddMethod(CClass *pobj_c, DWORD dwAccess, BOOL bStatic, bool isConst, BOOL bAbstract, 822 BOOL bVirtual, BOOL bOverride, char *buffer, int NowLine){820 BOOL bVirtual, BOOL bOverride, char *buffer, int nowLine){ 823 821 int i,i2; 824 822 char temporary[VN_SIZE]; … … 835 833 836 834 //関数ハッシュへ登録 837 SubInfo *psi;838 p si=AddSubData(buffer,NowLine,bVirtual,pobj_c,bStatic);839 if(!p si) return;835 UserProc *pUserProc; 836 pUserProc=AddSubData(buffer,nowLine,bVirtual,pobj_c, (bStatic!=0) ); 837 if(!pUserProc) return; 840 838 841 839 … … 849 847 850 848 //標準コンストラクタ(引数なし) 851 if(p si->params.size()==0) fConstructor=1;849 if(pUserProc->Params().size()==0) fConstructor=1; 852 850 853 851 //強制的にConst修飾子をつける … … 857 855 //デストラクタの場合はその名前が正しいかチェックを行う 858 856 if(lstrcmp(temporary+1,pobj_c->name)!=0) 859 SetError(117,NULL, NowLine);857 SetError(117,NULL,nowLine); 860 858 else 861 859 bDestructor=1; … … 864 862 // コンストラクタ、デストラクタのアクセシビリティをチェック 865 863 if(dwAccess!=ACCESS_PUBLIC){ 866 SetError(116,NULL, NowLine);864 SetError(116,NULL,nowLine); 867 865 dwAccess=ACCESS_PUBLIC; 868 866 } … … 884 882 885 883 if(pobj_c->DupliCheckMember(temporary)){ 886 SetError(15,temporary, NowLine);884 SetError(15,temporary,nowLine); 887 885 return; 888 886 } … … 893 891 if(method->pobj_InheritsClass) continue; 894 892 895 if( lstrcmp(temporary,method->psi->name)==0){896 if( Parameter::Equals( method->p si->params, psi->params) ){893 if( method->pUserProc->GetName() == temporary ){ 894 if( Parameter::Equals( method->pUserProc->Params(), pUserProc->Params() ) ){ 897 895 //関数名、パラメータ属性が合致したとき 898 SetError(15,p si->name,NowLine);896 SetError(15,pUserProc->GetName().c_str(),nowLine); 899 897 return; 900 898 } … … 903 901 904 902 //仮想関数の場合 905 if(bAbstract) p si->bCompile=1;903 if(bAbstract) pUserProc->CompleteCompile(); 906 904 907 905 //メソッドのオーバーライド 908 906 foreach( CMethod *method, pobj_c->methods ){ 909 if( lstrcmp(temporary,method->psi->name)==0){910 if( Parameter::Equals( method->p si->params, psi->params) ){911 912 if(method-> psi->bVirtual){907 if( method->pUserProc->GetName() == temporary ){ 908 if( Parameter::Equals( method->pUserProc->Params(), pUserProc->Params() ) ){ 909 910 if(method->bVirtual){ 913 911 //メンバ関数を上書き 914 method->p si=psi;912 method->pUserProc=pUserProc; 915 913 method->bAbstract=0; 916 914 917 915 if(!bOverride){ 918 SetError(127,NULL, NowLine);916 SetError(127,NULL,nowLine); 919 917 } 920 918 if(method->dwAccess!=dwAccess){ 921 SetError(128,NULL, NowLine);919 SetError(128,NULL,nowLine); 922 920 } 921 922 pUserProc->SetMethod( method ); 923 923 return; 924 924 } … … 927 927 } 928 928 929 if( psi->bVirtual){929 if(bVirtual){ 930 930 pobj_c->vtbl_num++; 931 931 } 932 932 933 933 if(bOverride){ 934 SetError(12,"Override", NowLine);934 SetError(12,"Override",nowLine); 935 935 } 936 936 937 937 if(bStatic){ 938 pobj_c->AddStaticMethod(p si,dwAccess);938 pobj_c->AddStaticMethod(pUserProc,dwAccess); 939 939 } 940 940 else{ 941 pobj_c->AddMethod(p si, dwAccess, isConst, bAbstract, bVirtual);942 } 943 } 944 945 BOOL CDBClass::MemberVar_LoopRefCheck( CClass *pobj_c){941 pobj_c->AddMethod(pUserProc, dwAccess, isConst, bAbstract, bVirtual); 942 } 943 } 944 945 BOOL CDBClass::MemberVar_LoopRefCheck(const CClass &objClass){ 946 946 int i,i2,bRet=1; 947 for(i=0;i< pobj_c->iMemberNum;i++){948 CMember *pMember = pobj_c->ppobj_Member[i];949 if(pMember-> TypeInfo.type==DEF_OBJECT){947 for(i=0;i<objClass.iMemberNum;i++){ 948 const CMember *pMember = objClass.ppobj_Member[i]; 949 if(pMember->IsObject()){ 950 950 //循環参照でないかをチェック 951 if(pobj_LoopRefCheck->check(pMember-> TypeInfo.u.pobj_Class->name)){951 if(pobj_LoopRefCheck->check(pMember->GetClass().name)){ 952 952 extern int cp; 953 SetError(124,pMember-> TypeInfo.u.pobj_Class->name,cp);953 SetError(124,pMember->GetClass().name,cp); 954 954 return 0; 955 955 } 956 956 957 pobj_LoopRefCheck->add( pobj_c->name);958 959 i2=MemberVar_LoopRefCheck(pMember-> TypeInfo.u.pobj_Class);957 pobj_LoopRefCheck->add(objClass.name); 958 959 i2=MemberVar_LoopRefCheck(pMember->GetClass()); 960 960 if(bRet==1) bRet=i2; 961 961 962 pobj_LoopRefCheck->del( pobj_c->name);962 pobj_LoopRefCheck->del(objClass.name); 963 963 } 964 964 } … … 1347 1347 1348 1348 1349 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]-> TypeInfo.type==DEF_OBJECT||1350 pobj_c->ppobj_Member[pobj_c->iMemberNum-1]-> TypeInfo.type==DEF_STRUCT){1351 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]-> TypeInfo.u.pobj_Class->ppobj_Member==0){1349 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsObject()|| 1350 pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsStruct()){ 1351 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().ppobj_Member==0){ 1352 1352 //参照先が読み取られていないとき 1353 GetClass_recur(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]-> TypeInfo.u.pobj_Class->name);1353 GetClass_recur(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().name); 1354 1354 } 1355 1355 } 1356 1356 1357 1357 1358 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]-> TypeInfo.type==DEF_OBJECT){1358 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsObject()){ 1359 1359 //循環参照のチェック 1360 1360 pobj_LoopRefCheck->add(pobj_c->name); 1361 if(!MemberVar_LoopRefCheck(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]-> TypeInfo.u.pobj_Class)){1361 if(!MemberVar_LoopRefCheck(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass())){ 1362 1362 //エラー回避 1363 pobj_c->ppobj_Member[pobj_c->iMemberNum-1]-> TypeInfo.type=DEF_PTR_VOID;1363 pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->SetBasicType( DEF_PTR_VOID ); 1364 1364 } 1365 1365 pobj_LoopRefCheck->del(pobj_c->name); … … 1438 1438 } 1439 1439 1440 void CDBClass::StartCompile( SubInfo *psi){1441 pCompilingClass = p si->pobj_ParentClass;1440 void CDBClass::StartCompile( UserProc *pUserProc ){ 1441 pCompilingClass = pUserProc->GetParentClassPtr(); 1442 1442 if( pCompilingClass ){ 1443 pCompilingMethod = pCompilingClass->GetMethodInfo( p si);1443 pCompilingMethod = pCompilingClass->GetMethodInfo( pUserProc ); 1444 1444 if( !pCompilingMethod ){ 1445 pCompilingMethod = pCompilingClass->GetStaticMethodInfo( p si);1445 pCompilingMethod = pCompilingClass->GetStaticMethodInfo( pUserProc ); 1446 1446 if( !pCompilingMethod ){ 1447 1447 SetError(300,NULL,cp);
Note:
See TracChangeset
for help on using the changeset viewer.