Changeset 330 in dev for trunk/abdev/BasicCompiler64/Compile_CallProc.cpp
- Timestamp:
- Sep 26, 2007, 3:00:09 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/Compile_CallProc.cpp
r325 r330 24 24 } 25 25 26 bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer) {27 26 bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer) 27 { 28 28 extern BOOL bDebugCompile; 29 29 extern BOOL bDebugSupportProc; … … 475 475 } 476 476 477 void UnsafeCall( const char *methodPtrValueStr, const char *params )477 void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params ) 478 478 { 479 /////////////////////////////////////////////////////////////// 480 // _System_LocalThisのダミーをセット 481 /////////////////////////////////////////////////////////////// 482 483 char temporary[VN_SIZE]={0}; 484 if( objPtrValueStr && objPtrValueStr[0] ){ 485 //_System_LocalThis(第一パラメータ)のダミーを作成 486 lstrcpy(temporary,"0,"); 487 } 488 if( dg.ReturnType().IsStruct() ){ 489 // ※ByRef _System_ReturnValue パラメータのダミーをセット 490 lstrcat(temporary,"0,"); 491 } 492 493 if(params[0]=='\0'&&temporary[0]) 494 temporary[lstrlen(temporary)-1]=0; 495 else lstrcat(temporary,params); 496 497 498 ParamImpl *pobj_parameter = new ParamImpl( params ); 499 500 //スタックフレームに存在する既存のパラメータをバックアップ 501 pobj_parameter->BackupParameter( (int)dg.Params().size() ); 502 503 //一時オブジェクトを生成 504 pobj_parameter->NewTempParameters( dg.GetName(), dg.Params() ); 505 506 //レジスタ、スタックフレームにセット 507 pobj_parameter->SetParameter( dg.GetName(), dg.Params() ); 508 509 510 if( objPtrValueStr && objPtrValueStr[0] ) 511 { 512 RELATIVE_VAR RelativeVar; 513 //Constアクセスが不可能なメソッドの場合 514 if( !GetVarOffsetReadWrite( objPtrValueStr, &RelativeVar, Type() ) ){ 515 Jenga::Throw( "Opcode_CallDelegate関数内で呼ばれるGetVarOffsetReadWrite関数に失敗" ); 516 return; 517 } 518 519 SetVarPtrToReg(REG_RCX,&RelativeVar); 520 521 // 参照を実体ポインタにする 522 //mov rcx,qword ptr[rcx] 523 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE); 524 } 525 526 527 { 528 //////////////////////// 529 // call 530 //////////////////////// 531 RELATIVE_VAR RelativeVar; 532 GetVarOffsetReadOnly( methodPtrValueStr, &RelativeVar, Type() ); 533 SetVarPtrToReg(REG_RAX,&RelativeVar); 534 535 //mov rax,qword ptr[rax] 536 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_RAX,0,MOD_BASE); 537 538 //call rax 539 compiler.codeGenerator.PutOld( 540 (char)0xFF, 541 (char)0xD0 542 ); 543 } 544 545 546 //レジスタのブロッキングを解除 ※パラメータセット時にロックされたレジスタ 547 pobj_BlockReg->clear(); 548 549 //一時オブジェクトを破棄 550 pobj_parameter->DeleteTempParameters(); 551 552 //スタックフレームに存在する既存のパラメータを復元 553 pobj_parameter->RestoreParameter( (int)dg.Params().size() ); 554 555 //パラメータオブジェクトを破棄 556 delete pobj_parameter; 479 557 }
Note:
See TracChangeset
for help on using the changeset viewer.