Changeset 301 in dev for trunk/abdev
- Timestamp:
- Aug 23, 2007, 10:58:43 PM (17 years ago)
- Location:
- trunk/abdev
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/CParameter.cpp
r299 r301 159 159 } 160 160 161 int ParamImpl::SetParameter( const string &procName, const Parameters ¶ms, int SecondParmNum ){161 int ParamImpl::SetParameter( const string &procName, const Parameters ¶ms, int SecondParmNum, const UserProc *pUserProc ){ 162 162 if( SecondParmNum == -1 ) SecondParmNum = (int)params.size(); 163 163 … … 215 215 216 216 // 型パラメータを解決 217 ResolveFormalGenericTypeParameter( dummyType, leftType );217 ResolveFormalGenericTypeParameter( dummyType, leftType, pUserProc ); 218 218 } 219 219 -
trunk/abdev/BasicCompiler32/Compile_CallProc.cpp
r294 r301 244 244 245 245 //レジスタ、スタックフレームにセット 246 int ParmSize = pobj_parameter->SetParameter(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() );246 int ParmSize = pobj_parameter->SetParameter(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum(), pUserProc ); 247 247 248 248 if(pUserProc->ReturnType().IsStruct() ){ -
trunk/abdev/BasicCompiler32/Compile_Func.cpp
r299 r301 357 357 358 358 SetVarPtrToEax(&RelativeVar); 359 360 // TODO: 取り除く(この動きはObjPtrに託す)361 /*362 if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){363 //参照をオブジェクトポインタに変更364 365 //mov eax,dword ptr[eax]366 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );367 368 SetError(-120,NULL,cp);369 }*/370 359 } 371 360 void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn ){ -
trunk/abdev/BasicCompiler32/Compile_Var.cpp
r299 r301 726 726 } 727 727 728 Type classType( resultType ); 729 728 730 if(!_member_offset( 729 731 isErrorEnabled, 730 732 isWriteAccess, 731 resultType,733 classType, 732 734 member,pRelativeVar,resultType,0)) return false; 733 735 -
trunk/abdev/BasicCompiler32/NumOpe.cpp
r299 r301 233 233 bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool isWantObject, bool *pIsClassName, bool isProcedureCallOnly ){ 234 234 char parameter[VN_SIZE]; 235 236 if( (string)term=="a[1]")237 {238 int test=0;239 }240 235 241 236 // Withを解決 -
trunk/abdev/BasicCompiler32/Opcode.h
r299 r301 203 203 void MacroParameterSupport( const Parameters ¶ms ); 204 204 void SetStructParameter( const Type &baseType, const char *expression ); 205 int SetParameter( const string &procName, const Parameters ¶ms, int SecondParmNum = -1 );205 int SetParameter( const string &procName, const Parameters ¶ms, int SecondParmNum = -1, const UserProc *pUserProc = NULL ); 206 206 207 207 //一時オブジェクトパラメータの生成と破棄 -
trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp
r299 r301 303 303 bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName ) 304 304 { 305 if( (string)term=="a[1]")306 {307 int test=0;308 }309 305 char parameter[VN_SIZE]; 310 306 -
trunk/abdev/BasicCompiler_Common/VariableOpe.cpp
r299 r301 473 473 resultType = pMember->GetType(); 474 474 475 476 ///////////////////////////////////////////////////////// 477 // ☆★☆ ジェネリクスサポート ☆★☆ 478 479 if( resultType.IsTypeParameter() ) 480 { 481 // 型パラメータだったとき 482 483 int ptrLevel = PTR_LEVEL( resultType.GetBasicType() ); 484 485 if( classType.HasActualGenericType() ) 486 { 487 // TODO: GetDummyActualGenericTypeを適切な形に実装し直す 488 resultType = classType.GetDummyActualGenericType(); 489 } 490 else 491 { 492 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 493 resultType.SetBasicType( DEF_OBJECT ); 494 } 495 496 for( int i=0; i<ptrLevel; i++ ) 497 { 498 resultType.PtrLevelUp(); 499 } 500 } 501 502 // 503 ///////////////////////////////////////////////////////// 475 // 型パラメータを解決 476 ResolveFormalGenericTypeParameter( resultType, classType ); 504 477 505 478 … … 838 811 839 812 for(i+=2,i2=0;;i++,i2++){ 840 if(buffer[i]==' ,'||buffer[i]=='('||buffer[i]=='\0'){813 if(buffer[i]=='('||buffer[i]=='\0'){ 841 814 temporary[i2]=0; 842 815 break; … … 868 841 } 869 842 870 if( (string)temporary == "T" )871 {872 int test=0;873 }874 875 843 if( !compiler.StringToType( temporary, type ) ){ 876 844 SetError(3,temporary,cp); … … 1160 1128 continue; 1161 1129 } 1130 if( Parameter[i] == '<' && IsStr == 0 ) 1131 { 1132 if( IsGenericTypeSourcePart( Parameter + i ) ) 1133 { 1134 // ジェネリクス構文 1135 i3=GetStringInGenericBracket(temporary+i2,Parameter+i); 1136 i+=i3-1; 1137 i2+=i3-1; 1138 continue; 1139 } 1140 else 1141 { 1142 // 一般構文 1143 } 1144 } 1162 1145 if((Parameter[i]==','&&IsStr==0)|| 1163 1146 Parameter[i]=='\0'){ -
trunk/abdev/BasicCompiler_Common/include/Type.h
r299 r301 227 227 228 228 // 未完成 229 const Type &Get DummyActualGenericType() const;229 const Type &GetActualGenericType( int index ) const; 230 230 bool HasActualGenericType() const; 231 231 -
trunk/abdev/BasicCompiler_Common/src/Compiler.cpp
r299 r301 28 28 // ジェネリッククラスをインスタンス化した型の場合 29 29 int i = 0; 30 char className[VN_SIZE] , typeParameter[VN_SIZE];30 char className[VN_SIZE]; 31 31 GetIdentifierToken( className, typeName.c_str(), i ); 32 i++;33 GetIdentifierToken( typeParameter, typeName.c_str(), i );34 32 35 33 // ジェネリクスクラスを取得 36 34 const CClass *pGenericClass = this->GetObjectModule().meta.GetClasses().Find( className ); 37 35 38 // 型パラメータの型情報を取得 39 Type baseType; 40 StringToType( typeParameter, baseType ); 36 if( !pGenericClass ) 37 { 38 Jenga::Throw( "StringToType内のジェネリクスクラス取得部分でpGenericClassがNULL" ); 39 } 40 41 if( typeName[i] != '<' ) 42 { 43 Jenga::Throw( "StringToType内でジェネリクス構文の解析に失敗" ); 44 } 41 45 42 46 GenericTypes genericTypes; 43 genericTypes.push_back( GenericType( "(non support)", baseType ) ); 47 while( true ) 48 { 49 i++; 50 51 char typeParameter[VN_SIZE]; 52 GetIdentifierToken( typeParameter, typeName.c_str(), i ); 53 54 // 型パラメータの型情報を取得 55 Type baseType; 56 StringToType( typeParameter, baseType ); 57 58 genericTypes.push_back( GenericType( "(non support)", baseType ) ); 59 60 if( typeName[i] != ',' ) 61 { 62 break; 63 } 64 } 44 65 45 66 // 基本型をセット -
trunk/abdev/BasicCompiler_Common/src/Type.cpp
r299 r301 455 455 } 456 456 457 const Type &Type::Get DummyActualGenericType() const458 { 459 return actualGenericTypes[ 0].GetType();457 const Type &Type::GetActualGenericType( int index ) const 458 { 459 return actualGenericTypes[index].GetType(); 460 460 } 461 461 bool Type::HasActualGenericType() const … … 515 515 if( pClass->GetSuperClassActualTypeParameters().size() ) 516 516 { 517 // TODO: 適切な形に実装し直す(暫定的にトップの型を持ってきている) 517 518 typeParameter = pClass->GetSuperClassActualTypeParameters()[0]; 518 519 } … … 526 527 if( classType.HasActualGenericType() ) 527 528 { 528 // TODO: GetDummyActualGenericTypeを適切な形に実装し直す 529 typeParameter = classType.GetDummyActualGenericType(); 529 typeParameter = classType.GetActualGenericType( typeParameter.GetFormalTypeIndex() ); 530 530 } 531 531 else
Note:
See TracChangeset
for help on using the changeset viewer.