Changeset 292 in dev for trunk/abdev/BasicCompiler32
- Timestamp:
- Aug 22, 2007, 3:46:23 AM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler32
- Files:
-
- 6 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 }
Note:
See TracChangeset
for help on using the changeset viewer.