Changeset 290 in dev for trunk/abdev/BasicCompiler_Common/src
- Timestamp:
- Aug 21, 2007, 11:00:25 PM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler_Common/src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/src/Class.cpp
r282 r290 908 908 source[i+1]==ESC_TYPE|| 909 909 source[i+1]==ESC_INTERFACE 910 )){ 911 int nowLine; 912 nowLine=i; 910 )) 911 { 912 int nowLine = i; 913 i += 2; 914 915 Type blittableType; 916 if(memicmp(source.GetBuffer()+i,"Align(",6)==0){ 917 //アラインメント修飾子 918 i+=6; 919 i=JumpStringInPare(source.GetBuffer(),i)+1; 920 } 921 else if( memicmp( source.GetBuffer() + i, "Blittable(", 10 ) == 0 ){ 922 // Blittable修飾子 923 i+=10; 924 i+=GetStringInPare_RemovePare(temporary,source.GetBuffer()+i)+1; 925 compiler.StringToType( temporary, blittableType ); 926 } 927 928 bool isEnum = false; 929 if( source[i] == 1 && source[i+1] == ESC_ENUM ){ 930 // 列挙型の場合 931 isEnum = true; 913 932 914 933 i+=2; 915 Type blittableType; 916 if(memicmp(source.GetBuffer()+i,"Align(",6)==0){ 917 //アラインメント修飾子 918 i+=6; 919 i=JumpStringInPare(source.GetBuffer(),i)+1; 920 } 921 else if( memicmp( source.GetBuffer() + i, "Blittable(", 10 ) == 0 ){ 922 // Blittable修飾子 923 i+=10; 924 i+=GetStringInPare_RemovePare(temporary,source.GetBuffer()+i)+1; 925 compiler.StringToType( temporary, blittableType ); 926 } 927 928 bool isEnum = false; 929 if( source[i] == 1 && source[i+1] == ESC_ENUM ){ 930 // 列挙型の場合 931 isEnum = true; 932 933 i+=2; 934 } 935 936 int i2; 937 char temporary[VN_SIZE]; 938 for(i2=0;;i++,i2++){ 939 if(!IsVariableChar(source[i])){ 940 temporary[i2]=0; 941 break; 942 } 943 temporary[i2]=source[i]; 944 } 945 946 //クラスを追加 947 CClass *pClass = this->Add(namespaceScopes, importedNamespaces, temporary,nowLine); 948 if( pClass ){ 949 if( source[nowLine+1] == ESC_CLASS ){ 950 if( isEnum ){ 951 pClass->SetClassType( CClass::Enum ); 952 } 953 else{ 954 pClass->SetClassType( CClass::Class ); 955 } 956 } 957 else if( source[nowLine+1] == ESC_INTERFACE ){ 958 pClass->SetClassType( CClass::Interface ); 934 } 935 936 for(i2=0;;i++,i2++){ 937 if(!IsVariableChar(source[i])){ 938 temporary[i2]=0; 939 break; 940 } 941 temporary[i2]=source[i]; 942 } 943 944 //クラスを追加 945 CClass *pClass = this->Add(namespaceScopes, importedNamespaces, temporary,nowLine); 946 if( pClass ){ 947 if( source[nowLine+1] == ESC_CLASS ){ 948 if( isEnum ){ 949 pClass->SetClassType( CClass::Enum ); 959 950 } 960 951 else{ 961 pClass->SetClassType( CClass:: Structure);952 pClass->SetClassType( CClass::Class ); 962 953 } 963 954 } 964 965 // Blittable型の場合 966 if( !blittableType.IsNull() ){ 967 pClass->SetBlittableType( blittableType ); 968 969 // Blittable型として登録 970 compiler.GetObjectModule().meta.GetBlittableTypes().push_back( BlittableType( blittableType, pClass ) ); 971 } 955 else if( source[nowLine+1] == ESC_INTERFACE ){ 956 pClass->SetClassType( CClass::Interface ); 957 } 958 else{ 959 pClass->SetClassType( CClass::Structure ); 960 } 961 } 962 963 // Blittable型の場合 964 if( !blittableType.IsNull() ){ 965 pClass->SetBlittableType( blittableType ); 966 967 // Blittable型として登録 968 compiler.GetObjectModule().meta.GetBlittableTypes().push_back( BlittableType( blittableType, pClass ) ); 969 } 972 970 } 973 971 } … … 1266 1264 if(!pobj_c) continue; 1267 1265 1266 compiler.pCompilingClass = pobj_c; 1267 1268 1268 if(lpszInheritsClass){ 1269 1269 if( pobj_c->GetName() != lpszInheritsClass ){ … … 1277 1277 continue; 1278 1278 } 1279 1280 1281 ///////////////////////////////////////////////////////// 1282 // ☆★☆ ジェネリクスサポート ☆★☆ 1283 if( basbuf[i] == '<' ) 1284 { 1285 // 型パラメータを取得 1286 i++; 1287 GetIdentifierToken( temporary, basbuf, i ); 1288 1289 pobj_c->AddFormalGenericType( GenericType( temporary, Type(DEF_OBJECT,*GetObjectClassPtr()) ) ); 1290 1291 if( basbuf[i] == '>' ) 1292 { 1293 i++; 1294 } 1295 else 1296 { 1297 SetError(); 1298 } 1299 } 1300 ///////////////////////////////////////////////////////// 1301 1279 1302 1280 1303 pobj_c->SetFixedAlignment( iAlign ); -
trunk/abdev/BasicCompiler_Common/src/Compiler.cpp
r273 r290 19 19 bool Compiler::StringToType( const string &typeName, Type &type ){ 20 20 type.SetIndex( -1 ); 21 22 23 ///////////////////////////////////////////////////////// 24 // ☆★☆ ジェネリクスサポート ☆★☆ 25 26 if( strstr( typeName.c_str(), "<" ) ) 27 { 28 // ジェネリッククラスをインスタンス化した型の場合 29 int i = 0; 30 char className[VN_SIZE], typeParameter[VN_SIZE]; 31 GetIdentifierToken( className, typeName.c_str(), i ); 32 i++; 33 GetIdentifierToken( typeParameter, typeName.c_str(), i ); 34 35 // ジェネリクスクラスを取得 36 const CClass *pGenericClass = compiler.GetObjectModule().meta.GetClasses().Find( className ); 37 38 // 型パラメータの型情報を取得 39 Type baseType; 40 StringToType( typeParameter, baseType ); 41 42 GenericTypes genericTypes; 43 genericTypes.push_back( GenericType( "(non support)", baseType ) ); 44 45 // 基本型をセット 46 type.SetBasicType( DEF_OBJECT ); 47 48 // 拡張情報をセット 49 type.SetClassPtr( pGenericClass ); 50 type.SetActualGenericTypes( genericTypes ); 51 52 return true; 53 } 54 55 // 56 ///////////////////////////////////////////////////////// 57 21 58 22 59 if( typeName[0] == '*' ){ … … 74 111 const CClass *pobj_c = compiler.GetObjectModule().meta.GetClasses().Find( typeName ); 75 112 if(pobj_c){ 76 type.SetClassPtr( pobj_c );77 78 113 if( pobj_c->IsStructure() ){ 79 114 type.SetBasicType( DEF_STRUCT ); … … 82 117 type.SetBasicType( DEF_OBJECT ); 83 118 } 119 type.SetClassPtr( pobj_c ); 84 120 return true; 85 121 } 122 123 124 ///////////////////////////////////////////////////////// 125 // ☆★☆ ジェネリクスサポート ☆★☆ 126 127 // 型パラメータ 128 if( compiler.pCompilingClass ) 129 { 130 // クラスに属するメソッドをコンパイルしているとき 131 if( compiler.pCompilingClass->IsExistFormalGenericTypeParameter( typeName ) ) 132 { 133 // コンパイル中クラスにおけるジェネリクス用の型パラメータのとき 134 type.SetBasicType( DEF_TYPE_PARAMETER ); 135 type.SetClassPtr( compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr() ); 136 return true; 137 } 138 } 139 140 // 141 ///////////////////////////////////////////////////////// 86 142 87 143 return false; -
trunk/abdev/BasicCompiler_Common/src/LexicalScope.cpp
r288 r290 161 161 const CMethod *method = (*pVariabls)[indexSystemGC]->GetType().GetClass().GetDestructorMethod(); 162 162 if( method ){ 163 Opcode_CallProc("",&method->GetUserProc(),0,(*pVariabls)[indexSystemGC]->GetName().c_str() ,DEF_OBJECT);163 Opcode_CallProc("",&method->GetUserProc(),0,(*pVariabls)[indexSystemGC]->GetName().c_str()); 164 164 } 165 165 } -
trunk/abdev/BasicCompiler_Common/src/Source.cpp
r287 r290 815 815 816 816 // basic.sbpをインクルード 817 //const char *headCode = "#include <basic.sbp>\n";818 const char *headCode = "\n";817 const char *headCode = "#include <basic.sbp>\n"; 818 //const char *headCode = "\n"; 819 819 Realloc( length + lstrlen(headCode) ); 820 820 Text::SlideString( buffer, lstrlen(headCode) ); -
trunk/abdev/BasicCompiler_Common/src/Type.cpp
r206 r290 52 52 }; 53 53 54 Type::~Type() 55 { 56 } 57 54 58 bool Type::StringToBasicType( const string &typeName, int &basicType ){ 55 59 for( int i=0; ; i++ ){ … … 120 124 } 121 125 126 const CClass &Type::GetClass() const 127 { 128 if( !HasMember() ) 129 { 130 Jenga::Throw( "クラスまたは構造体でない型に対してGetClassを呼び出した" ); 131 } 132 133 return *pClass; 134 } 122 135 123 136 bool Type::Equals( const Type &type ) const … … 185 198 186 199 // 構造体 187 if( basicType == DEF_STRUCT ){ 200 if( IsStruct() ) 201 { 188 202 if( !pClass ){ 189 203 SmoothieException::Throw(); … … 195 209 196 210 // オブジェクト 197 if(basicType==DEF_OBJECT){ 211 if( IsObject() ) 212 { 198 213 if( GetClass().IsInterface() ){ 199 214 // vtblOffsetのサイズを含める … … 379 394 bool Type::IsObject() const 380 395 { 381 if( basicType == DEF_OBJECT ){382 return true;383 }384 return false;396 return ( 397 basicType == DEF_OBJECT 398 || IsTypeParameter() 399 ); 385 400 } 386 401 bool Type::IsObjectPtr() const … … 390 405 } 391 406 return false; 407 } 408 bool Type::IsTypeParameter() const 409 { 410 return ( basicType == DEF_TYPE_PARAMETER ); 392 411 } 393 412 bool Type::IsObjectClass() const … … 428 447 { 429 448 if( NATURAL_TYPE( basicType ) == DEF_OBJECT 430 || NATURAL_TYPE( basicType ) == DEF_STRUCT ){ 431 return true; 432 } 433 return false; 449 || NATURAL_TYPE( basicType ) == DEF_STRUCT 450 || NATURAL_TYPE( basicType ) == DEF_TYPE_PARAMETER 451 ){ 452 return true; 453 } 454 return false; 455 } 456 457 const Type &Type::GetDummyActualGenericType() const 458 { 459 return actualGenericTypes[0].GetType(); 460 } 461 bool Type::HasActualGenericType() const 462 { 463 return ( actualGenericTypes.size() > 0 ); 434 464 } 435 465
Note:
See TracChangeset
for help on using the changeset viewer.