Changeset 64 in dev for BasicCompiler32/CParameter.cpp
- Timestamp:
- Mar 8, 2007, 2:49:34 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/CParameter.cpp
r63 r64 2 2 #include "opcode.h" 3 3 4 voidCParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){4 int CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){ 5 5 /////////////////////////////////////////////////////// 6 6 // 一時オブジェクトをあらかじめスタックに積んでおく 7 7 /////////////////////////////////////////////////////// 8 //TODO: 64ビットコードのままなので、32ビット用に書き換える9 8 10 9 useTempObject = false; 11 10 12 //一時 オブジェクトの数11 //一時参照の数 13 12 nCountOfTempObjects = 0; 14 13 … … 64 63 int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 65 64 //↑ここでスタックに積む 65 66 nCountOfTempObjects++; 67 68 if( type == DEF_OBJECT ){ 69 //一時参照を作成 70 71 //push esp 72 op_push( REG_ESP ); 73 74 nCountOfTempObjects++; 75 } 66 76 67 77 bool result = CheckDifferentType( … … 80 90 types[i2].u.lpIndex = lpVarIndex; 81 91 } 82 83 nCountOfTempObjects++;84 85 } 86 }92 } 93 } 94 } 95 96 return nCountOfTempObjects * PTR_SIZE; 87 97 } 98 88 99 void CParameter::DeleteTempParameters(){ 89 100 /////////////////////////////////////////////////////// 90 101 // 一時オブジェクトを破棄 91 102 /////////////////////////////////////////////////////// 92 //TODO: 64ビットコードのままなので、32ビット用に書き換える93 94 103 if( !useTempObject ) return; 95 104 96 105 for(int i2=ParmsNum-1;i2>=0;i2--){ 97 106 if( useTempParameters[i2] ){ 98 //スタックフレームから取得 99 // ※関数呼び出し時も値が普遍のebxを利用する 100 op_pop(REG_EBX); 101 102 103 /////////////////////////// 104 // デストラクタを呼び出す 105 /////////////////////////// 106 107 //push ebx 108 op_push(REG_EBX); 109 110 //call destructor 111 CMethod *method = types[i2].u.pobj_Class->GetDestructorMethod(); 112 if( method ){ 113 op_call( method->psi ); 114 } 115 116 117 ///////////////////////// 118 // メモリを解放する 119 ///////////////////////// 120 121 //push ebx 122 op_push(REG_EBX); 123 124 //call free 125 extern SUBINFO *pSub_free; 126 op_call(pSub_free); 107 if( types[i2].type == DEF_STRUCT ){ 108 // 構造体の一時メモリ 109 110 //メモリを解放する 111 112 //call free 113 extern SUBINFO *pSub_free; 114 op_call(pSub_free); 115 } 116 else if( types[i2].type == DEF_OBJECT ){ 117 op_pop( REG_NON ); 118 op_pop( REG_NON ); 119 } 120 else{ 121 SetError(300,NULL,cp); 122 } 123 127 124 } 128 125 } 129 126 } 130 127 131 void CParameter::Set ObjectParameter(CClass *pobj_Class,LPSTR Parameter){128 void CParameter::SetStructParameter(CClass *pobj_Class,LPSTR Parameter){ 132 129 int object_size = pobj_Class->GetSize(); 133 130 … … 143 140 144 141 145 TYPEINFO BaseType={DEF_ OBJECT,(LONG_PTR)pobj_Class};142 TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class}; 146 143 TYPEINFO CalcType; 147 144 CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex); 148 145 146 /* 147 TODO: 消す 149 148 if( pobj_Class->GetCopyConstructorMethod() 150 149 && CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){ … … 185 184 } 186 185 } 187 else{ 186 else{*/ 187 188 188 189 //push eax 189 190 op_push(REG_EAX); 190 191 191 192 /* 193 TODO: 消す 192 194 if( pobj_Class->GetConstructorMethod() ){ 193 195 //////////////////////////////// … … 201 203 op_call(pobj_Class->GetConstructorMethod()->psi); 202 204 } 203 204 205 TYPEINFO CalcType; 205 */ 206 206 207 BOOL bUseHeap; 207 CalcType.type=NumOpe(Parameter,DEF_ OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);208 209 210 211 Set ObjectVariable((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,bUseHeap);212 }208 CalcType.type=NumOpe(Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap); 209 210 211 212 SetStructVariable((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,bUseHeap); 213 //} 213 214 } 214 215 … … 280 281 } 281 282 282 if(DummyTypeInfo.type==DEF_ OBJECT){283 Set ObjectParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]);283 if(DummyTypeInfo.type==DEF_STRUCT){ 284 SetStructParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]); 284 285 goto next; 285 286 } … … 299 300 300 301 if(CalcType==DEF_OBJECT){ 301 //キャスト演算子のオーバーロードに対応する 302 CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex); 302 if( DummyTypeInfo.type != DEF_OBJECT 303 || 304 DummyTypeInfo.type == DEF_OBJECT && 305 !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){ 306 //キャスト演算子のオーバーロードに対応する 307 CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex); 308 } 303 309 } 304 310 … … 328 334 ParmSize+=sizeof(long)*2; 329 335 } 330 else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD|| 336 else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||DummyTypeInfo.type==DEF_OBJECT||DummyTypeInfo.type==DEF_STRUCT|| 331 337 (IsPtrType(DummyTypeInfo.type)/*&&DummyTypeInfo.type!=DEF_PTR_VOID&&DummyTypeInfo.type!=DEF_PTR_BYTE*/)){ 332 338 ChangeTypeToLong(CalcType); … … 354 360 } 355 361 else{ 356 //変数のアドレスを取得 357 int VarType; 358 LONG_PTR lpVarIndex; 359 if(GetVarOffset( 360 false, 361 false, 362 Parms[i2], 363 &VarType, 364 &RelativeVar, 365 &lpVarIndex)){ 366 if(DummyTypeInfo.type!=DEF_ANY){ 367 //型チェックを行う 368 if(DummyTypeInfo.type==VarType){ 369 if(DummyTypeInfo.type==DEF_OBJECT){ 370 if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){ 371 SetError(11,Parms[i2],cp); 372 } 373 } 374 } 375 else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){ 376 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき 377 } 378 else{ 379 SetError(11,Parms[i2],cp); 380 } 381 } 382 383 //変数アドレスをレジスタにセット 384 SetVarPtrToEax(&RelativeVar); 385 386 //push eax 387 op_push(REG_EAX); 388 } 389 else{ 362 if( useTempParameters[i2] ){ 390 363 //一時オブジェクトをコピー 364 365 if( types[i2].type == DEF_OBJECT ){ 366 // 一時参照のための領域を考慮する 367 nCountOfNowTempObjects++; 368 } 369 370 nCountOfNowTempObjects++; 391 371 392 372 //mov eax, dword ptr[esp+offset] … … 395 375 REG_EAX, 396 376 REG_ESP, 397 ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects - 1) ) * PTR_SIZE,377 ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects ) ) * PTR_SIZE, 398 378 MOD_BASE_DISP32 ); 399 400 nCountOfNowTempObjects++;401 379 402 380 //push eax 403 381 op_push(REG_EAX); 404 405 //VarType = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 382 } 383 else{ 384 //変数のアドレスを取得 385 int VarType; 386 LONG_PTR lpVarIndex; 387 if(GetVarOffset( 388 false, 389 false, 390 Parms[i2], 391 &VarType, 392 &RelativeVar, 393 &lpVarIndex)){ 394 if(DummyTypeInfo.type!=DEF_ANY){ 395 //型チェックを行う 396 if(DummyTypeInfo.type==VarType){ 397 if(DummyTypeInfo.type==DEF_OBJECT){ 398 if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){ 399 SetError(11,Parms[i2],cp); 400 } 401 } 402 else if(DummyTypeInfo.type==DEF_STRUCT){ 403 if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){ 404 SetError(11,Parms[i2],cp); 405 } 406 } 407 } 408 else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){ 409 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき 410 } 411 else{ 412 SetError(11,Parms[i2],cp); 413 } 414 } 415 416 //変数アドレスをレジスタにセット 417 SetVarPtrToEax(&RelativeVar); 418 419 //push eax 420 op_push(REG_EAX); 421 } 406 422 } 407 423 }
Note:
See TracChangeset
for help on using the changeset viewer.