Changeset 339 in dev for trunk/abdev/BasicCompiler64
- Timestamp:
- Oct 3, 2007, 3:42:05 AM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler64
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/Compile_CallProc.cpp
r330 r339 198 198 return false; 199 199 } 200 if( pMethod->IsProtected() ){200 if( !pMethod->GetUserProc().GetParentClass().IsEqualsOrSubClass( pobj_c ) && pMethod->IsProtected() ){ 201 201 SetError(110,pUserProc->GetName(),cp); 202 202 return false; … … 477 477 void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params ) 478 478 { 479 extern BOOL bDebugCompile; 480 extern BOOL bDebugSupportProc; 481 if(bDebugCompile&&bDebugSupportProc==0) 482 Call_DebugSys_SaveContext(); 483 484 479 485 /////////////////////////////////////////////////////////////// 480 486 // _System_LocalThisのダミーをセット … … 482 488 483 489 char temporary[VN_SIZE]={0}; 490 bool isDynamicCall = false; 484 491 if( objPtrValueStr && objPtrValueStr[0] ){ 485 492 //_System_LocalThis(第一パラメータ)のダミーを作成 486 493 lstrcpy(temporary,"0,"); 494 495 isDynamicCall = true; 487 496 } 488 497 if( dg.ReturnType().IsStruct() ){ … … 495 504 else lstrcat(temporary,params); 496 505 497 498 ParamImpl *pobj_parameter = new ParamImpl( params ); 506 const Parameters *pParams = &dg.Params(); 507 if( isDynamicCall ) 508 { 509 pParams = &dg.GetDynamicParams(); 510 } 511 512 513 ParamImpl *pobj_parameter = new ParamImpl( temporary ); 499 514 500 515 //スタックフレームに存在する既存のパラメータをバックアップ 501 pobj_parameter->BackupParameter( (int) dg.Params().size() );516 pobj_parameter->BackupParameter( (int)pParams->size() ); 502 517 503 518 //一時オブジェクトを生成 504 pobj_parameter->NewTempParameters( dg.GetName(), dg.Params());519 pobj_parameter->NewTempParameters( dg.GetName(), *pParams ); 505 520 506 521 //レジスタ、スタックフレームにセット 507 pobj_parameter->SetParameter( dg.GetName(), dg.Params());522 pobj_parameter->SetParameter( dg.GetName(), *pParams ); 508 523 509 524 … … 551 566 552 567 //スタックフレームに存在する既存のパラメータを復元 553 pobj_parameter->RestoreParameter( (int) dg.Params().size() );568 pobj_parameter->RestoreParameter( (int)pParams->size() ); 554 569 555 570 //パラメータオブジェクトを破棄 -
trunk/abdev/BasicCompiler64/Compile_Func.cpp
r331 r339 70 70 return; 71 71 } 72 void Opcode_Func_AddressOf( const char *name, const Type &baseType ){ 73 extern int cp; 74 const UserProc *pUserProc; 75 76 if( baseType.IsProcPtr() ) 77 { 78 //左辺の型にのっとり、オーバーロードを解決 79 80 std::vector<const UserProc *> subs; 81 GetOverloadSubHash( name, subs ); 82 if( subs.size() == 0 ){ 83 SetError(27,name,cp); 84 return; 85 } 86 87 //オーバーロードを解決 88 pUserProc=OverloadSolution(name,subs,compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params(), Type() ); 89 90 if(!pUserProc){ 91 SetError(27,name,cp); 92 return; 93 } 94 } 95 else{ 96 pUserProc=GetSubHash(name); 97 if(!pUserProc){ 98 SetError(27,name,cp); 99 return; 100 } 101 } 102 103 if( pUserProc->IsVirtual() ){ 72 73 void _Opcode_Func_AddressOf( const char *methodInstanceName, const UserProc &userProc ) 74 { 75 if( userProc.IsVirtual() ) 76 { 104 77 /////////////////////////////// 105 78 // 仮想関数の場合 … … 111 84 char ObjectName[VN_SIZE]; 112 85 ReferenceKind referenceKind; 113 SplitObjectName( name,ObjectName, referenceKind );86 SplitObjectName(methodInstanceName,ObjectName, referenceKind ); 114 87 115 88 if(ObjectName[0]){ … … 151 124 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE); 152 125 153 int i2 = pobj_c->GetFuncNumInVtbl( pUserProc );126 int i2 = pobj_c->GetFuncNumInVtbl( &userProc ); 154 127 155 128 //mov rax,qword ptr[r11+func_index] … … 165 138 166 139 //mov rax,ProcAddr 167 compiler.codeGenerator.op_addressof( REG_RAX, pUserProc ); 168 } 169 170 pUserProc->Using(); 140 compiler.codeGenerator.op_addressof( REG_RAX, &userProc ); 141 } 142 143 userProc.Using(); 144 } 145 void Opcode_CreateDelegate( const CClass &dgClass, const char *methodInstanceName, const UserProc &userProc ) 146 { 147 ///////////////////////////////////////////////////////////////// 148 // 関数ポインタをpush 149 ///////////////////////////////////////////////////////////////// 150 151 //mov rax,AddressOf 152 _Opcode_Func_AddressOf( methodInstanceName, userProc ); 153 154 155 if( userProc.GetMethod().IsDynamic() ) 156 { 157 //mov rdx,rax 158 compiler.codeGenerator.op_mov_RR( REG_RDX, REG_RAX ); 159 160 pobj_BlockReg->lock( REG_RDX ); 161 162 163 ///////////////////////////////////////////////////////////////// 164 // オブジェクト ポインタをpush 165 ///////////////////////////////////////////////////////////////// 166 167 // オブジェクト名を取得 168 char objectName[VN_SIZE]; 169 char memberName[VN_SIZE]; 170 char *thisPtrName = "This"; 171 Type type; 172 if( SplitMemberName( methodInstanceName, objectName, memberName ) ) 173 { 174 if( GetVarType( objectName, type, false ) ) 175 { 176 thisPtrName = objectName; 177 } 178 } 179 180 // オブジェクト ポインタを取得 181 RELATIVE_VAR relativeVar; 182 GetVarOffsetReadOnly( thisPtrName, &relativeVar, type ); 183 if( !type.IsObject() ) 184 { 185 extern int cp; 186 SetError(1,NULL,cp); 187 return; 188 } 189 190 SetVarPtrToReg( REG_RAX, &relativeVar ); 191 192 //mov rcx,dword ptr[rax] 193 compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_RCX, REG_RAX, 0, MOD_BASE ); 194 195 pobj_BlockReg->unlock( REG_RDX ); 196 } 197 else 198 { 199 //mov rcx,rax 200 compiler.codeGenerator.op_mov_RR( REG_RCX, REG_RAX ); 201 } 202 203 204 ///////////////////////////////////////////////////////////////// 205 // call _CreateDynamicDelegate/_CreateStaticDelegate 206 ///////////////////////////////////////////////////////////////// 207 208 std::vector<const UserProc *> subs; 209 if( userProc.GetMethod().IsDynamic() ) 210 { 211 dgClass.GetStaticMethods().Enum( "_CreateDynamicDelegate", subs ); 212 } 213 else 214 { 215 dgClass.GetStaticMethods().Enum( "_CreateStaticDelegate", subs ); 216 } 217 218 // call _CreateDynamicDelegate 219 compiler.codeGenerator.op_call( subs[0] ); 220 } 221 void Opcode_Func_AddressOf( const char *name, const Type &baseType, bool isCallOn, Type &resultType ) 222 { 223 extern int cp; 224 const UserProc *pUserProc; 225 226 const Parameters *pBaseParams = NULL; 227 if( baseType.IsProcPtr() ) 228 { 229 // 左辺で関数ポインタを要求されているとき 230 pBaseParams = &compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params(); 231 } 232 else if( baseType.IsDelegate() ) 233 { 234 // 左辺でデリゲートを要求されているとき 235 pBaseParams = &baseType.GetClass().GetDelegate().Params(); 236 } 237 238 if( pBaseParams ) 239 { 240 //左辺の型にのっとり、オーバーロードを解決 241 242 std::vector<const UserProc *> subs; 243 GetOverloadSubHash( name, subs ); 244 if( subs.size() == 0 ){ 245 SetError(27,name,cp); 246 return; 247 } 248 249 //オーバーロードを解決 250 pUserProc=OverloadSolution( name, subs, *pBaseParams, Type() ); 251 252 if( isCallOn && baseType.IsDelegate() ) 253 { 254 // コード生成を伴う場合はエラーチェックを行う 255 if( !pUserProc->Params().Equals( *pBaseParams ) 256 || !pUserProc->ReturnType().Equals( baseType.GetClass().GetDelegate().ReturnType() ) ) 257 { 258 if( baseType.IsDelegate() ) 259 { 260 SetError(67, name, cp ); 261 } 262 else 263 { 264 SetError(66, name, cp ); 265 } 266 } 267 } 268 269 if(!pUserProc){ 270 SetError(27,name,cp); 271 return; 272 } 273 } 274 else{ 275 pUserProc=GetSubHash(name); 276 if(!pUserProc){ 277 SetError(27,name,cp); 278 return; 279 } 280 } 281 282 if( baseType.IsDelegate() ) 283 { 284 if( isCallOn ) 285 { 286 // デリゲートのとき 287 Opcode_CreateDelegate( baseType.GetClass(), name, *pUserProc ); 288 } 289 resultType = baseType; 290 } 291 else 292 { 293 if( isCallOn ) 294 { 295 // 関数ポインタのとき 296 _Opcode_Func_AddressOf( name, *pUserProc ); 297 } 298 resultType.SetBasicType( DEF_PTR_VOID ); 299 } 171 300 } 172 301 void Opcode_Func_SizeOf( const string &typeName ){ … … 262 391 i = GetOneParameter( paramsStr, i, methodPtrParamStr ); 263 392 264 char objPtrValueStr[VN_SIZE] ;393 char objPtrValueStr[VN_SIZE] = ""; 265 394 if( isDynamicCall ) 266 395 { … … 307 436 break; 308 437 case FUNC_ADDRESSOF: 309 if( isCallOn ) Opcode_Func_AddressOf( Parameter, baseType ); 310 resultType.SetBasicType( DEF_PTR_VOID ); 438 Opcode_Func_AddressOf( Parameter, baseType, isCallOn, resultType ); 311 439 break; 312 440 case FUNC_SIZEOF: -
trunk/abdev/BasicCompiler64/Compile_Var.cpp
r317 r339 277 277 if(!GetArrayOffset(pMember->GetSubscripts(),array,pMember->GetType())){ 278 278 if(isErrorEnabled) SetError(14,member,cp); 279 return false; 279 280 } 280 281 } -
trunk/abdev/BasicCompiler64/NumOpe.cpp
r331 r339 135 135 const CClass &objClass = leftType.GetClass(); 136 136 137 int UseReg=pobj_reg->GetNextReg(); 138 int XmmReg=pobj_reg->GetNextXmmReg(); 139 140 137 const int useReg=pobj_reg->GetNextReg(); 138 const int xmmReg=pobj_reg->GetNextXmmReg(); 139 140 141 //////////////////////////////// 142 // インデクサ(getアクセサ) 143 //////////////////////////////// 144 char VarName[VN_SIZE],ArrayElements[VN_SIZE]; 145 GetArrayElement(member,VarName,ArrayElements); 146 if(ArrayElements[0]){ 147 Type classType; 148 GetMemberType( leftType, VarName, classType, 0, false ); 149 if( classType.IsObject() ) 150 { 151 //オブジェクトポインタをr11にコピー 152 compiler.codeGenerator.op_mov_RR( REG_R11, useReg ); 153 154 RELATIVE_VAR relativeVar; 155 relativeVar.dwKind=VAR_DIRECTMEM; 156 157 if( !_member_offset( 158 true, //エラー表示あり 159 false, //読み込み専用 160 leftType, 161 VarName,&relativeVar,classType,0)) 162 { 163 return false; 164 } 165 166 // オブジェクトメンバのポインタをraxにコピー 167 if( !VarToReg( relativeVar, baseType, resultType ) ){ 168 SetError(11,termFull,cp); 169 } 170 171 ////////////////////////////////////////////////////// 172 ///// レジスタ資源のバックアップ 173 { BACKUP_REGISTER_RESOURCE 174 ////////////////////////////////////////////////////// 175 176 //オブジェクトポインタをスタックに入れておく 177 //mov qword ptr[rsp+offset],reg ※スタックフレームを利用 178 pobj_sf->push( useReg ); 179 180 char objectFullName[VN_SIZE], dummyArrayElements[VN_SIZE]; 181 GetArrayElement(termFull,objectFullName,dummyArrayElements); 182 183 CallIndexerGetterProc(useReg,classType,objectFullName, ArrayElements,resultType, PROCFLAG_NEW ); 184 185 pobj_sf->pop(); 186 187 ///////////////////////////////////////////// 188 ////// レジスタ資源を復元 189 RESTORE_REGISTER_RESOURCE 190 }//////////////////////////////////////////// 191 192 return true; 193 } 194 } 195 196 197 /////////////////////////////////////////////////////////////////// 198 // メンバを検索 199 /////////////////////////////////////////////////////////////////// 141 200 if( GetMemberType( leftType, member, resultType, 0, false ) ){ 142 201 // メンバが見つかったとき 143 202 144 203 //オブジェクトポインタをr11にコピー 145 compiler.codeGenerator.op_mov_RR( REG_R11, UseReg );204 compiler.codeGenerator.op_mov_RR( REG_R11, useReg ); 146 205 147 206 RELATIVE_VAR relativeVar; … … 191 250 //オブジェクトポインタをスタックに入れておく 192 251 //mov qword ptr[rsp+offset],reg ※スタックフレームを利用 193 pobj_sf->push( UseReg );252 pobj_sf->push( useReg ); 194 253 195 254 if( !Opcode_CallProc(parameter,pUserProc,PROCFLAG_NEW,termLeft ) ){ … … 217 276 } 218 277 219 SetUseRegFromRax(resultType.GetBasicType(), UseReg,XmmReg);278 SetUseRegFromRax(resultType.GetBasicType(),useReg,xmmReg); 220 279 221 280 // 型パラメータを解決 -
trunk/abdev/BasicCompiler64/Opcode.h
r331 r339 340 340 int CallOperatorProc(BYTE idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp); 341 341 void CallCastOperatorProc(int reg,Type &calcType,BOOL bCalcUseHeap,const Type &toType); 342 void CallIndexerGetterProc(int reg, const Type &classType, c har *ObjectName,char *Parameter,Type &resultType);342 void CallIndexerGetterProc(int reg, const Type &classType, const char *ObjectName,char *Parameter,Type &resultType, DWORD dwProcFlags = 0 ); 343 343 344 344 //Compile_Statement.cpp -
trunk/abdev/BasicCompiler64/OperatorProc.cpp
r316 r339 321 321 322 322 //インデクサ(getter)を呼び出す 323 void CallIndexerGetterProc(int reg, const Type &classType, c har *ObjectName,char *Parameter,Type &resultType){323 void CallIndexerGetterProc(int reg, const Type &classType, const char *ObjectName,char *Parameter,Type &resultType, DWORD dwProcFlags ){ 324 324 325 325 std::vector<const UserProc *> subs; … … 336 336 ////////////////////////////////////////////////////// 337 337 338 Opcode_CallProc(Parameter,pUserProc, 0,ObjectName);338 Opcode_CallProc(Parameter,pUserProc,dwProcFlags,ObjectName); 339 339 resultType = pUserProc->ReturnType(); 340 340
Note:
See TracChangeset
for help on using the changeset viewer.