Changeset 299 in dev
- Timestamp:
- Aug 23, 2007, 6:17:00 PM (17 years ago)
- Location:
- trunk/abdev
- Files:
-
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/CParameter.cpp
r292 r299 214 214 bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE; 215 215 216 217 ///////////////////////////////////////////////////////// 218 // ☆★☆ ジェネリクスサポート ☆★☆ 219 220 if( dummyType.IsTypeParameter() ) 221 { 222 // 型パラメータだったとき 223 224 int ptrLevel = PTR_LEVEL( dummyType.GetBasicType() ); 225 226 if( leftType.HasActualGenericType() ) 227 { 228 // TODO: GetDummyActualGenericTypeを適切な形に実装し直す 229 dummyType = leftType.GetDummyActualGenericType(); 230 } 231 else 232 { 233 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 234 dummyType.SetBasicType( DEF_OBJECT ); 235 } 236 237 for( int i=0; i<ptrLevel; i++ ) 238 { 239 dummyType.PtrLevelUp(); 240 } 241 } 242 243 // 244 ///////////////////////////////////////////////////////// 216 // 型パラメータを解決 217 ResolveFormalGenericTypeParameter( dummyType, leftType ); 245 218 } 246 219 -
trunk/abdev/BasicCompiler32/Compile_Func.cpp
r290 r299 324 324 void Opcode_Func_SizeOf( const string &typeName ){ 325 325 Type tempType; 326 if( ! Compiler::StringToType( typeName, tempType ) ){326 if( !compiler.StringToType( typeName, tempType ) ){ 327 327 SetError(3,typeName,cp); 328 328 return; -
trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp
r294 r299 388 388 else{ 389 389 if( pUserProc->ReturnType().IsObject() ){ 390 sprintf(temporary,"%s=Nothing%c%c%s",temp,1,ESC_AS, Compiler::TypeToString( pUserProc->ReturnType() ).c_str() );390 sprintf(temporary,"%s=Nothing%c%c%s",temp,1,ESC_AS, compiler.TypeToString( pUserProc->ReturnType() ).c_str() ); 391 391 } 392 392 else{ 393 393 //戻り値用の変数の定義 394 sprintf(temporary,"%s%c%c%s",temp,1,ESC_AS, Compiler::TypeToString( pUserProc->ReturnType() ).c_str() );394 sprintf(temporary,"%s%c%c%s",temp,1,ESC_AS, compiler.TypeToString( pUserProc->ReturnType() ).c_str() ); 395 395 } 396 396 -
trunk/abdev/BasicCompiler32/Compile_Var.cpp
r292 r299 223 223 resultType = pMember->GetType(); 224 224 225 226 ///////////////////////////////////////////////////////// 227 // ☆★☆ ジェネリクスサポート ☆★☆ 228 229 if( resultType.IsTypeParameter() ) 230 { 231 // 型パラメータだったとき 232 233 int ptrLevel = PTR_LEVEL( resultType.GetBasicType() ); 234 235 if( classType.HasActualGenericType() ) 236 { 237 // TODO: GetDummyActualGenericTypeを適切な形に実装し直す 238 resultType = classType.GetDummyActualGenericType(); 239 } 240 else 241 { 242 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 243 resultType.SetBasicType( DEF_OBJECT ); 244 } 245 246 for( int i=0; i<ptrLevel; i++ ) 247 { 248 resultType.PtrLevelUp(); 249 } 250 } 251 252 // 253 ///////////////////////////////////////////////////////// 225 // 型パラメータを解決 226 ResolveFormalGenericTypeParameter( resultType, classType ); 254 227 255 228 … … 1121 1094 } 1122 1095 1123 void dim( char *VarName, const Subscripts &subscripts, Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlags){1096 void dim( char *VarName, const Subscripts &subscripts, const Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlags){ 1124 1097 if( UserProc::IsGlobalAreaCompiling() ){ 1125 1098 ///////////////////////// -
trunk/abdev/BasicCompiler32/NumOpe.cpp
r293 r299 221 221 //SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg); 222 222 223 224 ///////////////////////////////////////////////////////// 225 // ☆★☆ ジェネリクスサポート ☆★☆ 226 227 if( resultType.IsTypeParameter() ) 228 { 229 // 型パラメータだったとき 230 231 int ptrLevel = PTR_LEVEL( resultType.GetBasicType() ); 232 233 if( leftType.HasActualGenericType() ) 234 { 235 // TODO: GetDummyActualGenericTypeを適切な形に実装し直す 236 resultType = leftType.GetDummyActualGenericType(); 237 } 238 else 239 { 240 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 241 resultType.SetBasicType( DEF_OBJECT ); 242 } 243 244 for( int i=0; i<ptrLevel; i++ ) 245 { 246 resultType.PtrLevelUp(); 247 } 248 } 249 250 // 251 ///////////////////////////////////////////////////////// 223 // 型パラメータを解決 224 ResolveFormalGenericTypeParameter( resultType, leftType, pUserProc ); 252 225 } 253 226 … … 780 753 // As演算子の右辺値 781 754 //型名 782 if( Compiler::StringToType( term, resultType ) ){755 if( compiler.StringToType( term, resultType ) ){ 783 756 resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST ); 784 757 } -
trunk/abdev/BasicCompiler32/Opcode.h
r293 r299 164 164 #define DIMFLAG_STATIC 4 165 165 #define DIMFLAG_CONST 8 166 void dim( char *VarName, const Subscripts &subscripts, Type &type, const char *InitBuf,const char *ConstractParameter,DWORD dwFlags);166 void dim( char *VarName, const Subscripts &subscripts, const Type &type, const char *InitBuf,const char *ConstractParameter,DWORD dwFlags); 167 167 void SetVarPtrToEax(RELATIVE_VAR *pRelativeVar); 168 168 void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar); -
trunk/abdev/BasicCompiler32/OperatorProc.cpp
r293 r299 259 259 } 260 260 261 Opcode_CallProc(Parameter,subs[0],0,ObjectName); 262 resultType = subs[0]->ReturnType(); 263 264 265 ///////////////////////////////////////////////////////// 266 // ☆★☆ ジェネリクスサポート ☆★☆ 267 268 if( resultType.IsTypeParameter() ) 269 { 270 // 型パラメータだったとき 271 272 int ptrLevel = PTR_LEVEL( resultType.GetBasicType() ); 273 274 if( classType.HasActualGenericType() ) 275 { 276 // TODO: GetDummyActualGenericTypeを適切な形に実装し直す 277 resultType = classType.GetDummyActualGenericType(); 278 } 279 else 280 { 281 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 282 resultType.SetBasicType( DEF_OBJECT ); 283 } 284 285 for( int i=0; i<ptrLevel; i++ ) 286 { 287 resultType.PtrLevelUp(); 288 } 289 } 290 291 // 292 ///////////////////////////////////////////////////////// 293 } 261 const UserProc *pUserProc = subs[0]; 262 263 Opcode_CallProc(Parameter,pUserProc,0,ObjectName); 264 resultType = pUserProc->ReturnType(); 265 266 // 型パラメータを解決 267 ResolveFormalGenericTypeParameter( resultType, classType, pUserProc ); 268 } -
trunk/abdev/BasicCompiler32/stdafx.h
r288 r299 17 17 #include <boost/foreach.hpp> 18 18 19 #include <jenga/include/common/String.h> 20 19 21 #include "../BasicCompiler_Common/common.h" 20 22 -
trunk/abdev/BasicCompiler_Common/Compile.cpp
r296 r299 56 56 // ジェネリクスのクラス型記述を分析 57 57 /////////////////////////////////////////////////// 58 void SplitGenericClassInstance( const char *fullName, char *className, std::vector<std::string>&typeParameters )58 void SplitGenericClassInstance( const char *fullName, char *className, Jenga::Common::Strings &typeParameters ) 59 59 { 60 60 int i = 0; -
trunk/abdev/BasicCompiler_Common/MakeExe.cpp
r294 r299 155 155 compiler.staticLibraries.push_back( new ObjectModule() ); 156 156 compiler.staticLibraries.back()->Read( coreFilePath ); 157 158 Jenga::Common::Path path( coreFilePath ); 159 CompileMessage( ((string)"\"" + path.GetFileName() + path.GetExt() + "\" を読み込みました。").c_str() ); 157 160 } 158 161 -
trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp
r292 r299 389 389 resultType = pUserProc->ReturnType(); 390 390 391 ///////////////////////////////////////////////////////// 392 // ☆★☆ ジェネリクスサポート ☆★☆ 393 394 if( resultType.IsTypeParameter() ) 395 { 396 // 型パラメータだったとき 397 398 int ptrLevel = PTR_LEVEL( resultType.GetBasicType() ); 399 400 if( leftType.HasActualGenericType() ) 401 { 402 // TODO: GetDummyActualGenericTypeを適切な形に実装し直す 403 resultType = leftType.GetDummyActualGenericType(); 404 } 405 else 406 { 407 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 408 resultType.SetBasicType( DEF_OBJECT ); 409 } 410 411 for( int i=0; i<ptrLevel; i++ ) 412 { 413 resultType.PtrLevelUp(); 414 } 415 } 416 417 // 418 ///////////////////////////////////////////////////////// 391 // 型パラメータを解決 392 ResolveFormalGenericTypeParameter( resultType, leftType, pUserProc ); 419 393 420 394 return true; -
trunk/abdev/BasicCompiler_Common/Subroutine.cpp
r292 r299 232 232 GetVarType( ObjectName, leftType, false ); 233 233 234 ///////////////////////////////////////////////////////// 235 // ☆★☆ ジェネリクスサポート ☆★☆ 236 237 if( resultType.IsTypeParameter() ) 238 { 239 // 型パラメータだったとき 240 241 int ptrLevel = PTR_LEVEL( resultType.GetBasicType() ); 242 243 if( leftType.HasActualGenericType() ) 244 { 245 // TODO: GetDummyActualGenericTypeを適切な形に実装し直す 246 resultType = leftType.GetDummyActualGenericType(); 247 } 248 else 249 { 250 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 251 resultType.SetBasicType( DEF_OBJECT ); 252 } 253 254 for( int i=0; i<ptrLevel; i++ ) 255 { 256 resultType.PtrLevelUp(); 257 } 258 } 259 260 // 261 ///////////////////////////////////////////////////////// 234 // 型パラメータを解決 235 ResolveFormalGenericTypeParameter( resultType, leftType, pUserProc ); 262 236 } 263 237 … … 314 288 } 315 289 316 resultType = subs[0]->ReturnType(); 317 318 319 ///////////////////////////////////////////////////////// 320 // ☆★☆ ジェネリクスサポート ☆★☆ 321 322 if( resultType.IsTypeParameter() ) 323 { 324 // 型パラメータだったとき 325 326 int ptrLevel = PTR_LEVEL( resultType.GetBasicType() ); 327 328 if( classType.HasActualGenericType() ) 329 { 330 // TODO: GetDummyActualGenericTypeを適切な形に実装し直す 331 resultType = classType.GetDummyActualGenericType(); 332 } 333 else 334 { 335 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 336 resultType.SetBasicType( DEF_OBJECT ); 337 } 338 339 for( int i=0; i<ptrLevel; i++ ) 340 { 341 resultType.PtrLevelUp(); 342 } 343 } 344 345 // 346 ///////////////////////////////////////////////////////// 290 const UserProc *pUserProc = subs[0]; 291 292 resultType = pUserProc->ReturnType(); 293 294 295 // 型パラメータを解決 296 ResolveFormalGenericTypeParameter( resultType, classType, pUserProc ); 347 297 348 298 return true; -
trunk/abdev/BasicCompiler_Common/VariableOpe.cpp
r292 r299 868 868 } 869 869 870 if( (string)temporary == "T" ) 871 { 872 int test=0; 873 } 874 870 875 if( !compiler.StringToType( temporary, type ) ){ 871 876 SetError(3,temporary,cp); -
trunk/abdev/BasicCompiler_Common/common.h
r296 r299 375 375 void GetIdentifierToken( char *token, const char *source, int &pos ); 376 376 void GetCommandToken( char *token, const char *source, int &pos ); 377 void SplitGenericClassInstance( const char *fullName, char *className, std::vector<std::string>&typeParameters );377 void SplitGenericClassInstance( const char *fullName, char *className, Jenga::Common::Strings &typeParameters ); 378 378 int JumpStatement(const char *source, int &pos); 379 379 void DebugVariable(void); -
trunk/abdev/BasicCompiler_Common/error.cpp
r290 r299 404 404 else temporary[0]=0; 405 405 406 std::string varTypeName = Compiler::TypeToString( varType );406 std::string varTypeName = compiler.TypeToString( varType ); 407 407 if(memcmp( varTypeName.c_str(),STRING_SYSTEM_DECLAREHANDLE,lstrlen(STRING_SYSTEM_DECLAREHANDLE))==0) 408 408 { … … 410 410 } 411 411 412 std::string calcTypeName = Compiler::TypeToString( calcType );412 std::string calcTypeName = compiler.TypeToString( calcType ); 413 413 if(memcmp( calcTypeName.c_str(),STRING_SYSTEM_DECLAREHANDLE,lstrlen(STRING_SYSTEM_DECLAREHANDLE))==0) 414 414 { -
trunk/abdev/BasicCompiler_Common/include/Class.h
r293 r299 56 56 const CClass *pSuperClass; 57 57 58 // 継承クラスの型パラメータ(実パラメータ) 59 Types superClassActualTypeParameters; 60 58 61 // Blittable型情報 59 62 Type blittableType; … … 93 96 ar & BOOST_SERIALIZATION_NVP( formalGenericTypes ); 94 97 ar & boost::serialization::make_nvp( "pSuperClass", const_cast<CClass *&>(pSuperClass) ); 98 ar & BOOST_SERIALIZATION_NVP( superClassActualTypeParameters ); 95 99 ar & BOOST_SERIALIZATION_NVP( blittableType ); 96 100 //ar & BOOST_SERIALIZATION_NVP( interfaces ); … … 185 189 this->formalGenericTypes.push_back( genericType ); 186 190 } 191 int GetFormalGenericTypeParameterIndex( const std::string &name ) const 192 { 193 int i = 0; 194 BOOST_FOREACH( const GenericType &genericType, formalGenericTypes ) 195 { 196 if( genericType.GetName() == name ) 197 { 198 return i; 199 } 200 i++; 201 } 202 return -1; 203 } 187 204 bool IsExistFormalGenericTypeParameter( const std::string &name ) const 188 205 { … … 210 227 this->pSuperClass = pSuperClass; 211 228 } 229 const Types &GetSuperClassActualTypeParameters() const 230 { 231 return superClassActualTypeParameters; 232 } 233 void SetSuperClassActualTypeParameters( const Types &actualTypeParameters ) 234 { 235 this->superClassActualTypeParameters = actualTypeParameters; 236 } 212 237 213 238 // Blittable型 … … 270 295 //継承させる 271 296 bool Inherits( const char *inheritNames, int nowLine ); 272 bool InheritsClass( const CClass &inheritsClass, int nowLine );297 bool InheritsClass( const CClass &inheritsClass, const Types &actualTypeParameters, int nowLine ); 273 298 bool InheritsInterface( const CClass &inheritsClass, int nowLine ); 274 299 -
trunk/abdev/BasicCompiler_Common/include/Compiler.h
r294 r299 123 123 124 124 125 staticbool StringToType( const std::string &typeName, Type &type );126 staticconst std::string TypeToString( const Type &type );125 bool StringToType( const std::string &typeName, Type &type ); 126 const std::string TypeToString( const Type &type ); 127 127 128 128 // コンパイル中のクラス -
trunk/abdev/BasicCompiler_Common/include/Member.h
r266 r299 53 53 } 54 54 55 TypeGetType() const55 const Type &GetType() const 56 56 { 57 57 return type; 58 } 59 void ResetType( const Type &type ) 60 { 61 this->type = type; 58 62 } 59 63 -
trunk/abdev/BasicCompiler_Common/include/Type.h
r293 r299 26 26 const CClass *pClass; 27 27 }; 28 29 // ジェネリクス クラス インスタンス型の場合に使う 28 30 GenericTypes actualGenericTypes; 31 32 // 型パラメータで使う 33 std::string formalTypeName; // 型パラメータの名前 34 int formalTypeIndex; // 型パラメータの引数番号 29 35 30 36 // XMLシリアライズ用 … … 44 50 { 45 51 ar & BOOST_SERIALIZATION_NVP( index ); 52 } 53 54 if( IsTypeParameter() ) 55 { 56 ar & BOOST_SERIALIZATION_NVP( formalTypeName ); 57 ar & BOOST_SERIALIZATION_NVP( formalTypeIndex ); 46 58 } 47 59 } … … 71 83 , index( type.index ) 72 84 , actualGenericTypes( type.actualGenericTypes ) 85 , formalTypeName( type.formalTypeName ) 86 , formalTypeIndex( type.formalTypeIndex ) 73 87 { 74 88 } … … 81 95 index = type.index; 82 96 actualGenericTypes = type.actualGenericTypes; 97 formalTypeName = type.formalTypeName; 98 formalTypeIndex = type.formalTypeIndex; 83 99 } 84 100 … … 176 192 bool HasMember() const; 177 193 194 // 型パラメータの名前を取得 195 const std::string &GetFormalTypeName() const 196 { 197 if( !IsTypeParameter() ) 198 { 199 Jenga::Throw( "型パラメータでない型に対してGetFormalTypeNameメソッドが呼ばれた" ); 200 } 201 return formalTypeName; 202 } 203 void SetFormalTypeName( const std::string &formalTypeName ) 204 { 205 if( !IsTypeParameter() ) 206 { 207 Jenga::Throw( "型パラメータでない型に対してSetFormalTypeNameメソッドが呼ばれた" ); 208 } 209 this->formalTypeName = formalTypeName; 210 } 211 int GetFormalTypeIndex() const 212 { 213 if( !IsTypeParameter() ) 214 { 215 Jenga::Throw( "型パラメータでない型に対してGetFormalTypeIndexメソッドが呼ばれた" ); 216 } 217 return formalTypeIndex; 218 } 219 void SetFormalTypeIndex( int formalTypeIndex ) 220 { 221 if( !IsTypeParameter() ) 222 { 223 Jenga::Throw( "型パラメータでない型に対してSetFormalTypeIndexメソッドが呼ばれた" ); 224 } 225 this->formalTypeIndex = formalTypeIndex; 226 } 227 178 228 // 未完成 179 229 const Type &GetDummyActualGenericType() const; … … 189 239 static int GetBasicTypeFromSimpleName( const char *variable ); 190 240 }; 241 typedef std::vector<Type> Types; 242 243 void ResolveFormalGenericTypeParameter( Type &typeParameter, const Type &classType, const UserProc *pUserProc = NULL ); 191 244 192 245 class GenericType -
trunk/abdev/BasicCompiler_Common/src/BoostSerializationSupport.cpp
r288 r299 14 14 //boost libraries 15 15 #include <boost/foreach.hpp> 16 17 #include <jenga/include/common/String.h> 16 18 17 19 #include "../common.h" -
trunk/abdev/BasicCompiler_Common/src/Class.cpp
r297 r299 188 188 } 189 189 190 // ジェネリクス構文を分解 190 191 char className[VN_SIZE]; 191 std::vector<std::string> typeParameters; 192 SplitGenericClassInstance( temporary, className, typeParameters ); 192 Jenga::Common::Strings typeParameterStrings; 193 SplitGenericClassInstance( temporary, className, typeParameterStrings ); 194 195 // 型パラメータ文字列から型データを取得 196 std::vector<Type> actualTypeParameters; 197 BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings ) 198 { 199 Type type; 200 compiler.StringToType( typeParameterStr, type ); 201 actualTypeParameters.push_back( type ); 202 } 193 203 194 204 //継承元クラスを取得 … … 206 216 isInheritsClass = true; 207 217 208 if( !InheritsClass( *pInheritsClass, nowLine ) ){218 if( !InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){ 209 219 return false; 210 220 } … … 223 233 if( !isInheritsClass ){ 224 234 // クラスを一つも継承していないとき 225 if( !InheritsClass( *compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr(), nowLine ) ){235 if( !InheritsClass( *compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr(), Types(), nowLine ) ){ 226 236 return false; 227 237 } … … 241 251 242 252 char className[VN_SIZE]; 243 std::vector<std::string>typeParameters;253 Jenga::Common::Strings typeParameters; 244 254 SplitGenericClassInstance( temporary, className, typeParameters ); 245 255 … … 273 283 return true; 274 284 } 275 bool CClass::InheritsClass( const CClass &inheritsClass, int nowLine ){285 bool CClass::InheritsClass( const CClass &inheritsClass, const Types &actualTypeParameters, int nowLine ){ 276 286 277 287 //ループ継承でないかをチェック … … 300 310 } 301 311 312 // メンバのみ、型パラメータを解決する(メソッドのほうは呼び出し時に解決する) 313 if( pMember->GetType().IsTypeParameter() ) 314 { 315 pMember->ResetType( actualTypeParameters[pMember->GetType().GetFormalTypeIndex()] ); 316 } 317 302 318 dynamicMembers.push_back( pMember ); 303 319 } … … 332 348 //継承先のクラスをメンバとして保持する 333 349 SetSuperClass( &inheritsClass ); 350 SetSuperClassActualTypeParameters( actualTypeParameters ); 334 351 335 352 return true; … … 1075 1092 namespaceScopes.clear(); 1076 1093 1094 // 呼び出し元でコンパイル中のクラスポインタをバックアップ 1095 const CClass *pBackCompilingClass = compiler.pCompilingClass; 1096 1077 1097 for(i=0;;i++){ 1078 1098 if(basbuf[i]=='\0') break; … … 1162 1182 1163 1183 //継承させる 1164 if( !pobj_c->InheritsClass( *pInheritsClass, i ) ){1184 if( !pobj_c->InheritsClass( *pInheritsClass, Types(), i ) ){ 1165 1185 goto Interface_InheritsError; 1166 1186 } … … 1270 1290 1271 1291 char className[VN_SIZE]; 1272 std::vector<std::string>typeParameters;1292 Jenga::Common::Strings typeParameters; 1273 1293 SplitGenericClassInstance( temporary, className, typeParameters ); 1274 1294 … … 1476 1496 if(!MemberVar_LoopRefCheck(pobj_c->GetDynamicMembers()[pobj_c->GetDynamicMembers().size()-1]->GetType().GetClass())){ 1477 1497 //エラー回避 1478 pobj_c->GetDynamicMembers()[pobj_c->GetDynamicMembers().size()-1]->GetType().SetBasicType( DEF_PTR_VOID ); 1498 Type &type = const_cast<Type &>(pobj_c->GetDynamicMembers().back()->GetType()); 1499 type.SetBasicType( DEF_PTR_VOID ); 1479 1500 } 1480 1501 pobj_LoopRefCheck->del(pobj_c->GetName().c_str()); … … 1524 1545 } 1525 1546 1547 // 呼び出し元でコンパイル中のクラスポインタを元に戻す 1548 compiler.pCompilingClass = pBackCompilingClass; 1526 1549 1527 1550 // 名前空間を元に戻す -
trunk/abdev/BasicCompiler_Common/src/Compiler.cpp
r290 r299 34 34 35 35 // ジェネリクスクラスを取得 36 const CClass *pGenericClass = compiler.GetObjectModule().meta.GetClasses().Find( className );36 const CClass *pGenericClass = this->GetObjectModule().meta.GetClasses().Find( className ); 37 37 38 38 // 型パラメータの型情報を取得 … … 62 62 //関数ポインタ(*Function) 63 63 type.SetBasicType( DEF_PTR_PROC ); 64 type.SetIndex( compiler.GetObjectModule().meta.GetProcPointers().Add( typeName ) );64 type.SetIndex( this->GetObjectModule().meta.GetProcPointers().Add( typeName ) ); 65 65 return true; 66 66 } … … 88 88 // Object型だったとき 89 89 if( typeName == "Object" ){ 90 type.SetType( DEF_OBJECT, compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr() );90 type.SetType( DEF_OBJECT, this->GetObjectModule().meta.GetClasses().GetObjectClassPtr() ); 91 91 return true; 92 92 } … … 94 94 // String型だったとき 95 95 if( typeName == "String" ){ 96 type.SetType( DEF_OBJECT, compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr() );96 type.SetType( DEF_OBJECT, this->GetObjectModule().meta.GetClasses().GetStringClassPtr() ); 97 97 return true; 98 98 } … … 102 102 // TypeDefされた型 103 103 //////////////////// 104 int i= compiler.GetObjectModule().meta.GetTypeDefs().GetIndex( typeName );104 int i=this->GetObjectModule().meta.GetTypeDefs().GetIndex( typeName ); 105 105 if(i!=-1){ 106 type = compiler.GetObjectModule().meta.GetTypeDefs()[i].GetBaseType();106 type = this->GetObjectModule().meta.GetTypeDefs()[i].GetBaseType(); 107 107 return true; 108 108 } 109 109 110 110 //クラス 111 const CClass *pobj_c = compiler.GetObjectModule().meta.GetClasses().Find( typeName );111 const CClass *pobj_c = this->GetObjectModule().meta.GetClasses().Find( typeName ); 112 112 if(pobj_c){ 113 113 if( pobj_c->IsStructure() ){ … … 126 126 127 127 // 型パラメータ 128 if( compiler.pCompilingClass )128 if( this->pCompilingClass ) 129 129 { 130 130 // クラスに属するメソッドをコンパイルしているとき 131 if( compiler.pCompilingClass->IsExistFormalGenericTypeParameter( typeName ) ) 131 int formalTypeIndex = this->pCompilingClass->GetFormalGenericTypeParameterIndex( typeName ); 132 if( formalTypeIndex != -1 ) 132 133 { 133 134 // コンパイル中クラスにおけるジェネリクス用の型パラメータのとき 134 135 type.SetBasicType( DEF_TYPE_PARAMETER ); 135 type.SetClassPtr( compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr() ); 136 type.SetClassPtr( this->GetObjectModule().meta.GetClasses().GetObjectClassPtr() ); 137 type.SetFormalTypeName( typeName ); 138 type.SetFormalTypeIndex( formalTypeIndex ); 136 139 return true; 137 140 } … … 169 172 } 170 173 else{ 171 if( compiler.GetObjectModule().meta.GetProcPointers()[type.GetIndex()]->ReturnType().IsNull() ){174 if( this->GetObjectModule().meta.GetProcPointers()[type.GetIndex()]->ReturnType().IsNull() ){ 172 175 return "*Sub"; 173 176 } -
trunk/abdev/BasicCompiler_Common/src/Type.cpp
r292 r299 493 493 494 494 495 void ResolveFormalGenericTypeParameter( Type &typeParameter, const Type &classType, const UserProc *pUserProc ) 496 { 497 ///////////////////////////////////////////////////////// 498 // ☆★☆ ジェネリクスサポート ☆★☆ 499 500 if( typeParameter.IsTypeParameter() ) 501 { 502 // 型パラメータだったとき 503 504 // ポインタレベルを抽出 505 int ptrLevel = PTR_LEVEL( typeParameter.GetBasicType() ); 506 507 if( pUserProc ) 508 { 509 // 基底クラスでの自己解決 510 const CClass *pClass = &classType.GetClass(); 511 while( pClass->HasSuperClass() ) 512 { 513 if( pUserProc->GetParentClassPtr() == &pClass->GetSuperClass() ) 514 { 515 if( pClass->GetSuperClassActualTypeParameters().size() ) 516 { 517 typeParameter = pClass->GetSuperClassActualTypeParameters()[0]; 518 } 519 } 520 pClass = &pClass->GetSuperClass(); 521 } 522 } 523 524 if( typeParameter.IsTypeParameter() ) 525 { 526 if( classType.HasActualGenericType() ) 527 { 528 // TODO: GetDummyActualGenericTypeを適切な形に実装し直す 529 typeParameter = classType.GetDummyActualGenericType(); 530 } 531 else 532 { 533 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 534 typeParameter.SetBasicType( DEF_OBJECT ); 535 } 536 } 537 538 for( int i=0; i<ptrLevel; i++ ) 539 { 540 typeParameter.PtrLevelUp(); 541 } 542 } 543 544 // 545 ///////////////////////////////////////////////////////// 546 } 547 548 495 549 const string BlittableType::GetCreateStaticMethodFullName() const 496 550 { -
trunk/abdev/BasicCompiler_Common/src/TypeDef.cpp
r272 r299 13 13 , baseName( baseName ) 14 14 { 15 if( ! Compiler::StringToType( baseName, baseType ) ){15 if( !compiler.StringToType( baseName, baseType ) ){ 16 16 SmoothieException::Throw(3, baseName, nowLine ); 17 17 return;
Note:
See TracChangeset
for help on using the changeset viewer.