- Timestamp:
- Aug 22, 2007, 3:46:23 AM (17 years ago)
- Location:
- trunk/abdev
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/CParameter.cpp
r284 r292 213 213 dummyType = *params[i2]; 214 214 bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE; 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 ///////////////////////////////////////////////////////// 215 245 } 216 246 -
trunk/abdev/BasicCompiler32/Compile_CallProc.cpp
r290 r292 104 104 const CClass *pobj_c = NULL; 105 105 const CMethod *pMethod = NULL; 106 Type leftType; 106 107 if( pUserProc->GetParentClassPtr() ){ 107 108 //クラスのメンバ関数を呼び出す場合はアクセスチェックを行う … … 118 119 { 119 120 pobj_c = &varType.GetClass(); 121 leftType = varType; 120 122 } 121 123 else … … 222 224 pobj_parameter->ApplyDefaultParameters( pUserProc->RealParams() ); 223 225 226 // 型パラメータを適用 227 pobj_parameter->SetLeftType( leftType ); 228 224 229 //エラーチェック 225 230 if( !pobj_parameter->ErrorCheck(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetSecondParmNum() ) ){ -
trunk/abdev/BasicCompiler32/Compile_Var.cpp
r290 r292 230 230 { 231 231 // 型パラメータだったとき 232 233 int ptrLevel = PTR_LEVEL( resultType.GetBasicType() ); 234 232 235 if( classType.HasActualGenericType() ) 233 236 { … … 239 242 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 240 243 resultType.SetBasicType( DEF_OBJECT ); 244 } 245 246 for( int i=0; i<ptrLevel; i++ ) 247 { 248 resultType.PtrLevelUp(); 241 249 } 242 250 } … … 436 444 pSubscripts = &pVar->GetSubscripts(); 437 445 bConst = pVar->IsConst(); 446 447 448 ///////////////////////////////////////////////////////// 449 // ☆★☆ ジェネリクスサポート ☆★☆ 450 451 if( resultType.IsTypeParameter() ) 452 { 453 // 型パラメータだったとき 454 455 int ptrLevel = PTR_LEVEL( resultType.GetBasicType() ); 456 457 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 458 resultType.SetBasicType( DEF_OBJECT ); 459 460 for( int i=0; i<ptrLevel; i++ ) 461 { 462 resultType.PtrLevelUp(); 463 } 464 } 465 466 // 467 ///////////////////////////////////////////////////////// 438 468 439 469 goto ok; -
trunk/abdev/BasicCompiler32/NumOpe.cpp
r290 r292 228 228 { 229 229 // 型パラメータだったとき 230 231 int ptrLevel = PTR_LEVEL( resultType.GetBasicType() ); 232 230 233 if( leftType.HasActualGenericType() ) 231 234 { … … 237 240 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 238 241 resultType.SetBasicType( DEF_OBJECT ); 242 } 243 244 for( int i=0; i<ptrLevel; i++ ) 245 { 246 resultType.PtrLevelUp(); 239 247 } 240 248 } … … 253 261 char parameter[VN_SIZE]; 254 262 255 if( (string)term=="a .x")263 if( (string)term=="a[1]") 256 264 { 257 265 int test=0; … … 447 455 GetArrayElement(termFull,VarName,ArrayElements); 448 456 if(ArrayElements[0]){ 449 GetVarType(VarName,resultType,false); 450 if( resultType.IsObject() ){ 451 CallIndexerGetterProc(/*UseReg,*/&resultType.GetClass(),VarName,ArrayElements,resultType); 457 Type leftType; 458 GetVarType(VarName,leftType,false); 459 if( leftType.IsObject() ) 460 { 461 CallIndexerGetterProc(/*UseReg,*/&resultType.GetClass(),VarName, leftType, ArrayElements,resultType); 452 462 453 463 isLiteral = false; -
trunk/abdev/BasicCompiler32/Opcode.h
r290 r292 175 175 int ParmsNum; 176 176 177 Type leftType; 177 178 Type returnType; 178 179 … … 186 187 ParamImpl(const Parameters ¶ms); 187 188 ~ParamImpl(); 189 void SetLeftType( const Type &type ) 190 { 191 this->leftType = type; 192 } 188 193 void SetReturnType( const Type &returnType ); 189 194 … … 222 227 int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp); 223 228 void CallCastOperatorProc(Type &calcType,BOOL bCalcUseHeap,const Type &toType); 224 void CallIndexerGetterProc(const CClass *pobj_Class,char *ObjectName, char *Parameter,Type &resultType);229 void CallIndexerGetterProc(const CClass *pobj_Class,char *ObjectName, const Type &leftType, char *Parameter,Type &resultType); 225 230 226 231 //Compile_Statement.cpp -
trunk/abdev/BasicCompiler32/OperatorProc.cpp
r290 r292 252 252 SetError(-1,"キャスト演算子がオーバーロードされていません。",cp); 253 253 } 254 void CallIndexerGetterProc(const CClass *pobj_Class,char *ObjectName, char *Parameter,Type &resultType){254 void CallIndexerGetterProc(const CClass *pobj_Class,char *ObjectName, const Type &leftType, char *Parameter,Type &resultType){ 255 255 std::vector<const UserProc *> subs; 256 256 pobj_Class->GetMethods().Enum( CALC_ARRAY_GET, subs ); … … 261 261 Opcode_CallProc(Parameter,subs[0],0,ObjectName); 262 262 resultType = subs[0]->ReturnType(); 263 } 263 264 265 ///////////////////////////////////////////////////////// 266 // ☆★☆ ジェネリクスサポート ☆★☆ 267 268 if( resultType.IsTypeParameter() ) 269 { 270 // 型パラメータだったとき 271 272 int ptrLevel = PTR_LEVEL( resultType.GetBasicType() ); 273 274 if( leftType.HasActualGenericType() ) 275 { 276 // TODO: GetDummyActualGenericTypeを適切な形に実装し直す 277 resultType = leftType.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 } -
trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp
r290 r292 301 301 } 302 302 303 bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName ){ 303 bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName ) 304 { 305 if( (string)term=="a[1]") 306 { 307 int test=0; 308 } 304 309 char parameter[VN_SIZE]; 305 310 … … 390 395 { 391 396 // 型パラメータだったとき 397 398 int ptrLevel = PTR_LEVEL( resultType.GetBasicType() ); 399 392 400 if( leftType.HasActualGenericType() ) 393 401 { … … 399 407 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 400 408 resultType.SetBasicType( DEF_OBJECT ); 409 } 410 411 for( int i=0; i<ptrLevel; i++ ) 412 { 413 resultType.PtrLevelUp(); 401 414 } 402 415 } … … 513 526 GetArrayElement(termFull,VarName,ArrayElements); 514 527 if(ArrayElements[0]){ 515 GetVarType(VarName,resultType,false); 516 if( resultType.IsObject() ){ 517 if( !GetReturnTypeOfIndexerGetterProc( resultType.GetClass(),resultType) ){ 528 Type classType; 529 GetVarType(VarName,classType,false); 530 if( classType.IsObject() ){ 531 if( !GetReturnTypeOfIndexerGetterProc( classType, resultType ) ){ 518 532 SetError(1,NULL,cp); 519 533 return false; -
trunk/abdev/BasicCompiler_Common/Subroutine.cpp
r290 r292 228 228 229 229 resultType = pUserProc->ReturnType(); 230 231 Type leftType; 232 GetVarType( ObjectName, leftType, false ); 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 ///////////////////////////////////////////////////////// 230 262 } 231 263 … … 274 306 275 307 //インデクサ(getter)の戻り値を取得 276 bool GetReturnTypeOfIndexerGetterProc( const CClass &objClass, Type &resultType ){ 308 bool GetReturnTypeOfIndexerGetterProc( const Type &classType, Type &resultType ) 309 { 277 310 vector<const UserProc *> subs; 278 objClass.GetMethods().Enum( CALC_ARRAY_GET, subs );311 classType.GetClass().GetMethods().Enum( CALC_ARRAY_GET, subs ); 279 312 if( subs.size() == 0 ){ 280 313 return false; … … 282 315 283 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 ///////////////////////////////////////////////////////// 284 347 285 348 return true; -
trunk/abdev/BasicCompiler_Common/VariableOpe.cpp
r290 r292 480 480 { 481 481 // 型パラメータだったとき 482 483 int ptrLevel = PTR_LEVEL( resultType.GetBasicType() ); 484 482 485 if( classType.HasActualGenericType() ) 483 486 { … … 489 492 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 490 493 resultType.SetBasicType( DEF_OBJECT ); 494 } 495 496 for( int i=0; i<ptrLevel; i++ ) 497 { 498 resultType.PtrLevelUp(); 491 499 } 492 500 } -
trunk/abdev/BasicCompiler_Common/common.h
r290 r292 356 356 bool CallPropertyMethod( const char *variable, const char *rightSide, Type &resultType); 357 357 bool GetReturnTypeOfPropertyMethod( const char *variable, const char *rightSide, Type &resultType ); 358 bool GetReturnTypeOfIndexerGetterProc( const CClass &objClass, Type &resultType );358 bool GetReturnTypeOfIndexerGetterProc( const Type &classType, Type &resultType ); 359 359 int AddProcPtrInfo( const string &typeExpression, int nowLine ); 360 360 bool IsNeedProcCompile(); -
trunk/abdev/BasicCompiler_Common/src/Type.cpp
r290 r292 408 408 bool Type::IsTypeParameter() const 409 409 { 410 return ( basicType== DEF_TYPE_PARAMETER );410 return ( NATURAL_TYPE(basicType) == DEF_TYPE_PARAMETER ); 411 411 } 412 412 bool Type::IsObjectClass() const
Note:
See TracChangeset
for help on using the changeset viewer.