Changeset 325 in dev for trunk/abdev/BasicCompiler32/Compile_CallProc.cpp
- Timestamp:
- Sep 25, 2007, 8:56:38 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/Compile_CallProc.cpp
r320 r325 424 424 return true; 425 425 } 426 427 void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params ) 428 { 429 /////////////////////////////////////////////////////////////// 430 // _System_LocalThisのダミーをセット 431 /////////////////////////////////////////////////////////////// 432 433 char temporary[VN_SIZE]={0}; 434 if( objPtrValueStr && objPtrValueStr[0] ){ 435 //_System_LocalThis(第一パラメータ)のダミーを作成 436 lstrcpy(temporary,"0,"); 437 } 438 if( dg.ReturnType().IsStruct() ){ 439 // ※ByRef _System_ReturnValue パラメータのダミーをセット 440 lstrcat(temporary,"0,"); 441 } 442 443 if(params[0]=='\0'&&temporary[0]) 444 temporary[lstrlen(temporary)-1]=0; 445 else lstrcat(temporary,params); 446 447 448 ParamImpl *pobj_parameter = new ParamImpl( params ); 449 450 //一時オブジェクトを生成 451 pobj_parameter->NewTempParameters( dg.GetName(), dg.Params() ); 452 453 //レジスタ、スタックフレームにセット 454 int ParmSize = pobj_parameter->SetParameter( dg.GetName(), dg.Params() ); 455 456 457 if( objPtrValueStr && objPtrValueStr[0] ) 458 { 459 RELATIVE_VAR RelativeVar; 460 //Constアクセスが不可能なメソッドの場合 461 if( !GetVarOffsetReadWrite( objPtrValueStr, &RelativeVar, Type() ) ){ 462 Jenga::Throw( "Opcode_CallDelegate関数内で呼ばれるGetVarOffsetReadWrite関数に失敗" ); 463 return; 464 } 465 466 SetVarPtrToEax(&RelativeVar); 467 468 // 参照を実体ポインタにする 469 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE ); 470 471 //push ecx 472 compiler.codeGenerator.op_push(REG_ECX); 473 } 474 475 476 { 477 //////////////////////// 478 // call 479 //////////////////////// 480 RELATIVE_VAR RelativeVar; 481 GetVarOffsetReadOnly( methodPtrValueStr, &RelativeVar, Type() ); 482 SetVarPtrToEax( &RelativeVar ); 483 484 //mov eax,dword ptr[eax] 485 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE ); 486 487 //call eax 488 compiler.codeGenerator.op_call_R( REG_EAX ); 489 } 490 491 492 //一時オブジェクトを破棄 493 pobj_parameter->DeleteTempParameters(); 494 495 //パラメータオブジェクトを破棄 496 delete pobj_parameter; 497 }
Note:
See TracChangeset
for help on using the changeset viewer.