Changeset 28 in dev for BasicCompiler_Common
- Timestamp:
- Jan 8, 2007, 6:34:44 AM (18 years ago)
- Location:
- BasicCompiler_Common
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/Class.cpp
r27 r28 25 25 char init_buf[VN_SIZE]; 26 26 char constract_parameter[VN_SIZE]; 27 if(!GetDimentionFormat(buffer,VarName,SubScripts,&TypeInfo,init_buf,constract_parameter)) 28 return; 27 GetDimentionFormat(buffer,VarName,SubScripts,&TypeInfo,init_buf,constract_parameter); 29 28 30 29 //重複チェック 31 30 if(pobj_c->DupliCheckAll(VarName)){ 32 31 SetError(15,VarName,cp); 33 return;34 32 } 35 33 36 34 if(TypeInfo.type==DEF_OBJECT){ 37 if(TypeInfo.u.pobj_Class->Is HoldAbstractFunction()){35 if(TypeInfo.u.pobj_Class->IsAbstract()){ 38 36 //抽象クラスだったとき 39 37 SetError(125,TypeInfo.u.pobj_Class->name,cp); … … 303 301 if( psi == ppobj_StaticMethod[i]->psi ) break; 304 302 } 305 if( i == i MethodNum ){303 if( i == iStaticMethodNum ){ 306 304 return NULL; 307 305 } … … 326 324 } 327 325 LONG_PTR CClass::GetVtblGlobalOffset(void){ 326 327 //既に存在する場合はそれを返す 328 328 if(vtbl_offset!=-1) return vtbl_offset; 329 330 331 ////////////////////////////////////// 332 // 存在しないときは新たに生成する 333 ////////////////////////////////////// 329 334 330 335 SUBINFO **ppsi; … … 332 337 333 338 //関数テーブルに値をセット 334 int i,i2,i3=0; 335 for(i=0;i < iMethodNum;i++){ 339 for( int i=0, i2=0; i < iMethodNum; i++ ){ 336 340 if(ppobj_Method[i]->bVirtual){ 337 for(i2=iMethodNum-1; i2>=i; i2--){ 338 if(lstrcmp(ppobj_Method[i]->psi->name,ppobj_Method[i2]->psi->name)==0){ 339 pobj_CompilingClass->ppobj_Method[i2]->psi->bUse=1; 340 341 if(ppobj_Method[i2]->bAbstract){ 342 extern int cp; 343 SetError(300,NULL,cp); 344 345 ppsi[i3]=0; 346 } 347 else ppsi[i3]=pobj_CompilingClass->ppobj_Method[i2]->psi; 348 i3++; 349 350 break; 351 } 352 } 341 ppobj_Method[i]->psi->bUse=1; 342 343 if(ppobj_Method[i]->bAbstract){ 344 extern int cp; 345 SetError(300,NULL,cp); 346 347 ppsi[i2]=0; 348 } 349 else ppsi[i2]=ppobj_Method[i]->psi; 350 i2++; 353 351 } 354 352 } … … 356 354 vtbl_offset=AddDataTable((char *)ppsi,vtbl_num*sizeof(LONG_PTR)); 357 355 358 for( i=0;i<vtbl_num;i++){356 for( int i=0; i < vtbl_num; i++ ){ 359 357 pobj_Reloc->AddSchedule_DataSection(vtbl_offset+i*sizeof(LONG_PTR)); 360 358 } … … 379 377 } 380 378 } 381 BOOL CClass::IsHoldAbstractFunction(void){379 bool CClass::IsAbstract(){ 382 380 //未実装の仮想関数を持つ場合は1を返す 383 381 384 int i,i2,i3=0; 385 for(i=0;i < iMethodNum;i++){ 382 for( int i=0; i < iMethodNum; i++ ){ 386 383 if(ppobj_Method[i]->bVirtual){ 387 for(i2=iMethodNum-1; i2>=i; i2--){ 388 if(lstrcmp(ppobj_Method[i]->psi->name,ppobj_Method[i2]->psi->name)==0){ 389 390 if(ppobj_Method[i2]->bAbstract){ 391 return 1; 392 } 393 394 break; 395 } 384 if(ppobj_Method[i]->bAbstract){ 385 return true; 396 386 } 397 387 } … … 399 389 400 390 //コンポジションの関係にあるメンバも検査する 401 for(i =0;i < iMemberNum;i++){391 for(int i=0;i < iMemberNum;i++){ 402 392 if(ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){ 403 if(ppobj_Member[i]->TypeInfo.u.pobj_Class->Is HoldAbstractFunction())404 return 1;405 } 406 } 407 408 return 0;393 if(ppobj_Member[i]->TypeInfo.u.pobj_Class->IsAbstract()) 394 return true; 395 } 396 } 397 398 return false; 409 399 } 410 400 … … 460 450 return isCompilingDestructor; 461 451 } 452 453 454 //自身と等しいクラスかどうかを確認 455 bool CClass::IsEquals( CClass *pClass ){ 456 if( this == pClass ) return true; 457 return false; 458 } 459 460 //自身の派生クラスかどうかを確認 461 bool CClass::IsSubClass( CClass *pClass ){ 462 pClass = pClass->pobj_InheritsClass; 463 while( pClass ){ 464 if( this == pClass ) return true; 465 pClass = pClass->pobj_InheritsClass; 466 } 467 return false; 468 } 469 462 470 463 471 -
BasicCompiler_Common/Class.h
r27 r28 103 103 BOOL DupliCheckMember(char *name); 104 104 105 //メソッド取得 105 106 CMethod *GetMethodInfo( SUBINFO *psi ); 106 107 CMethod *GetStaticMethodInfo( SUBINFO *psi ); 108 109 //メソッドの存在を確認 107 110 bool IsExistMethod( char *name ); 108 111 bool IsExistStaticMethod( char *name ); … … 116 119 LONG_PTR GetVtblGlobalOffset(void); 117 120 void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection); 118 BOOL IsHoldAbstractFunction(void);121 bool IsAbstract(); 119 122 120 123 … … 138 141 void NotifyFinishDestructorCompile(); 139 142 bool IsCompilingDestructor(); 143 144 145 //自身と等しいクラスかどうかを確認 146 bool IsEquals( CClass *pClass ); 147 148 //自身の派生クラスかどうかを確認 149 bool IsSubClass( CClass *pClass ); 140 150 141 151 -
BasicCompiler_Common/Overload.cpp
r5 r28 20 20 CParameter *pobj_parameter=0; 21 21 22 BOOL bStatic=0; 23 if(ObjectName[0]){ 24 if(pobj_DBClass->check(ObjectName)) bStatic=1; 22 char MethodName[VN_SIZE]; 23 if( !SplitMemberName( name, NULL, MethodName ) ) lstrcpy( MethodName, name ); 24 25 //メソッドの場合は静的かどうかを調べる 26 bool isStatic = false; 27 CClass *pClass = ppsi[0]->pobj_ParentClass; 28 if( pClass ){ 29 isStatic = pClass->IsExistStaticMethod( MethodName ); 25 30 } 26 31 27 32 char temporary[VN_SIZE]; 28 if((ObjectName[0]||ppsi[0]->pobj_ParentClass) &&bStatic==0){33 if((ObjectName[0]||ppsi[0]->pobj_ParentClass) && isStatic == false ){ 29 34 //Thisポインタ(第一パラメータ)のダミーを作成 30 35 if(Parameter[0]) sprintf(temporary,"0%c%cVoidPtr,%s",1,ESC_AS,Parameter); -
BasicCompiler_Common/Subroutine.cpp
r5 r28 64 64 } 65 65 66 void GetObjectName(char *name,char *ObjectName,int *pRefType){66 void SplitObjectName(char *name,char *ObjectName,int *pRefType){ 67 67 int i4; 68 68 for(i4=lstrlen(name)-1;i4>=0;i4--){ … … 83 83 } 84 84 } 85 bool SplitMemberName( const char *desc, char *object, char *member ){ 86 int i; 87 for(i=lstrlen(desc)-1;i>=0;i--){ 88 if(desc[i]=='.'||(desc[i]==1&&desc[i+1]==ESC_PSMEM)) 89 break; 90 } 91 if(i==-1) return false; 92 else{ 93 if(desc[i]=='.') 94 lstrcpy(member,desc+i+1); 95 else 96 lstrcpy(member,desc+i+2); 97 98 if( object ){ 99 lstrcpy( object, desc ); 100 object[i]=0; 101 } 102 } 103 104 return true; 105 } 85 106 int GetReturnTypeOfProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){ 86 107 int ret_type; … … 101 122 char ObjectName[VN_SIZE]; 102 123 int RefType; 103 GetObjectName(name,ObjectName,&RefType);124 SplitObjectName(name,ObjectName,&RefType); 104 125 105 126 … … 168 189 char ObjectName[VN_SIZE]; 169 190 int RefType; 170 GetObjectName(VarName,ObjectName,&RefType);191 SplitObjectName(VarName,ObjectName,&RefType); 171 192 172 193 //オーバーロード用の関数リストを作成 -
BasicCompiler_Common/common.h
r26 r28 545 545 int GetCallProcName(char *buffer,char *name); 546 546 int GetProc(char *name,void **ppInfo); 547 void GetObjectName(char *name,char *ObjectName,int *pRefType); 547 void SplitObjectName(char *name,char *ObjectName,int *pRefType); 548 bool SplitMemberName( const char *desc, char *object, char *member ); 548 549 int GetReturnTypeOfProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex); 549 550 BOOL GetReturnTypeOfPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo); -
BasicCompiler_Common/error.cpp
r27 r28 276 276 //一般エラーまたは警告 277 277 i2=0; //ここにブレークポイントをおく 278 279 if(num>-100){ 280 //エラーのみ 281 i2=0; 282 } 283 278 284 } 279 285 -
BasicCompiler_Common/hash.cpp
r27 r28 83 83 int i; 84 84 85 86 85 char name[VN_SIZE]; 87 86 … … 102 101 char ObjName[VN_SIZE]; //オブジェクト変数 103 102 char NestMember[VN_SIZE]; //入れ子メンバ 104 BOOL bObjectMember; 105 lstrcpy(ObjName,name); 106 for(i=lstrlen(ObjName)-1;i>=0;i--){ 107 if(ObjName[i]=='.'||(ObjName[i]==1&&ObjName[i+1]==ESC_PSMEM)) 108 break; 109 } 110 if(i==-1) bObjectMember=0; 111 else{ 112 if(ObjName[i]=='.') 113 lstrcpy(NestMember,ObjName+i+1); 114 else 115 lstrcpy(NestMember,ObjName+i+2); 116 ObjName[i]=0; 117 bObjectMember=1; 118 } 119 120 if(bObjectMember){ 103 bool isObjectMember = SplitMemberName( name, ObjName, NestMember ); 104 if( !isObjectMember ) lstrcpy(ObjName,name); 105 106 if(isObjectMember){ 121 107 //オブジェクトのメンバ関数の場合 122 108 … … 129 115 else{ 130 116 pobj_c=pobj_DBClass->check(ObjName); 131 if( ! pobj_c ){ 117 if( pobj_c ){ 118 isStatic = true; 119 } 120 else{ 132 121 //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し 133 122 int type = GetVarType(ObjName,(LONG_PTR *)&pobj_c,0); … … 136 125 } 137 126 138 // 静的メソッドから取得 139 for(i=0;i<pobj_c->iStaticMethodNum;i++){ 140 if(lstrcmp(NestMember,pobj_c->ppobj_StaticMethod[i]->psi->name)==0){ 141 ppArray_si[num]=pobj_c->ppobj_StaticMethod[i]->psi; 142 num++; 143 } 144 } 145 146 //動的メソッドから取得 147 148 //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う 149 for(i=pobj_c->iMethodNum-1;i>=0;i--){ 150 if(lstrcmp(NestMember,pobj_c->ppobj_Method[i]->psi->name)==0){ 151 ppArray_si[num]=pobj_c->ppobj_Method[i]->psi; 152 num++; 127 if( isStatic ){ 128 // 静的メソッドから取得 129 for(i=0;i<pobj_c->iStaticMethodNum;i++){ 130 if(lstrcmp(NestMember,pobj_c->ppobj_StaticMethod[i]->psi->name)==0){ 131 ppArray_si[num]=pobj_c->ppobj_StaticMethod[i]->psi; 132 num++; 133 } 134 } 135 } 136 else{ 137 //動的メソッドから取得 138 139 //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う 140 for(i=pobj_c->iMethodNum-1;i>=0;i--){ 141 if(lstrcmp(NestMember,pobj_c->ppobj_Method[i]->psi->name)==0){ 142 ppArray_si[num]=pobj_c->ppobj_Method[i]->psi; 143 num++; 144 } 153 145 } 154 146 }
Note:
See TracChangeset
for help on using the changeset viewer.