Changeset 20 in dev for BasicCompiler32
- Timestamp:
- Dec 28, 2006, 5:24:48 AM (18 years ago)
- Location:
- BasicCompiler32
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/CParameter.cpp
r11 r20 331 331 } 332 332 333 void CParameter::NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){ 334 /////////////////////////////////////////////////////// 335 // 一時オブジェクトをあらかじめスタックに積んでおく 336 /////////////////////////////////////////////////////// 337 //TODO: 64ビットコードのままなので、32ビット用に書き換える 338 339 useTempObject = false; 340 341 //一時オブジェクトの数 342 nCountOfTempObjects = 0; 343 344 BOOL bEllipse; 345 if(pi_num){ 346 if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1; 347 else bEllipse=0; 348 } 349 else bEllipse=0; 350 351 for(int i2=ParmsNum-1;i2>=0;i2--){ 352 useTempParameters[i2] = false; 353 354 if(bEllipse&&i2<=pi_num-2) bEllipse=0; 355 356 if(i2==0&&ppi[i2].name){ 357 if(lstrcmp(ppi[i2].name,"_System_LocalThis")==0){ 358 //オブジェクトメンバの第一パラメータのThisポインタ 359 continue; 360 } 361 } 362 if((i2==0||i2==1)&&ppi[i2].name){ 363 if(lstrcmp(ppi[i2].name,FuncName)==0){ 364 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト 365 continue; 366 } 367 } 368 369 TYPEINFO DummyTypeInfo; 370 BOOL bByVal; 371 if(bEllipse){ 372 DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex); 373 bByVal=1; 374 } 375 else{ 376 DummyTypeInfo.type=ppi[i2].type; 377 DummyTypeInfo.u.lpIndex=ppi[i2].u.index; 378 bByVal=ppi[i2].bByVal; 379 } 380 381 382 if( !bByVal ){ 383 //ポインタ参照 384 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){ 385 //ポインタ指定 386 continue; 387 } 388 389 LONG_PTR lpVarIndex; 390 if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){ 391 //変数ではないとき 392 int reg = REG_RAX; 393 int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 394 //↑ここでスタックに積む 395 396 useTempParameters[i2] = true; 397 useTempObject = true; 398 399 types[i2].type = type; 400 types[i2].u.lpIndex = lpVarIndex; 401 402 nCountOfTempObjects++; 403 } 404 } 405 } 406 } 407 void CParameter::DeleteTempParameters(){ 408 /////////////////////////////////////////////////////// 409 // 一時オブジェクトを破棄 410 /////////////////////////////////////////////////////// 411 //TODO: 64ビットコードのままなので、32ビット用に書き換える 412 413 if( !useTempObject ) return; 414 415 for(int i2=ParmsNum-1;i2>=0;i2--){ 416 if( useTempParameters[i2] ){ 417 //スタックフレームから取得 418 // ※関数呼び出し時も値が普遍のebxを利用する 419 op_pop(REG_EBX); 420 421 422 /////////////////////////// 423 // デストラクタを呼び出す 424 /////////////////////////// 425 426 //push ebx 427 op_push(REG_EBX); 428 429 //call destructor 430 int i5 = types[i2].u.pobj_Class->DestructorMemberSubIndex; 431 op_call( types[i2].u.pobj_Class->ppobj_Method[i5]->psi ); 432 433 434 ///////////////////////// 435 // メモリを解放する 436 ///////////////////////// 437 438 //push ebx 439 op_push(REG_EBX); 440 441 //call free 442 extern SUBINFO *pSub_free; 443 op_call(pSub_free); 444 } 445 } 446 } 447 333 448 void CParameter::SetObjectParameter(CClass *pobj_Class,LPSTR Parameter){ 334 449 int object_size; … … 441 556 int ParmSize=0; 442 557 RELATIVE_VAR RelativeVar; 558 int nCountOfNowTempObjects = 0; 443 559 for(i2=ParmsNum-1;i2>=0;i2--){ 444 560 if(bEllipse&&i2<=pi_num-2) bEllipse=0; … … 556 672 int VarType; 557 673 LONG_PTR lpVarIndex; 558 if(!GetVarOffsetReadOnly(Parms[i2],&VarType,&RelativeVar,&lpVarIndex)) continue; 559 560 if(DummyTypeInfo.type!=DEF_ANY){ 561 //型チェックを行う 562 if(DummyTypeInfo.type==VarType){ 563 if(DummyTypeInfo.type==DEF_OBJECT){ 564 if(DummyTypeInfo.u.lpIndex!=lpVarIndex){ 674 if(GetVarOffset( 675 false, 676 false, 677 Parms[i2], 678 &VarType, 679 &RelativeVar, 680 &lpVarIndex)){ 681 if(DummyTypeInfo.type!=DEF_ANY){ 682 //型チェックを行う 683 if(DummyTypeInfo.type==VarType){ 684 if(DummyTypeInfo.type==DEF_OBJECT){ 685 if(DummyTypeInfo.u.lpIndex!=lpVarIndex){ 686 SetError(11,Parms[i2],cp); 687 } 688 } 689 } 690 else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){ 691 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき 692 } 693 else{ 565 694 SetError(11,Parms[i2],cp); 566 695 } 567 696 } 568 } 569 else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){ 570 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき 571 } 572 else{ 573 SetError(11,Parms[i2],cp); 574 } 697 698 //変数アドレスをレジスタにセット 699 SetVarPtrToEax(&RelativeVar); 700 701 //push eax 702 op_push(REG_EAX); 575 703 } 576 577 //変数アドレスをレジスタにセット 578 SetVarPtrToEax(&RelativeVar); 579 580 //push eax 581 op_push(REG_EAX); 704 else{ 705 //一時オブジェクトをコピー 706 707 //mov eax, dword ptr[esp+offset] 708 op_mov_RM( 709 sizeof(long), 710 REG_EAX, 711 REG_ESP, 712 ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects - 1 ) ) * PTR_SIZE, 713 MOD_BASE_DISP32 ); 714 715 nCountOfNowTempObjects++; 716 717 //push eax 718 op_push(REG_EAX); 719 720 //VarType = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 721 } 582 722 } 583 723 -
BasicCompiler32/Compile_CallProc.cpp
r18 r20 176 176 pobj_parameter->ErrorCheck(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum); 177 177 178 //一時オブジェクトを生成 179 pobj_parameter->NewTempParameters( variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum ); 180 178 181 //レジスタ、スタックフレームにセット 179 182 pobj_parameter->SetParameter(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum); 180 183 181 //パラメータオブジェクトを破棄 182 delete pobj_parameter; 183 184 184 185 186 //////////////////////// 187 // call 188 //////////////////////// 185 189 RELATIVE_VAR RelativeVar; 186 190 LONG_PTR lp; … … 195 199 OpBuffer[obp++]=(char)0xFF; 196 200 OpBuffer[obp++]=(char)0xD0; 201 202 203 204 //一時オブジェクトを破棄 205 pobj_parameter->DeleteTempParameters(); 206 207 //パラメータオブジェクトを破棄 208 delete pobj_parameter; 197 209 198 210 if(plpIndex) *plpIndex=pi->u.ReturnIndex; … … 343 355 } 344 356 357 //一時オブジェクトを生成 358 pobj_parameter->NewTempParameters( psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum ); 359 345 360 //レジスタ、スタックフレームにセット 346 361 int ParmSize; 347 362 ParmSize=pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum); 348 349 //パラメータオブジェクトを破棄350 delete pobj_parameter;351 363 352 364 … … 469 481 } 470 482 483 //一時オブジェクトを破棄 484 pobj_parameter->DeleteTempParameters(); 485 486 //パラメータオブジェクトを破棄 487 delete pobj_parameter; 488 471 489 if(plpIndex) *plpIndex=psi->u.ReturnIndex; 472 490 -
BasicCompiler32/Compile_Var.cpp
r18 r20 760 760 } 761 761 762 763 /////////////////////////////////////// 764 // 単発式([]で囲まれていない) 765 /////////////////////////////////////// 766 767 if( type == DEF_OBJECT){ 768 //オブジェクトの場合はありえない 769 SetError(300,NULL,cp); 770 return 0; 771 } 772 762 773 if(SubScripts[0]!=-1){ 763 774 SetError(41,0,cp); … … 879 890 880 891 SetError(41,0,cp); 892 return 0; 893 } 894 895 896 /////////////////////////////////////// 897 // 単発式([]で囲まれていない) 898 /////////////////////////////////////// 899 900 if( type == DEF_OBJECT){ 901 //オブジェクトの場合はありえない 902 SetError(300,NULL,cp); 881 903 return 0; 882 904 } -
BasicCompiler32/Opcode.h
r17 r20 192 192 TYPEINFO ReturnTypeInfo; 193 193 194 //一時オブジェクト管理用 195 bool useTempObject; 196 bool useTempParameters[255]; 197 int nCountOfTempObjects; 198 194 199 public: 195 200 CParameter(char *buffer); … … 208 213 void SetObjectParameter(CClass *pobj_Class,LPSTR Parameter); 209 214 int SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum); 215 216 //一時オブジェクトパラメータの生成と破棄 217 void NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ); 218 void DeleteTempParameters(); 210 219 }; 211 220
Note:
See TracChangeset
for help on using the changeset viewer.